プロトコル ドライバーの初期化

システムは、ドライバーを読み込んだ後、プロトコル ドライバーの DriverEntry ルーチンを呼び出します。 プロトコル ドライバーはシステム サービスとして読み込まれます。 これらは、ミニポート ドライバーの読み込み前、実行中、または読み込み後にいつでも読み込むことができます。

プロトコル ドライバーはドライバー リソースを割り当て、DriverEntryProtocolXxx 関数を登録します。 これには、CoNDIS クライアントとスタンドアロンの通話マネージャーが含まれます。 その ProtocolXxx 関数を NDIS に登録するために、プロトコル ドライバーは NdisRegisterProtocolDriver 関数を呼び出します。

DriverEntry は、ドライバーが NDIS プロトコル ドライバーとして正常に登録された場合、STATUS_SUCCESS またはその同等の NDIS_STATUS_SUCCESS を返します。 DriverEntryNdisXxx 関数またはカーネル モード サポート ルーチンによって返されたエラー状態を伝達することによって初期化に失敗した場合、ドライバーは再読み込みされません。 DriverEntry は同時に実行する必要があります。つまり、STATUS_PENDING またはその同等の NDIS_STATUS_PENDING を返すことはできません。

NDIS プロトコル ドライバーの DriverEntry 関数は、NdisRegisterProtocolDriver 関数を呼び出す必要があります。 ドライバーの ProtocolXxx エントリ ポイントを NDIS ライブラリに登録するために、プロトコル ドライバーは、NDIS_PROTOCOL_DRIVER_CHARACTERISTICS 構造体を初期化し、NdisRegisterProtocolDriver に渡します。

NdisRegisterProtocolDriver を呼び出すドライバーは、ProtocolXxx 関数のいずれかをすぐに呼び出すために準備する必要があります。

NDIS プロトコル ドライバーは、次の ProtocolXxx 関数を提供します。これは、レガシー ドライバーが提供する関数の更新バージョンです。

ProtocolSetOptions

ProtocolBindAdapterEx

ProtocolUnbindAdapterEx

ProtocolOpenAdapterCompleteEx

ProtocolCloseAdapterCompleteEx

ProtocolNetPnPEvent

ProtocolUninstall

NDIS プロトコル ドライバーは、送受信操作に次の ProtocolXxx 関数を提供します。

ProtocolReceiveNetBufferLists

ProtocolSendNetBufferListsComplete

すべての種類の NDIS プロトコル ドライバーは、完全に機能する ProtocolBindAdapterExProtocolUnbindAdapterEx 関数を登録して、プラグ アンド プレイ (PnP) をサポートする必要があります。 一般に、DriverEntry 関数は、状態値が STATUS_SUCCESS または NDIS_STATUS_SUCCESS のコントロールを返す直前に NdisRegisterProtocolDriver を呼び出す必要があります。

NDIS で定義された ProtocolXxx 関数に加えて、標準カーネル モード ドライバー ルーチンのセットをエクスポートする任意のプロトコル ドライバーは、その DriverEntry 関数に渡される特定のドライバー オブジェクト内のドライバー ルーチンにおけるエントリ ポイントを設定する必要があります。 このようなプロトコル ドライバーの DriverEntry 関数の機能に関する詳細については、「DriverEntry ルーチンの記述」を参照してください。

ドライバーがネットワーク I/O 操作を実行するために必要なリソースの割り当てが失敗した場合、DriverEntry は、STATUS_SUCCESS または NDIS_STATUS_SUCCESS 以外の状態のコントロールを返す前に、既に割り当てられているすべてのリソースを解放する必要があります。

NdisRegisterProtocolDriver の呼び出しが成功した後にエラーが発生した場合、ドライバーは、DriverEntry が返される前に NdisDeregisterProtocolDriver 関数を呼び出す必要があります。

プロトコル ドライバーが省略可能なサービスを構成できるようにするために、NDIS は、NdisRegisterProtocolDriver へのプロトコル ドライバーの呼び出しのコンテキスト内で ProtocolSetOptions 関数を呼び出します。 省略可能なサービスの詳細については、「オプションのプロトコル ドライバー サービスの構成」を参照してください。

CoNDIS クライアント ドライバーは、ProtocolSetOptions 関数から NdisSetOptionalHandlers 関数を呼び出す必要があります。 ドライバーは、NDIS_CO_CLIENT_OPTIONAL_HANDLERS 構造体を初期化し、NdisSetOptionalHandlersOptionalHandlers パラメーターでそれを渡します。

CoNDIS スタンドアロン通話マネージャーは、ProtocolSetOptions 関数から NdisSetOptionalHandlers 関数も呼び出す必要があります。 ドライバーは、NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS 構造体を初期化し、NdisSetOptionalHandlersOptionalHandlers パラメーターでそれを渡します。

MCM はプロトコル ドライバーではありません。 したがって、MiniportSetOptions 関数から NdisSetOptionalHandlers 関数を呼び出す必要があります。 MCMは、NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS 構造体を初期化し、NdisSetOptionalHandlersOptionalHandlers パラメーターでそれを渡します。

NDIS で登録を解除するために、プロトコル ドライバーは、その Unload ルーチンから NdisDeregisterProtocolDriver を呼び出します。

プロトコル ドライバーをアンインストールする前にクリーンアップ操作を実行するために、プロトコル ドライバーは ProtocolUninstall 関数を登録できます。 ProtocolUninstall 関数は省略可能です。 たとえば、中間ドライバーのプロトコルの下端には ProtocolUninstall 関数が必要な場合があります。 中間ドライバーは、NDIS がその MiniportDriverUnload 関数を呼び出す前に ProtocolUninstall でそのプロトコル エッジのリソースを解放できます。