!verifier

!verifier拡張機能には、ドライバーの検証ツールとそのアクションの状態が表示されます。

ドライバーの検証ツールは、Windowsに含まれています。 チェックと無料の両方のビルドで動作します。 ドライバーの検証ツールについては、次を参照してくださいDriver Verifierします。

構文

!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が他の値に等しい場合、これらのビットが1つ以上セットされていても、FlagsImage引数のみが許可される。 Flags次のビットの合計を指定できます。既定値は0です。

ビット 0 (0x1)
検証されているすべてのドライバーの名前が表示されます。 非ページプールとページプールから各ドライバーに現在割り当てられているバイト数も表示されます。

ビット 1 (0x2)
プール(プールサイズ、ヘッダー、およびプールタグ)とアンロードされたドライバーによって残された未処理のメモリ割り当てに関する情報が表示されます。 ビット0 (0x1) も設定されていない限り、このフラグは効果がありません。

ビット 2 (0x4)
フォールト挿入情報を表示します。 リターンアドレス、シンボル名、および各割り当てを要求するコードの変位が表示されます。 Flags がちょうど 0x4 で、Quantity パラメータが含まれている場合、これらのレコードの表示数を選択できます。 そうでない場合は、4 つのレコードが表示されます。

ビット 3 (0x8)
検証中のドライバーによって行われた最新のIRQL変更を表示します。 古いIRQL、新しいIRQL、プロセッサ、およびタイムスタンプが表示されます。 Flags がちょうど 0x8 で、Quantity パラメータが含まれている場合、これらのレコードの表示数を選択できます。 そうでない場合は、4 つのレコードが表示されます。

Warning64ビットバージョンのWindowsでは、一部のカーネル関数を上げるか、IRQLを下げるは、エクスポートされた関数としてではなく、インラインコードとして実装されます。 ドライバーの検証ツールは、インラインコードによって行われたIRQLの変更を報告しないため、ドライバーの検証ツールによって生成されるIRQL遷移ログが不完全になる可能性があります。 不足しているIRQL遷移エントリの例については、 「解説」 を参照してください。

ビット 6 (0x40)
(Windows Vista 以降) Driver Verifier の 保留中の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)
(Windows8.1以降)システマティックな低資源シミュレーションオプションを選択したときに作成されるフォールト注入ログのエントリを表示します。

イメージ
Flagsが4、8、0x10以外の場合、Imageでドライバ名を指定する。 Imageは、Flags の0x1と0x2の値によって表示される情報をフィルタリングするために使用されます:指定されたドライバのみが考慮されます。 このドライバーは、現在検証する必要があります。

数量
Flagsが正確に0x4に等しい場合、Quantityは表示する障害注入レコードの数を指定する。 Flagsが正確に0x8に等しい場合、Quantityは表示するIRQLログ・エントリーの数を指定する。 Flagsが正確に0x40に等しい場合、Quantityは、強制保留IRPのログから表示されるトレースの数を指定する。 場合フラグ0x80に正確に等しい、数量カーネルプールの割り当て/解放ログから表示されるトレースの数を指定します。 場合フラグ0x100に正確に等しい、数量IoAllocateIrp、IoCompleteRequestとIocancelirp呼び出しのログから表示されるトレースの数を指定します。

-disable
デバッグターゲットの現在のドライバーの検証ツールの設定をクリアします。 これらの設定のクリアは、再起動によって保持されません。 ブートを成功させるためにDriver Verifierの設定を無効にする必要がある場合は、nt!VerifierInitSystemにブレークポイントを設定し、そのポイントで !verifier -disable コマンドを使用します。

?
デバッガーコマンドウィンドウで、この拡張機能の簡単なヘルプテキストを表示します。

[DLL]

Kdexts.dll

追加情報

Driver Verifierについては、Windows Driver Kit (WDK) ドキュメントを参照してください。

解説

次の例は、64ビットバージョンのWindowsでは、IRQL遷移ログが常に完了していないことを示しています。 表示される2つのエントリは、プロセッサ2のログ内の連続したエントリです。 最初のエントリは、2から0へのIRQLを示しています。 2番目のエントリは、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の特別な値である。 これらの値が使用されている場合、パラメータセクションにリストされている特別な引数を使用することができ、表示にはそのフラグ値に関連する情報のみが含まれる。

Flagsに他の値が使われた場合、これらのビットが1つ以上セットされていても、FlagsImage引数のみが許可される。 このような状況では、表示される他のすべての情報に加えて、!verifierは、プール割り当て、IRQLの発生、スピンロック、およびトリミングに関する統計情報と共に、アクティブなドライバーの検証ツールのオプションを表示します。

Flagsが0x20の場合、 CompletionTime, CancelTime、およびForceCancellationに指定された値は、Driver Verifierのドライバーハング検証オプションによって使用されます。 これらの新しい値はすぐに有効になり、次の起動まで続きます。 再起動すると、既定値に戻ります。

また、Flagsが0x20 (追加のパラメーターの有無にかかわらず) に等しい場合は、ドライバーハング検証ログが出力されます。 ログの解釈の詳細については、Windows Driver Kit (WDK) ドキュメントのDriver VerifierドキュメントのDriver Hang Verificationセクションを参照してください。

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

次に例を示します、!verifierビット7をオンにし、Addressを指定したWindows Vistaコンピューターの拡張機能。

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