仮想ミニポートの初期化
中間ドライバーは、基になるミニポート アダプターを正常に開いた後、その仮想ミニポートを初期化し、要求を受け入れて、その仮想ミニポートに送信する準備ができています。 中間ドライバーは、その ProtocolBindAdapterEx 関数から NdisIMInitializeDeviceInstanceEx を 1 回以上呼び出して、1 つ以上の仮想ミニポートの初期化を要求します。
注: 中間ドライバーは、基になるミニポート アダプターを開くときに NdisIMInitializeDeviceInstanceEx を呼び出す必要はありません。 仮想ミニポートと開いているアダプターは、1 対 1 の関係である必要はありません。
NdisIMInitializeDeviceInstanceEx の DriverInstance パラメーターを、初期化する仮想ミニポートのデバイス名に設定します。 中間ドライバーは、UpperBindings レジストリ キーからデバイス名を取得します。
単一の物理 NIC 上に複数の仮想ミニポートを階層化する n 対 1 の MUX 中間ドライバーの場合は、すべての仮想ミニポートのデバイス名が必要です。 MUX 中間ドライバーには、仮想ミニポート デバイス名の一覧を管理する通知オブジェクトが必要です。 一覧の推奨される場所は UpperBindings レジストリ キーです。 この場合、UpperBindings レジストリ キーは、デバイス名の一覧を含む MULTI_SZ エントリです。 MUX 中間ドライバーは、デバイス名の一覧で指定されている各デバイス名に対して NdisIMInitializeDeviceInstanceEx を 1 回呼び出します。
NdisIMInitializeDeviceInstanceEx を呼び出すと、NDIS がデバイスを起動する IRP_MN_START_DEVICE を受け取った場合、中間ドライバーの MiniportInitializeEx 関数を呼び出して、指定された仮想ミニポートの初期化を実行します。 NDIS がこのような IRP を受信しない場合、NDIS は中間ドライバーの MiniportInitializeEx 関数を呼び出しません。 MiniportInitializeEx への呼び出しは後で発生する可能性があるため、NdisIMInitializeDeviceInstanceEx の呼び出しのコンテキスト内では必ずしもありません。 NDIS が NdisIMInitializeDeviceInstanceEx への呼び出しで参照されている仮想ミニポートの MiniportInitializeEx を呼び出さない場合、中間ドライバーは、仮想ミニポートの初期化を取り消すために NdisIMCancelInitializeDeviceInstance を呼び出す必要があります。 たとえば、中間ドライバーが基になるミニポートへの正常なバインドに応答して仮想ミニポートを作成するとします。 NDIS が MiniportInitializeEx を呼び出す前にそのバインドが削除された場合、中間ドライバーは、ミニポートの初期化を取り消す NdisIMCancelInitializeDeviceInstance を呼び出す必要があります。
MiniportInitializeEx は、仮想ミニポート固有のコンテキスト領域を割り当てて初期化する必要があります。 コンテキスト領域の指定の詳細については、「仮想ミニポートの初期化」を参照してください。
中間ドライバーは、逆シリアル化されたドライバーとして動作する必要があります。 逆シリアル化されたドライバーの詳細については、「逆シリアル化された NDIS ミニポート ドライバー」を参照してください。
中間ドライバーは、保持している状態情報が適切に初期化されていることを確認する必要があります。 たとえば、ドライバーで送信関連のリソースが必要な場合は、MiniportSendNetBufferLists が次の下位レイヤー、つまり NET_BUFFER_LIST 構造体プールに送信するネットワーク データにおける新しい NET_BUFFER_LIST 構造体を現時点で割り当てることができます。