フィルター ドライバーの初期化
フィルター ドライバーの初期化は、システムがドライバーを読み込んだ直後に発生します。 フィルター ドライバーはシステム サービスとして読み込まれます。 システムは、ミニポート ドライバーの読み込み前、実行中、読み込み後にいつでもフィルター ドライバーを読み込むことができます。 NDIS は、フィルター ドライバーでサポートされている種類のミニポート アダプターが使用可能になり、フィルター ドライバーの初期化が完了した後、ミニポート アダプターにフィルター モジュールをアタッチできます。
ドライバー スタックの起動中に、フィルター ドライバーがまだ読み込まれていない場合は、システムによって読み込まれます。 フィルター モジュールを含むドライバー スタックの開始に関する詳細については、「ドライバー スタックの開始」を参照してください。
フィルター ドライバーが読み込まれた後、システムはドライバーの DriverEntry ルーチンを呼び出します。
システムは DriverEntry に次の 2 つの引数を渡します。
I/O システムによって作成されたドライバー オブジェクトへのポインター。
ドライバー固有のパラメーターを格納する場所を指定するレジストリ パスへのポインター。
DriverEntry は、ドライバーが NDIS フィルター ドライバーとして正常に登録された場合、STATUS_SUCCESS またはその同等の NDIS_STATUS_SUCCESS を返します。 DriverEntry が NdisXxx 関数またはカーネル モード サポート ルーチンによって返されたエラー状態を伝達することによって初期化に失敗した場合、ドライバーは再読み込みされません。 DriverEntry は同時に実行する必要があります。つまり、STATUS_PENDING またはその同等の NDIS_STATUS_PENDING を返すことはできません。
フィルター ドライバーは、フィルター ドライバーとして NDIS に 登録するときに NdisFRegisterFilterDriver 関数にドライバー オブジェクトを渡します。 ドライバーは、レジストリ パスを使用して構成情報を取得できます。 フィルター ドライバーの構成情報にアクセスする方法の詳細については、「フィルター ドライバーの構成情報へのアクセス」を参照してください。
フィルター ドライバーは、その DriverEntry ルーチンから NdisFRegisterFilterDriver を呼び出します 。 フィルター ドライバーは、FilterCharacteristicsパラメーターで NdisFRegisterFilterDriver に NDIS_FILTER_DRIVER_CHARACTERISTICS 構造体を渡すことによって、一連の FilterXxx 関数をエクスポートします。
NDIS_FILTER_DRIVER_CHARACTERISTICS 構造体は、必須および省略可能な FilterXxx 関数のエントリ ポイントを 指定します。 一部の省略可能な関数はバイパスできます。 関数のバイパスの詳細については、「データ バイパス モード」を参照してください。
NdisFRegisterFilterDriver を呼び出すドライバーは、FilterXxx 関数のいずれかをすぐに呼び出すために準備する必要があります。
NDIS_FILTER_DRIVER_CHARACTERISTICS 構造体は、これらに必須の FilterXxx 関数のエントリ ポイントを指定します。
NDIS_FILTER_DRIVER_CHARACTERISTICS 構造体は、実行時に変更できない次の省略可能な FilterXxx 関数のエントリ ポイントを指定します。
FilterCancelSendNetBufferLists
NDIS_FILTER_DRIVER_CHARACTERISTICS 構造体は、実行時に変更できない次の省略可能な FilterXxx 関数の既定のエントリ ポイントを指定します。
FilterSendNetBufferListsComplete
上記の 4 つの関数は、NDIS_FILTER_PARTIAL_CHARACTERISTICS 構造体でも定義されています。 この構造体は、FilterSetModuleOptions 関数から NdisSetOptionalHandlers 関数を呼び出すことによって、実行時に変更できる関数を指定します。 フィルター ドライバーが実行時にこれらの部分的な特性を変更する場合は、FilterSetModuleOptions のエントリ ポイントを提供する必要があります。 部分的な特性は、フィルター モジュールごとに異なる場合があります。 詳細については、「フィルター モジュールの開始」をご覧ください。
NDIS は、NdisFRegisterFilterDriver への呼び出しのコンテキスト内で FilterSetOptions 関数を 呼び出します。 FilterSetOptions は、オプションのサービスを NDIS に登録します。 詳細については、「オプションのフィルター ドライバー サービスの構成」を参照してください。
NdisFRegisterFilterDriver の呼び出しが成功した場合、NDIS は、フィルター ドライバー ハンドルで NdisFilterDriverHandle の変数を埋めます。 フィルター ドライバーはこのハンドルを保存し、その後、NdisFDeregisterFilterDriver などの NDIS 関数 にこのハンドルを渡します。この関数は、入力パラメーターとしてフィルター ドライバー ハンドルを必要とします。 ドライバーがアンロードされると、NdisFRegisterFilterDriver によって割り当てられたドライバー リソースを解放する NdisFDeregisterFilterDriver 関数を呼び出す必要があります。
FilterSetOptions が返されると、フィルター モジュールは Detached 状態になります。 NDIS は、FilterSetOptions への呼び出しが返された後、いつでもフィルター ドライバーの FilterAttach 関数を呼び出すことができます。 ドライバーは、FilterAttach 関数でフィルター モジュール固有の初期化を実行します。 ドライバー スタックへのフィルター モジュールのアタッチの詳細については、「フィルター モジュールのアタッチ」を参照してください。
フィルター ドライバーは、DriverEntry で必要なその他のドライバー固有の初期化も実行します。 フィルター ドライバーは、FilterDriverUnload ルーチンで割り当てるドライバー固有のリソースを解放する必要があります。 詳細については、「フィルター ドライバーのアンロード」を参照してください。