2016-07-06 94 views
1

我正在嘗試編寫一個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

我的第二個問題是,我如何正確設置調試器來轉儲出日誌?

感謝

回答

1

我不明白爲什麼這會有所幫助,但如果我

[DriverName] Package -> Properties -> Configuration Properties -> Driver Install -> KMDF Verifier -> Enable KMDF Verifier 

下關閉KMDF驗證和部署的驅動程序,它的工作原理。如果我打開它,它會失敗。我部署了幾次驅動程序來打開和關閉該選項,打開時它總是失敗。

我發佈了這個問題以及我的發現。也許有人可以回答爲什麼這樣的情況:https://www.osronline.com/showthread.cfm?link=277793

+0

我可以證實這一點解決了我的問題。 @shaboinkin最近是否安裝了WDK?我在上週做到了。也許最近發佈的版本中有一個錯誤?我試圖弄清楚根本原因,這似乎很可能。 – Warty

+0

是的,但我安裝了WDK 8.1,它在2014年似乎已經上傳到微軟的那一方。我相信0的值被傳遞到內存分配中,從而導致失敗。 如果您在文件「handleapi」中檢查WDK的源代碼(https://github.com/Microsoft/Windows-Driver-Frameworks)。cpp「中,有一個名爲FxObjectHandleAlloc的函數,它傳遞了一個」size「參數。有一個評論提到編譯器傳入的大小,它在fxobject.hpp中的函數宏中使用了一個重載的new運算符 – shaboinkin

+0

我從來沒有通過調試器進行修改來驗證這確實是問題,因爲它需要很長的時間才能完成設置,但FxObjectHandleAlloc內部的其他故障點是唯一可以看到的地方它失敗了,在該函數中調用它,FxPoolAllocateWithTag最終調用wdfpool.cpp中的FxPoolAllocator,該函數在大小== 0時失敗,或者在這些Rtl *函數的輸出中失敗,這些函數我無法查看無論出於何種原因,讓編譯器傳入0是我唯一能想到的事情將使它失敗。 – shaboinkin