!Prüfer
Die Erweiterung !verifier zeigt den Status von Driver Verifier und seine Aktionen an.
Driver Verifier ist in Windows enthalten. Es funktioniert sowohl mit geprüften als auch mit freien Builds. Informationen über Driver Verifier finden Sie unter Driver Verifier.
Syntax
!verifier [Flags [Image]]
!verifier 4 [Quantity]
!verifier 8 [Quantity]
!verifier 0x40 [Quantity]
!verifier 0x80 [Quantity]
!verifier 0x80 Address
!verifier 0x100 [Quantity]
!verifier 0x100 Address
!verifier 0x200 [Address]
!verifier 0x400 [Address]
!verifier -disable
!verifier ?
Parameter
Flaggen
Gibt an, welche Informationen in der Ausgabe dieses Befehls angezeigt werden. Wenn Flags gleich dem Wert 4, 8, 0x20, 0x40, 0x80 oder 0x100 ist, werden die übrigen Argumente für !verifier auf der Grundlage der mit diesen Werten verbundenen spezifischen Argumente interpretiert. Wenn Flags gleich einem anderen Wert ist, auch wenn eines oder mehrere dieser Bits gesetzt sind, sind nur die Argumente Flags und Image zulässig. Flags kann eine beliebige Summe der folgenden Bits sein; der Standardwert ist 0:
Bit 0 (0x1)
Zeigt die Namen aller überprüften Treiber an. Die Anzahl der Bytes, die derzeit jedem Treiber aus dem Non-Paged-Pool und dem Paged-Pool zugewiesen sind, wird ebenfalls angezeigt.
Bit 1 (0x2)
Zeigt Informationen über Pools (Poolgröße, Kopfzeilen und Pool-Tags) und ausstehende Speicherzuweisungen von entladenen Treibern an. Dieses Flag hat keine Auswirkungen, wenn Bit 0 (0x1) nicht ebenfalls gesetzt ist.
Bit 2 (0x4)
Zeigt Informationen zur Fehlereinspeisung an. Die Rücksprungadresse, der Symbolname und die Verschiebung des Codes, der die jeweilige Zuweisung anfordert, werden angezeigt. Wenn Flags genau 0x4 ist und der Parameter Quantity enthalten ist, kann die Anzahl dieser angezeigten Datensätze gewählt werden. Andernfalls werden vier Datensätze angezeigt.
Bit 3 (0x8)
Zeigt die letzten IRQL-Änderungen an, die von den überprüften Treibern vorgenommen wurden. Der alte IRQL, der neue IRQL, der Prozessor und der Zeitstempel werden angezeigt. Wenn Flags genau 0x8 ist und der Parameter Quantity enthalten ist, kann die Anzahl dieser angezeigten Datensätze gewählt werden. Andernfalls werden vier Datensätze angezeigt.
Warnung In 64-Bit-Versionen von Windows sind einige der Kernel-Funktionen, die den IRQL erhöhen oder senken, als Inline-Code und nicht als exportierte Funktionen implementiert. Driver Verifier meldet keine IRQL-Änderungen, die durch Inline-Code vorgenommen wurden, sodass das von Driver Verifier erstellte IRQL-Übergangsprotokoll unvollständig sein kann. Siehe Bemerkungen für ein Beispiel für einen fehlenden IRQL-Übergangseintrag.
Bit 6 (0x40)
(Windows Vista und höher) Zeigt Informationen aus der Option Force Pending I/O Requests von Driver Verifier an, einschließlich Spuren aus dem Protokoll der erzwungenen ausstehenden IRPs.
Der Parameter Quantity gibt die Anzahl der anzuzeigenden Spuren an. Standardmäßig wird das gesamte Protokoll angezeigt.
Bit 7 (0x80)
(Windows Vista und höher) Zeigt Informationen aus dem Kernelpool-Allocate/Free-Protokoll an.
Der Parameter Quantity gibt die Anzahl der anzuzeigenden Spuren an. Standardmäßig wird das gesamte Protokoll angezeigt.
Wenn Adresse angegeben ist, werden nur Ableitungen angezeigt, die mit der angegebenen Adresse innerhalb des Kernelpool-Allocate/Free-Protokolls verbunden sind.
Bit 8 (0x100)
(Windows Vista und höher) Zeigt Informationen aus dem Protokoll der Aufrufe IoAllocateIrp, IoCompleteRequest und IoCancelIrp an.
Der Parameter Quantity gibt die Anzahl der anzuzeigenden Spuren an. Standardmäßig wird das gesamte Protokoll angezeigt.
Wenn Adresse angegeben ist, werden nur Abhängigkeiten angezeigt, die mit der angegebenen IRP-Adresse verbunden sind.
Bit 9 (0x200)
(Windows Vista und höher) Zeigt Einträge im Protokoll des kritischen Bereichs an.
Wenn Adresse angegeben ist, werden nur Einträge angezeigt, die mit der angegebenen Thread-Adresse verbunden sind.
Bit 10 (0x400)
(Windows Vista und höher) Zeigt abgebrochene IRPs an, die derzeit von Driver Verifier überwacht werden.
Wenn Adresse angegeben ist, wird nur das IRP mit der angegebenen Adresse angezeigt.
Bit 11 (0x800)
(Windows 8.1 und höher) Zeigt Einträge aus dem Fehlerinjektionsprotokoll an, das erstellt wird, wenn Sie die Option Systematische Simulation mit geringen Ressourcen auswählen.
Bild
Wenn Flags verwendet wird und nicht gleich 4, 8 oder 0x10 ist, gibt Image den Namen eines Treibers an. Image wird verwendet, um die von angezeigten Informationen zu filtern. Flags-Werte von 0x1 und 0x2: nur der angegebene Treiber wird berücksichtigt. Dieser Treiber muss aktuell überprüft werden.
Menge
Wenn Flags genau gleich 0x4 ist, gibt Quantity die Anzahl der anzuzeigenden Fault Injection Records an. Wenn Flags genau gleich 0x8 ist, gibt Quantity die Anzahl der anzuzeigenden IRQL-Protokolleinträge an. Wenn Flags genau gleich 0x40 ist, gibt Menge die Anzahl der angezeigten Spuren aus dem Protokoll der erzwungenen anstehenden IRPs an. Wenn Flags genau gleich 0x80 ist, gibt Quantity die Anzahl der angezeigten Traces aus dem Kernel-Pool Allocate/Free Log an. Wenn Flags genau gleich 0x100 ist, gibt Quantity die Anzahl der angezeigten Traces aus dem Protokoll von IoAllocateIrp, IoCompleteRequest und IoCancelIrp-Aufrufen an.
-abschalten
Löscht die aktuellen Einstellungen der Treiberüberprüfung auf dem Debug-Ziel. Die Löschung dieser Einstellungen bleibt nach einem Neustart nicht erhalten. Wenn Sie die Einstellungen der Treiberüberprüfung deaktivieren müssen, um erfolgreich zu booten, setzen Sie einen Haltepunkt bei nt!VerifierInitSystem und verwenden Sie den Befehl !verifier -disable an diesem Punkt.
?
Zeigt einen kurzen Hilfetext für diese Erweiterung im Debugger-Befehlsfenster an.
DLL
Kdexts.dll
Zusätzliche Informationen
Weitere Informationen finden Sie unter Driver Verifier.
Hinweise
Das folgende Beispiel zeigt, dass das IRQL-Übergangsprotokoll bei 64-Bit-Versionen von Windows nicht immer vollständig ist. Die beiden gezeigten Einträge sind aufeinanderfolgende Einträge im Protokoll für Prozessor 2. Der erste Eintrag zeigt, dass der IRQL von 2 auf 0 geht. Der zweite Eintrag zeigt, dass der IRQL von 2 auf 2 geht. Es fehlen Informationen darüber, wie der IRQL von 0 auf 2 erhöht wurde.
Thread: fffffa80068c9400
Old irql: 0000000000000002
New irql: 0000000000000000
Processor: 0000000000000002
Time stamp: 0000000000000857
fffff8800140f12a ndis!ndisNsiGetInterfaceInformation+0x20a
fffff88001509478 NETIO!NsiGetParameterEx+0x178
fffff88005f062f2 nsiproxy!NsippGetParameter+0x24a
fffff88005f086db nsiproxy!NsippDispatchDeviceControl+0xa3
fffff88005f087a0 nsiproxy!NsippDispatch+0x48
Thread: fffffa80068c9400
Old irql: 0000000000000002
New irql: 0000000000000002
Processor: 0000000000000002
Time stamp: 0000000000000857
fffff8800140d48d ndis!ndisReferenceTopMiniportByNameForNsi+0x1ce
fffff8800140f072 ndis!ndisNsiGetInterfaceInformation+0x152
fffff88001509478 NETIO!NsiGetParameterEx+0x178
fffff88005f062f2 nsiproxy!NsippGetParameter+0x24a
fffff88005f086db nsiproxy!NsippDispatchDeviceControl+0xa3
Die Werte 4, 8 und 0x20, 0x40, 0x80 und 0x100 sind spezielle Werte für Flags. Wenn diese Werte verwendet werden, können die im Abschnitt Parameter aufgeführten speziellen Argumente verwendet werden, und die Anzeige enthält nur die mit diesem Flagwert verbundenen Informationen.
Wenn ein anderer Wert für Flags verwendet wird, selbst wenn eines oder mehrere dieser Bits gesetzt sind, sind nur die Argumente Flags und Image zulässig. In diesem Fall zeigt !verifier zusätzlich zu allen anderen angezeigten Informationen die aktiven Optionen der Treiberüberprüfung sowie Statistiken über Poolzuweisungen, IRQL-Erhöhungen, Spin Locks und Trims an.
Wenn Flags gleich 0x20 ist, werden die für CompletionTime, CancelTime und ForceCancellation angegebenen Werte von der Option Driver Hang Verification von Driver Verifier verwendet. Diese neuen Werte werden sofort wirksam und gelten bis zum nächsten Startvorgang. Wenn Sie neu starten, werden die Standardwerte wiederhergestellt.
Wenn Flags gleich 0x20 ist (mit oder ohne zusätzliche Parameter), wird außerdem das Protokoll der Treiberaufhängungsprüfung gedruckt. Informationen zur Interpretation des Protokolls finden Sie im Abschnitt Driver Hang Verification der Driver Verifier-Dokumentation in der Windows Driver Kit (WDK)-Dokumentation.
Hier sehen Sie ein Beispiel für die Erweiterung !verifier auf einem Windows 7-Computer.
2: kd> !verifier 0xf
Verify Level 9bb ... enabled options are:
Special pool
Special irql
All pool allocations checked on unload
Io subsystem checking enabled
Deadlock detection enabled
DMA checking enabled
Security checks enabled
Miscellaneous checks enabled
Summary of All Verifier Statistics
RaiseIrqls 0x0
AcquireSpinLocks 0x362
Synch Executions 0x0
Trims 0xa34a
Pool Allocations Attempted 0x7b058
Pool Allocations Succeeded 0x7b058
Pool Allocations Succeeded SpecialPool 0x7b058
Pool Allocations With NO TAG 0x0
Pool Allocations Failed 0x0
Resource Allocations Failed Deliberately 0x0
Current paged pool allocations 0x1a for 00000950 bytes
Peak paged pool allocations 0x1b for 00000AC4 bytes
Current nonpaged pool allocations 0xe3 for 00046110 bytes
Peak nonpaged pool allocations 0x10f for 00048E40 bytes
Driver Verification List
Entry State NonPagedPool PagedPool Module
fffffa8003b6f670 Loaded 000000a0 00000854 videoprt.sys
Current Pool Allocations 00000002 00000013
Current Pool Bytes 000000a0 00000854
Peak Pool Allocations 00000006 00000014
Peak Pool Bytes 000008c0 000009c8
PoolAddress SizeInBytes Tag CallersAddress
fffff9800157efc0 0x0000003c Vprt fffff88002c62963
fffff9800146afc0 0x00000034 Vprt fffff88002c62963
fffff980015bafe0 0x00000018 Vprt fffff88002c628f7
...
fffffa8003b6f620 Loaded 00046070 000000fc usbport.sys
Current Pool Allocations 000000e1 00000007
Current Pool Bytes 00046070 000000fc
Peak Pool Allocations 0000010d 0000000a
Peak Pool Bytes 00048da0 00000254
PoolAddress SizeInBytes Tag CallersAddress
fffff98003a38fc0 0x00000038 usbp fffff88004215e34
fffff98003a2cfc0 0x00000038 usbp fffff88004215e34
fffff9800415efc0 0x00000038 usbp fffff88004215e34
...
-----------------------------------------------
Fault injection trace log
-----------------------------------------------
Driver Verifier didn't inject any faults.
-----------------------------------------------
Track irql trace log
-----------------------------------------------
Displaying most recent 0x0000000000000004 entries from the IRQL transition log.
There are up to 0x100 entries in the log.
Thread: fffff80002bf8c40
Old irql: 0000000000000002
New irql: 0000000000000002
Processor: 0000000000000000
Time stamp: 000000000000495e
fffff8800420f2ca USBPORT!USBPORT_DM_IoTimerDpc+0x9a
fffff80002a5b5bf nt!IopTimerDispatch+0x132
fffff80002a7c29e nt!KiProcessTimerDpcTable+0x66
fffff80002a7bdd6 nt!KiProcessExpiredTimerList+0xc6
fffff80002a7c4be nt!KiTimerExpiration+0x1be
Thread: fffff80002bf8c40
Old irql: 0000000000000002
New irql: 0000000000000002
Processor: 0000000000000000
Time stamp: 000000000000495e
fffff88004205f3a USBPORT!USBPORT_AcquireEpListLock+0x2e
fffff880042172df USBPORT!USBPORT_Core_TimeoutAllTransfers+0x1f
fffff8800420f2ca USBPORT!USBPORT_DM_IoTimerDpc+0x9a
fffff80002a5b5bf nt!IopTimerDispatch+0x132
fffff80002a7c29e nt!KiProcessTimerDpcTable+0x66
Thread: fffff80002bf8c40
Old irql: 0000000000000002
New irql: 0000000000000002
Processor: 0000000000000000
Time stamp: 000000000000495e
fffff88004201694 USBPORT!MPf_CheckController+0x4c
fffff8800420f26a USBPORT!USBPORT_DM_IoTimerDpc+0x3a
fffff80002a5b5bf nt!IopTimerDispatch+0x132
fffff80002a7c29e nt!KiProcessTimerDpcTable+0x66
fffff80002a7bdd6 nt!KiProcessExpiredTimerList+0xc6
Thread: fffff80002bf8c40
Old irql: 0000000000000002
New irql: 0000000000000002
Processor: 0000000000000000
Time stamp: 000000000000495e
fffff8800420167c USBPORT!MPf_CheckController+0x34
fffff8800420f26a USBPORT!USBPORT_DM_IoTimerDpc+0x3a
fffff80002a5b5bf nt!IopTimerDispatch+0x132
fffff80002a7c29e nt!KiProcessTimerDpcTable+0x66
fffff80002a7bdd6 nt!KiProcessExpiredTimerList+0xc6
Hier ist ein Beispiel für die Erweiterung !verifier auf einem Windows Vista-Computer mit aktiviertem Bit 7 und der Angabe Adresse.
0: kd> !verifier 80 a2b1cf20
# Parsing 00004000 array entries, searching for address a2b1cf20.
Pool block a2b1ce98, Size 00000168, Thread a2b1ce98
808f1be6 ndis!ndisFreeToNPagedPool+0x39
808f11c1 ndis!ndisPplFree+0x47
808f100f ndis!NdisFreeNetBufferList+0x3b
8088db41 NETIO!NetioFreeNetBufferAndNetBufferList+0xe
8c588d68 tcpip!UdpEndSendMessages+0xdf
8c588cb5 tcpip!UdpSendMessagesDatagramsComplete+0x22
8088d622 NETIO!NetioDereferenceNetBufferListChain+0xcf
8c5954ea tcpip!FlSendNetBufferListChainComplete+0x1c
809b2370 ndis!ndisMSendCompleteNetBufferListsInternal+0x67
808f1781 ndis!NdisFSendNetBufferListsComplete+0x1a
8c04c68e pacer!PcFilterSendNetBufferListsComplete+0xb2
809b230c ndis!NdisMSendNetBufferListsComplete+0x70
# 8ac4a8ba test1!HandleCompletedTxPacket+0xea
Pool block a2b1ce98, Size 00000164, Thread a2b1ce98
822af87f nt!VerifierExAllocatePoolWithTagPriority+0x5d
808f1c88 ndis!ndisAllocateFromNPagedPool+0x1d
808f11f3 ndis!ndisPplAllocate+0x60
808f1257 ndis!NdisAllocateNetBufferList+0x26
80890933 NETIO!NetioAllocateAndReferenceNetBufferListNetBufferMdlAndData+0x14
8c5889c2 tcpip!UdpSendMessages+0x503
8c05c565 afd!AfdTLSendMessages+0x27
8c07a087 afd!AfdTLFastDgramSend+0x7d
8c079f82 afd!AfdFastDatagramSend+0x5ae
8c06f3ea afd!AfdFastIoDeviceControl+0x3c1
8217474f nt!IopXxxControlFile+0x268
821797a1 nt!NtDeviceIoControlFile+0x2a
8204d16a nt!KiFastCallEntry+0x127