我正在嘗試編寫一個kmdf驅動程序來定位自定義PCIe板。在遵循Microsoft提供的默認項目之後,我對.inf文件進行了一些小修改,主要是更改字符串的名稱並提供我們的PCIe板卡的硬件ID。KMDF WdfDriverCreate函數返回「資源不足」
部署驅動程序的工作原理應該如此。驅動程序安裝並顯示在設備管理器上,但它表示它沒有正確安裝或可能已損壞。
在調試時,我看到WdfDriverCreate失敗,錯誤爲0xC000009A,這意味着資源不足。
以供參考,這是生成的代碼,該KMDF模板項目讓你,這是我目前正在運行:
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
WDF_DRIVER_CONFIG config;
NTSTATUS status;
WDF_OBJECT_ATTRIBUTES attributes;
//
// Initialize WPP Tracing
//
WPP_INIT_TRACING(DriverObject, RegistryPath);
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry");
//
// Register a cleanup callback so that we can call WPP_CLEANUP when
// the framework driver object is deleted during driver unload.
//
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT);
attributes.EvtCleanupCallback = CIPDriverEvtDriverContextCleanup;
WDF_DRIVER_CONFIG_INIT(&config,
CIPDriverEvtDeviceAdd
);
KdPrint(("CIP: Driver Entry\n"));
status = WdfDriverCreate(DriverObject,
RegistryPath,
&attributes,
&config,
WDF_NO_HANDLE
);
if (!NT_SUCCESS(status)) {
TraceEvents(TRACE_LEVEL_ERROR, TRACE_DRIVER, "WdfDriverCreate failed %!STATUS!", status);
KdPrint(("CIP: WdfDriverCreate failed with status - 0x%x\n", status));
WPP_CLEANUP(DriverObject);
return status;
}
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Exit");
return status;
}
我的第一個問題是,什麼會導致此?
我試圖轉儲錯誤日誌將被運行
!wdfkd.wdflogdump mydriver.sys
提出,但它永遠不會奏效了。我確保所有符號路徑加載正確,如下所示
fffff880`05fdd000 fffff880`05fe6000 CIPDriver (private pdb symbols) C:\Users\jimmyjoebobby\Documents\Visual Studio 2013\Projects\CIPDriver\x64\Win7Debug\CIPDriver.pdb
22: kd> lm m wdf*
start end module name
fffff880`00e5e000 fffff880`00f20000 Wdf01000 (pdb symbols) c:\winsymbols\Wdf01000.pdb\03FC6AA4329F4372BE924775887225632\Wdf01000.pdb
fffff880`00f20000 fffff880`00f30000 WDFLDR (pdb symbols) c:\winsymbols\wdfldr.pdb\9674B20D2E5B4E7AA2DE143F642A176E2\wdfldr.pdb
其中「CIPDriver」是我的驅動程序。
在運行dump命令,這是輸出:
22: kd> !wdfkd.wdflogdump CIPDriver.sys
Trace searchpath is:
Trace format prefix is: %7!u!: %!FUNC! -
TMF file used for formatting log is: C:\WinDDK\7600.16385.1\tools\tracing\amd64\wdf01000.tmf
Log at fffffa80356232f8
Gather log: Please wait, this may take a moment (reading 0 bytes).
% read so far ...
warn: The log could not be accessed
hint: Are the symbols the WDF library available?
hint: The log is inaccessable after driver unload.
和.sympath
22: kd> .sympath
Symbol search path is: C:\Users\jimmyjoebobby\Documents\Visual Studio 2013\Projects\CIPDriver\Win7Debug;C:\winsymbols
Expanded Symbol search path is: c:\users\jimmyjoebobby\documents\visual studio 2013\projects\cipdriver\win7debug;c:\winsymbols
的輸出,其中C:\ winsymbols是我收購了微軟的符號的高速緩存以下指南在這裏:https://msdn.microsoft.com/en-us/library/windows/hardware/ff558829(v=vs.85).aspx
我的第二個問題是,我如何正確設置調試器來轉儲出日誌?
感謝
我可以證實這一點解決了我的問題。 @shaboinkin最近是否安裝了WDK?我在上週做到了。也許最近發佈的版本中有一個錯誤?我試圖弄清楚根本原因,這似乎很可能。 – Warty
是的,但我安裝了WDK 8.1,它在2014年似乎已經上傳到微軟的那一方。我相信0的值被傳遞到內存分配中,從而導致失敗。 如果您在文件「handleapi」中檢查WDK的源代碼(https://github.com/Microsoft/Windows-Driver-Frameworks)。cpp「中,有一個名爲FxObjectHandleAlloc的函數,它傳遞了一個」size「參數。有一個評論提到編譯器傳入的大小,它在fxobject.hpp中的函數宏中使用了一個重載的new運算符 – shaboinkin
我從來沒有通過調試器進行修改來驗證這確實是問題,因爲它需要很長的時間才能完成設置,但FxObjectHandleAlloc內部的其他故障點是唯一可以看到的地方它失敗了,在該函數中調用它,FxPoolAllocateWithTag最終調用wdfpool.cpp中的FxPoolAllocator,該函數在大小== 0時失敗,或者在這些Rtl *函數的輸出中失敗,這些函數我無法查看無論出於何種原因,讓編譯器傳入0是我唯一能想到的事情將使它失敗。 – shaboinkin