!ndiskd.oid
Die Erweiterung !ndiskd.oid zeigt Informationen über eine NDIS OID-Anfrage an. Wenn Sie diese Erweiterung ohne Parameter ausführen, zeigt !ndiskd eine Liste aller ausstehenden OID-Anforderungen für alle Miniports und Filter an. Jeder Miniport oder Filter hat höchstens eine ausstehende OID-Anforderung und eine beliebige Anzahl von OID-Anforderungen in der Warteschlange.
Beachten Sie, dass Filter in der Regel OID-Anfragen klonen und den Klon weitergeben. Das bedeutet, dass selbst wenn ein Protokoll eine einzige OID-Anfrage stellt, es mehrere Instanzen von geklonten Anfragen geben kann: eine in jedem Filter und eine weitere im Miniport. !ndiskd.oid zeigt jeden Klon einzeln an, so dass Sie möglicherweise mehr ausstehende OIDs sehen, als das Protokoll tatsächlich ausgegeben hat.
!ndiskd.oid [-handle <x>] [-legacyoid] [-nolimit>] [-miniport <x>]
Parameter
-Griff
Handle einer NDIS_OID_REQUEST
-legacyoid
Wird wie eine alte NDIS_REQUEST anstelle einer NDIS_OID_REQUEST behandelt.
-nolimit
Schränkt die Anzahl der angezeigten ausstehenden OIDs nicht ein.
-miniport
Findet anstehende OID-Anfragen auf dem Stack dieses Miniports.
DLL
Ndiskd.dll
Hinweise
!ndiskd.oid zeigt Ihnen eine Liste aller ausstehenden OIDs auf dem System auf einmal an, so dass es bei der Fehlersuche bei Systemhängern oder 0x9F bug check-Situationen (DRIVER_POWER_STATE_FAILURE) hilfreich sein kann. Nehmen wir zum Beispiel an, die Analyse eines fiktiven 0x9F-Fehlerchecks ergab, dass das System an einem IRP hing und auf NDIS wartete. In NDIS werden IRPs vom Betriebssystem in OIDs übersetzt, einschließlich Stromversorgungsübergänge. Wenn Sie also !ndiskd.oid ausführen, können Sie sehen, dass sich in diesem Beispiel ein Gerät am unteren Ende des Stapels an eine OID_PNP_SET_POWER geklammert haben könnte und den Rest des Stapels hängen ließ. NDIS-Treiber sollten eine OID nicht länger als eine Sekunde in der Schwebe halten. Sie können also untersuchen, warum das Gerät die OID zu lange in der Schwebe hält, um das Problem zu lösen.
Beispiele
Um ein Beispiel für ausstehende OIDS auf einem normal laufenden System zu sehen, setzen Sie einen Haltepunkt in der OID-Request-Handler-Routine eines Miniports (im entsprechenden Miniport-Treiber des Miniports). Führen Sie zunächst den Befehl !ndiskd.minidriver ohne Parameter aus, um eine Liste der Miniport-Treiber auf dem System zu erhalten. In dieser Beispielausgabe suchen Sie nach dem Handle für den kdnic-Minidriver, ffffdf801418d650.
3: kd> !ndiskd.minidriver
ffffdf8015a98380 - tunnel
ffffdf801418d650 - kdnic
Klicken Sie auf das Handle des Minitreibers und dann auf den Link „Handler“ unten auf der Detailseite, um die Liste der Handler anzuzeigen. Sie können alternativ den Befehl !ndiskd.minidriver -handle -handlers eingeben. Sobald Sie die Liste der Handler des Minidrivers haben, suchen Sie nach dem OidRequestHandler, dessen Handle in diesem Beispiel fffff80f1fd71c90 ist.
2: kd> !ndiskd.minidriver ffffdf801418d650 -handlers
HANDLERS
NDIS Handler Function pointer Symbol (if available)
InitializeHandlerEx fffff80f1fd78230 bp
SetOptionsHandler fffff80f1fd72800 bp
HaltHandlerEx fffff80f1fd78040 bp
ShutdownHandlerEx fffff80f1fd722c0 bp
CheckForHangHandlerEx fffff80f1fd72810 bp
ResetHandlerEx fffff80f1fd72f70 bp
PauseHandler fffff80f1fd78000 bp
RestartHandler fffff80f1fd78940 bp
OidRequestHandler fffff80f1fd71c90 bp
CancelOidRequestHandler fffff80f1fd722c0 bp
DirectOidRequestHandler [None]
CancelDirectOidRequestHandler [None]
DevicePnPEventNotifyHandler fffff80f1fd789a0 bp
SendNetBufferListsHandler fffff80f1fd71870 bp
ReturnNetBufferListsHandler fffff80f1fd71b50 bp
CancelSendHandler fffff80f1fd722c0 bp
Klicken Sie nun entweder auf den Link „bp“ rechts neben dem OidRequestHandler oder geben Sie den Befehl bp -handle mit dem entsprechenden Handle ein, um einen Haltepunkt in dieser Routine zu setzen. Als nächstes geben Sie den Befehl g ein, um Ihren Debugee-Zielrechner laufen zu lassen und den soeben gesetzten Haltepunkt zu erreichen.
2: kd> bp fffff80f1fd71c90
2: kd> g
Breakpoint 1 hit
fffff80f`1fd71c90 448b4204 mov r8d,dword ptr [rdx+4]
Sobald Sie den Haltepunkt in der OID-Anforderungsbehandlungsroutine eines Minitreibers ausgelöst haben, wie im vorherigen Beispiel gezeigt, können Sie den Befehl !ndiskd.oid ausführen, um eine Liste aller ausstehenden OIDs auf dem System anzuzeigen.
1: kd> !ndiskd.oid
ALL PENDING OIDs
NetAdapter ffffdf80140c71a0 - Microsoft Kernel Debug Network Adapter
Current OID OID_GEN_STATISTICS
Filter ffffdf8014950c70 - Microsoft Kernel Debug Network Adapter-WFP Native MAC Layer LightWeight Filter-0000
Current OID OID_GEN_STATISTICS
Filter ffffdf801494dc70 - Microsoft Kernel Debug Network Adapter-QoS Packet Scheduler-0000
Current OID OID_GEN_STATISTICS
In diesem Beispiel lautet die ausstehende OID OID_GEN_STATISTICS. Wenn Sie sich die Ergebnisse von !ndiskd.oid ansehen, denken Sie daran, dass Filter OID-Anfragen klonen und sie den Stapel hinunterreichen, und dass OIDs normalerweise von Filter zu Filter zu Miniport weitergegeben werden. Auch wenn es in diesem Beispiel so aussieht, als gäbe es drei separate OID-Anforderungen mit demselben Namen, findet in Wirklichkeit ein logischer Vorgang statt, der physisch auf drei OIDs und drei Treiber verteilt wurde.
Weitere Informationen
Leitfaden für die Entwicklung von Netzwerktreibern
Netzwerkreferenz für Windows Vista und höher