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