!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 は通常フィルターから次のフィルター、ミニポートへと渡されることを思い出してください。

関連項目

ネットワーク ドライバー設計ガイド

Windows Vista 以降のネットワーク リファレンス

ネットワークスタックのデバッグ

NDIS 拡張コマンド (Ndiskd.dll)

!ndiskd.help

0x9F bug check

OID_PNP_SET_POWER

bp、bu、bm (ブレークポイントの設定)

OID_GEN_STATISTICS

NDIS OIDs

NDIS OID 要求インターフェイス