!驗證

!verifier 擴充功能會顯示驅動程序驗證器的狀態及其動作。

驅動程式驗證器包含在 Windows 中。 其適用於已核取和免費組建。 如需驅動程式驗證器的相關信息,請參閱 驅動程序驗證器

語法

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

參數

旗標
指定此指令輸出中顯示的資訊。 如果 Flags 等於值 4、8、0x20、0x40、0x80或0x100,則會根據與這些值相關聯的特定自變數來解譯 !verifier 的其餘自變數。 如果 Flags 等於任何其他值,即使設定了一或多個這些位,則只 允許 FlagsImage 自變數。 旗標 可以是下列位的任何總和;預設值為0:

位 0 (0x1)
顯示正在驗證的所有驅動程式名稱。 目前從非分頁集區配置給每個驅動程式的位元組數目,也會顯示分頁集區。

位 1 (0x2)
顯示集區的相關信息(集區大小、標頭和集區卷標),以及卸除驅動程式留下的未處理記憶體配置。 除非也設定位 0 (0x1),否則這個旗標不會有任何作用。

位 2 (0x4)
顯示錯誤插入資訊。 系統會顯示要求每個配置之程式代碼的傳回位址、符號名稱和位移。 如果 Flags 完全0x4且 包含 Quantity 參數,則可以選擇顯示這些記錄的數目。 否則,會顯示四筆記錄。

位 3 (0x8)
顯示正在驗證驅動程式的最新 IRQL 變更。 會顯示舊的 IRQL、新的 IRQL、處理器和時間戳。 如果 Flags 完全0x8且 包含 Quantity 參數,則可以選擇顯示這些記錄的數目。 否則,會顯示四筆記錄。

警告 在64位版本的Windows中,引發或降低IRQL的部分核心函式會實作為內嵌程式代碼,而不是導出的函式。 驅動程式驗證器不會報告內嵌程序代碼所做的 IRQL 變更,因此驅動程式驗證器所產生的 IRQL 轉換記錄可能不完整。 如需遺漏 IRQL 轉換專案的範例,請參閱。

位 6 (0x40)
(Windows Vista 和更新版本)顯示驅動程式驗證器 [ 強制擱置中 I/O 要求 ] 選項的資訊,包括來自強制擱置 IRP 記錄檔的追蹤。

Quantity 參數會指定要顯示的追蹤數目。 根據預設,會顯示整個記錄檔。

位 7 (0x80)
(Windows Vista 和更新版本)顯示核心集區配置/免費記錄檔中的資訊。

Quantity 參數會指定要顯示的追蹤數目。 根據預設,會顯示整個記錄檔。

如果 指定 Address ,則只會顯示與核心集區配置/免費記錄檔內指定地址相關聯的追蹤。

位 8 (0x100)
(Windows Vista 和更新版本)顯示 IoAllocateIrp、IoCompleteRequest 和 IoCancelIrp 呼叫記錄檔中的資訊。

Quantity 參數會指定要顯示的追蹤數目。 根據預設,會顯示整個記錄檔。

如果 指定 Address ,則只會顯示與指定 IRP 位址相關聯的追蹤。

位 9 (0x200)
(Windows Vista 和更新版本)在 [重大區域] 記錄檔中顯示專案。

如果 指定 Address ,則只會顯示與指定線程地址相關聯的專案。

位 10 (0x400)
(Windows Vista 和更新版本)顯示驅動程式驗證程式目前正在監看的已取消 IRP。

如果 指定 Address ,則只會顯示具有指定位址的 IRP。

位 11 (0x800)
(Windows 8.1 和更新版本)從您選取 [系統低資源模擬 ] 選項時所建立的錯誤插入記錄檔顯示專案。

映像
如果使用 Flags 且不等於 4、8 或 0x10,Image 會指定驅動程式的名稱。 影像可用來篩選旗標值所顯示的資訊,0x1和0x2:只會考慮指定的驅動程式。 此驅動程式目前必須經過驗證。

數量
如果 Flags 完全等於0x4,Quantity 會指定要顯示的錯誤插入記錄數目。 如果 Flags 完全等於 0x8,Quantity 會指定要顯示的 IRQL 記錄項目數目。 如果 Flags 完全等於 0x40,Quantity 會指定從強制擱置 IRP 記錄中顯示的追蹤數目。 如果 Flags 完全等於 0x80,Quantity 會指定從核心集區配置/免費記錄中顯示的追蹤數目。 如果 Flags 完全等於 0x100,Quantity 會指定從 IoAllocateIrp、IoCompleteRequest 和 IoCancelIrp 呼叫記錄中顯示的追蹤數目。

-禁用
清除偵錯目標上的目前驅動程序驗證程序設定。 清除這些設定不會透過重新啟動保存。 如果您需要停用驅動程序驗證程式設定以成功開機,請在 nt 設定斷點!VerifierInitSystem,並在該時間點使用 !verifier -disable 命令。

?
在 [調試程式命令] 視窗中顯示此延伸模組的簡短說明文字。

DLL

Kdexts.dll

其他資訊

如需詳細資訊,請參閱 驅動程序驗證器

備註

下列範例說明在64位版本的Windows上,IRQL轉換記錄不一定會完成。 顯示的兩個專案是處理器 2 記錄檔中的連續專案。 第一個項目會顯示從 2 到 0 的 IRQL。 第二個項目會顯示從 2 到 2 的 IRQL。 IRQL 如何從 0 提高到 2 的資訊遺失。

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

4、8 和 0x20、0x40、0x80 和 0x100 的值是 Flags 的特殊值。 如果使用這些值,則可以使用Parameters區段中所列的特殊自變數,而且顯示只會包含與該旗標值相關聯的資訊。

如果使用 Flags 的任何其他值,即使已設定一或多個這些位,也只允許 FlagsImage 自變數。 在此情況下,除了顯示所有其他資訊之外, !verifier 還會顯示作用中的驅動程序驗證器 選項,以及集區配置、IRQL 引發、微調鎖定和修剪的統計數據。

如果 Flags 等於 0x20,則 Driver Verifier 的 Driver Hang Verification 選項會使用針對 CompletionTime、CancelTimeForceCancellation 指定的值。 這些新值會立即生效,並持續到下一次開機為止。 當您重新啟動時,它們會還原為預設值。

此外,如果 Flags 等於 0x20(含或不含其他參數),則會列印驅動程式停止響應驗證記錄。 如需解譯記錄檔的相關信息,請參閱 Windows 驅動程式套件 (WDK) 檔中驅動程式驗證工具檔的驅動程式停止響應驗證一節。

以下是 Windows 7 電腦上 !verifier 擴充功能的範例。

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

以下是 Windows Vista 計算機上已開啟位 7 和 [位址] 的 !verifier 延伸模組範例

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