プロトコル ドライバーの初期化
システムは、ドライバーを読み込んだ後、プロトコル ドライバーの DriverEntry ルーチンを呼び出します。 プロトコル ドライバーはシステム サービスとして読み込まれます。 これらは、ミニポート ドライバーの読み込み前、実行中、または読み込み後にいつでも読み込むことができます。
プロトコル ドライバーはドライバー リソースを割り当て、DriverEntry に ProtocolXxx 関数を登録します。 これには、CoNDIS クライアントとスタンドアロンの通話マネージャーが含まれます。 その ProtocolXxx 関数を NDIS に登録するために、プロトコル ドライバーは NdisRegisterProtocolDriver 関数を呼び出します。
DriverEntry は、ドライバーが NDIS プロトコル ドライバーとして正常に登録された場合、STATUS_SUCCESS またはその同等の NDIS_STATUS_SUCCESS を返します。 DriverEntry が NdisXxx 関数またはカーネル モード サポート ルーチンによって返されたエラー状態を伝達することによって初期化に失敗した場合、ドライバーは再読み込みされません。 DriverEntry は同時に実行する必要があります。つまり、STATUS_PENDING またはその同等の NDIS_STATUS_PENDING を返すことはできません。
NDIS プロトコル ドライバーの DriverEntry 関数は、NdisRegisterProtocolDriver 関数を呼び出す必要があります。 ドライバーの ProtocolXxx エントリ ポイントを NDIS ライブラリに登録するために、プロトコル ドライバーは、NDIS_PROTOCOL_DRIVER_CHARACTERISTICS 構造体を初期化し、NdisRegisterProtocolDriver に渡します。
NdisRegisterProtocolDriver を呼び出すドライバーは、ProtocolXxx 関数のいずれかをすぐに呼び出すために準備する必要があります。
NDIS プロトコル ドライバーは、次の ProtocolXxx 関数を提供します。これは、レガシー ドライバーが提供する関数の更新バージョンです。
ProtocolCloseAdapterCompleteEx
NDIS プロトコル ドライバーは、送受信操作に次の ProtocolXxx 関数を提供します。
ProtocolSendNetBufferListsComplete
すべての種類の NDIS プロトコル ドライバーは、完全に機能する ProtocolBindAdapterEx と ProtocolUnbindAdapterEx 関数を登録して、プラグ アンド プレイ (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 構造体を初期化し、NdisSetOptionalHandlers の OptionalHandlers パラメーターでそれを渡します。
CoNDIS スタンドアロン通話マネージャーは、ProtocolSetOptions 関数から NdisSetOptionalHandlers 関数も呼び出す必要があります。 ドライバーは、NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS 構造体を初期化し、NdisSetOptionalHandlers の OptionalHandlers パラメーターでそれを渡します。
MCM はプロトコル ドライバーではありません。 したがって、MiniportSetOptions 関数から NdisSetOptionalHandlers 関数を呼び出す必要があります。 MCMは、NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS 構造体を初期化し、NdisSetOptionalHandlers の OptionalHandlers パラメーターでそれを渡します。
NDIS で登録を解除するために、プロトコル ドライバーは、その Unload ルーチンから NdisDeregisterProtocolDriver を呼び出します。
プロトコル ドライバーをアンインストールする前にクリーンアップ操作を実行するために、プロトコル ドライバーは ProtocolUninstall 関数を登録できます。 ProtocolUninstall 関数は省略可能です。 たとえば、中間ドライバーのプロトコルの下端には ProtocolUninstall 関数が必要な場合があります。 中間ドライバーは、NDIS がその MiniportDriverUnload 関数を呼び出す前に ProtocolUninstall でそのプロトコル エッジのリソースを解放できます。