2016-07-06 8 views
1

Ich versuche, einen kmdf-Treiber zu schreiben, um ein benutzerdefiniertes PCIe-Board anzusprechen. Nachdem ich das von Microsoft bereitgestellte Standardprojekt verfolgt hatte, habe ich ein paar kleinere Änderungen an der INF-Datei vorgenommen, wobei ich hauptsächlich die Namen der Strings änderte und die Hardware-ID unserer PCIe-Karte zur Verfügung stellte.KMDF WdfDriverCreate Funktion gibt "ungenügende Ressourcen" zurück

Die Bereitstellung des Treibers funktioniert ordnungsgemäß. Der Treiber wird auf dem Gerätemanager installiert und angezeigt, besagt jedoch, dass er nicht ordnungsgemäß installiert wurde oder beschädigt ist.

Beim Debuggen sehe ich, dass WdfDriverCreate mit einem Fehler von 0xC000009A fehlschlägt, was unzureichende Ressourcen bedeutet.

Als Referenz dies der generierte Code ist, dass die KMDF Vorlage Projekt für Sie macht, das ist, was ich gerade läuft:

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; 
} 

Meine erste Frage ist, was würde dazu führen, das?

ich versuchte, ein Protokoll zu entleeren, nachdem der Fehler durch Ausführen

!wdfkd.wdflogdump mydriver.sys 

angehoben Aber es funktioniert nie. Ich sorgte dafür, dass alle Symbolpfade richtig geladen werden, wie weiter unten

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 

gezeigt, wo „CIPDriver“ meinen Fahrer ist.

Auf den Dump-Befehl ausgeführt wird, ist dies die Ausgabe:

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. 

Und die Ausgabe von .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 

Wo C: \ winsymbols ist ein Cache von Microsofts die Symbole, die ich erworben durch Befolgen Sie die Anleitung hier: https://msdn.microsoft.com/en-us/library/windows/hardware/ff558829(v=vs.85).aspx

Meine zweite Frage ist, wie kann ich den Debugger richtig einrichten, um die Protokolle auszugeben?

Dank

Antwort

1

Ich verstehe nicht ganz, warum das hilft, aber wenn ich weg Verifizierer unter

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

und der Fahrer einsetzen, funktioniert es. Wenn ich das einschalte, schlägt es fehl. Ich habe meinen Treiber ein paar Mal aktiviert, indem ich diese Option ein- und ausschalte, und es schlägt immer fehl, wenn es an ist.

Ich habe diese Frage zusammen mit meinen Ergebnissen gepostet. Vielleicht könnte jemand dort antworten, warum das der Fall ist: https://www.osronline.com/showthread.cfm?link=277793

+0

Ich kann bestätigen, dass mein Problem behoben. @shaboinkin hast du kürzlich WDK installiert? Ich habe es in der letzten Woche gemacht. Vielleicht gibt es einen Fehler in einer aktuellen Version? Ich versuche die Ursache herauszufinden und das scheint wahrscheinlich. – Warty

+0

Ja, aber ich habe WDK 8.1 installiert, das im Jahr 2014 auf die Seite von Microsoft hochgeladen wurde. Ich glaube, dass ein Wert von 0 in eine Speicherzuweisung übernommen wurde, was dazu führte, dass Dinge fehlschlagen. Wenn Sie den Quellcode für WDK (https://github.com/Microsoft/Windows-Driver-Frameworks) in der Datei "handleapi.cpp ", es gibt eine Funktion namens FxObjectHandleAlloc, die einen Parameter der Größe" size "übergeben wird. Es gibt einen Kommentar, der besagt, dass die Größe vom Compiler übergeben wird. Er verwendet einen überladenen neuen Operator in einem Funktionsmakro innerhalb von fxobject.hpp – shaboinkin

+0

Ich habe nie eine Änderung gefunden, um durch den Debugger zu graben, um zu verifizieren, dass dies tatsächlich das Problem war, einfach weil es eine Ewigkeit braucht, um durchzusetzen.Aber von den anderen Fehlerpunkten innerhalb von FxObjectHandleAlloc war das der einzige Ort, an dem ich sehen konnte In dieser Funktion ruft es auf, FxPoolAllocateWithTag ruft schließlich innerhalb von wdfpool.cpp auf FxPoolAllocator ab, was bei size == 0 fehlschlägt, oder schlägt bei der Ausgabe dieser Rtl * -Funktionen fehl, die ich nicht anzeigen kann Die Quelle: Wenn der Compiler aus irgendeinem Grund in 0 übergeben wird, ist das einzige, was ich mir vorstellen kann, ein Fehler. – shaboinkin