2016-07-06 56 views
1

カスタムPCIeボードをターゲットにするためにkmdfドライバを作成しようとしています。マイクロソフトが提供する既定のプロジェクトに続いて、私は文字列の名前を変更し、PCIeボードのハードウェアIDを提供することで、.infファイルを少し変更しました。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 

を実行することによって提起された。しかし、それは働くことはありません後にログをダンプしようとしました。私は「CIPDriverは」私のドライバをある

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 

下に示すように、すべてのシンボルパスは、正しくロードされていることを確実にしました。

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. 

そしてC .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 

の出力:\ winsymbolsは私がで取得したMicrosoftののシンボルのキャッシュですhttps://msdn.microsoft.com/en-us/library/windows/hardware/ff558829(v=vs.85).aspx

私の2番目の質問は、ログをダンプするようにデバッガを正しく設定する方法です。

おかげ

答えて

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

ええ、しかし、私は2014年にマイクロソフト側にアップロードされているように見えるWDK 8.1をインストールしました。私は0の値がメモリ割り当てに渡されていたと考えています。 "handleapi"ファイルのWDK(https://github.com/Microsoft/Windows-Driver-Frameworks)のソースコードを確認する場合は、cpp "には、" size "のパラメータが渡されるFxObjectHandleAllocという関数があります。コンパイラによってサイズが渡されたことを示すコメントがあります。fxobject.hpp内の関数マクロでオーバーロードされたnew演算子を使用します。 – shaboinkin

+0

私は、デバッガを掘り下げて、これが本当に問題であることを確かめるための変更は一度もありませんでした。しかし、FxObjectHandleAlloc内の他の失敗点のうち、私が見ることができる唯一の場所でしたその関数では、FxPoolAllocateWithTagが呼び出され、wxfpool.cpp内のFxPoolAllocatorが呼び出されます。サイズは== 0で失敗します。また、これらのRtl *関数の出力で失敗します。何らかの理由でコンパイラを0にすることは、私が考えることができる唯一のことではありません。 – shaboinkin

関連する問題