!ndiskd.oid
!ndiskd.oid 拡張コマンドは、NDIS OID 要求に関する情報を表示します。 この拡張コマンドをパラメーターなしで実行すると、!ndiskdは、すべてのミニポートとフィルターで保留中のすべての OID 要求のリストを表示します。 各ミニポートまたはフィルターは、最大 1 つの保留中の OID 要求と、任意の数のキューに入れられた OID 要求を持ちます。
フィルターは通常、OID 要求のクローンを作成し、そのクローンを下に渡すことに注意してください。 これは、プロトコルが 1 つの OID 要求を発行しても、クローンが作成された要求が複数存在する可能性があることを意味します。 !ndiskd.oid はそれぞれのクローンを別々に表示するので、プロトコルが実際に発行した数よりも多くの保留中の OID が表示される可能性があります。
!ndiskd.oid [-handle <x>] [-legacyoid] [-nolimit>] [-miniport <x>]
パラメーター
ハンドル
NDIS_OID_REQUEST のハンドル。
-legacyoid
NDIS_OID_REQUEST ではなく、レガシー NDIS_REQUEST として扱います。
-nolimit
表示される保留中の OID の数を制限しません。
ミニポート
このミニポートのスタックで保留中の OID 要求を見つけます。
DLL
Ndiskd.dll
備考
!ndiskd.oid は、システム上の保留中の OID のリストを一度に示すので、システムのハングアップや 0x9F bug check 状況 (DRIVER_POWER_STATE_FAILURE) のデバッグに役立ちます。 たとえば、架空の 0x9F バグ チェックを分析した結果、システムが IRP でハングし、NDIS を待っていることが判明したとします。 NDIS では、OS からの IRP (電源状態遷移など) は OID に変換されるので !ndiskd.oid を実行するとその様子を見ることができます。この例では、スタックの最下位にあるデバイスが OID_PNP_SET_POWER にしがみついていて他が動けない可能性があります。 NDIS ドライバーは OID を 1 秒以上保留しないはずなので、そのデバイスがなぜ OID を長く保留したままにしているのかを調査し、問題を解決することができます。
例
正常に動作しているシステムで保留中の OIDS の例を見るには、ミニポートの OID 要求ハンドラー ルーチン (ミニポートの対応するミニポート ドライバー内) にブレークポイントを設定します。 まず、!ndiskd.minidriver コマンドをパラメーターなしで実行して、システム上のミニポート ドライバーのリストを取得します。 この出力例では、kdnic ミニドライバーのハンドル fffdf801418d650 を探します。
3: kd> !ndiskd.minidriver
ffffdf8015a98380 - tunnel
ffffdf801418d650 - kdnic
ミニドライバーのハンドルをクリックし、詳細ページの下部にある "Handlers" リンクをクリックすると、ハンドラーのリストが表示されます。 あるいは、!ndiskd.minidriver -handle -handlers コマンドを入力することもできます。 ミニドライバーのハンドラーのリストが表示されたら、OidRequestHandler を探します。そのハンドルはこの例で はffff80f1fd71c90 です。
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
次に、OidRequestHandler の右側にある "bp" リンクをクリックするか、そのハンドルと共に bp -handle コマンドを入力して、そのルーチンにブレークポイントを設定します。 次に g コマンドを入力して、デバッグ対象マシンを実行し、設定したブレークポイントでヒットさせます。
2: kd> bp fffff80f1fd71c90
2: kd> g
Breakpoint 1 hit
fffff80f`1fd71c90 448b4204 mov r8d,dword ptr [rdx+4]
前の例で示したように、ミニドライバーの OID 要求ハンドラー ルーチンでブレークポイントをトリガーしたら、!ndiskd.oid コマンドを実行して、システム上の保留中の OID のリストを表示することができます。
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
この例では、保留中の OIDは OID_GEN_STATISTICS です。 !ndiskd.oid の結果を見て、フィルターが OID 要求のクローンを作成してスタックに渡し、OID は通常フィルターから次のフィルター、ミニポートへと渡されることを思い出してください。 !ndiskd.oid の結果を見て、フィルターが OID 要求のクローンを作成してスタックに渡し、OID は通常フィルターから次のフィルター、ミニポートへと渡されることを思い出してください。