データ バイパス モード

フィルター ドライバー のデータ バイパス モード を使用すると、システムのパフォーマンスを向上させることができます。 NDIS は、バイパスされる FilterXxx関数を呼び出しません。 たとえば、特定のフィルター アプリケーションに送信サービスと受信サービスが必要ない場合、フィルター ドライバーは送信機能と受信機能をバイパスできます。

フィルター ドライバーは、NdisFRegisterFilterDriver 関数を呼び出すときに、ドライバーの初期化中にバイパスできる関数の既定のエントリ ポイントを指定します。 エントリ ポイントは、 既定でバイパスされる関数の場合は NULL です。 初期化の詳細については、フィルター ドライバーの初期化を参照してください。

実行時にバイパス状態を変更するには、ドライバーの初期化中に、ドライバーで FilterSetModuleOptions 関数のエントリ ポイント を指定する 必要があります。 ドライバーは、NDIS_FILTER_PARTIAL_CHARACTERISTICS構造体を初期化し、FilterSetModuleOptions のコンテキストNdisSetOptionalHandlers 関数に新しい特性を渡すことができます。

NDIS は、再起動操作の開始時に FilterSetModuleOptions 関数 (ある場合) を呼び出します。 フィルター ドライバーは、フィルター モジュールごとに個別にバイパス モードを設定できます。 詳細については、「フィルター モジュールの開始」をご覧ください。

フィルター ドライバーは、NDIS_FILTER_DRIVER_CHARACTERISTICS構造体で指定されている次のオプションのFilterXxx関数をバイパスできます。

FilterSendNetBufferLists

FilterSendNetBufferListsComplete

FilterCancelSendNetBufferLists

FilterReturnNetBufferLists

FilterReceiveNetBufferLists

FilterXxx 関数をバイパス モードに設定するには、フィルター ドライバーは、その関数のエントリ ポイントの NULL を指定します。 ただし、ドライバーが関連付けられている FilterXxx 関数を持つ NDIS 関数を呼び出す場合は、その FilterXxx 関数のエントリ ポイントを提供する必要があります。 たとえば、ドライバーが NdisFIndicateReceiveNetBufferLists 関数を呼び出す場合は、FilterReturnNetBufferLists 関数を提供する必要があります。

フィルター ドライバーが FilterSendNetBufferLists 関数を指定し、キューに要求を送信する場合は、FilterCancelSendNetBufferLists 関数も指定する必要があります。

フィルター ドライバーが FilterReturnNetBufferLists または FilterReceiveNetBufferLists 関数を指定する場合、ドライバーは FilterStatus 関数も指定する必要があります。

実行時にバイパス モードの設定を変更するには、フィルター ドライバーは NdisFRestartFilter 関数を呼び出すことができます。 NdisFRestartFilter は、指定されたフィルター モジュールの再起動操作が続く一時停止操作をスケジュールします。 NDIS が FilterSetModuleOptions を呼び出すとき、フィルター ドライバーは NdisSetOptionalHandlers を呼び出し、エントリ ポイントの新しいセットを指定することによって、そのフィルター モジュールの関数を変更できます。

一時停止して再起動すると、一部のネットワーク パケットが送信パス、受信パス、またはその両方でドロップされる可能性があります。 信頼性の高いトランスポート メカニズムを提供するネットワーク プロトコルは、パケットが失われた場合にネットワーク I/O 操作を再試行する可能性がありますが、信頼性を保証しない他のプロトコルは操作を再試行しません。

フィルター ドライバーは、オプションのドライバー サービスをサポートする追加のオプション機能を登録できます。 ドライバーは、FilterSetOptions 関数にこれらの省略可能なサービスを登録します。 これらのオプション サービスの詳細については、「オプションのフィルター ドライバー サービスの構成」を参照してください