フィルター ドライバーは、基になるドライバーによって発生した OID 要求を処理できます。 NDIS は、各 OID 要求を処理する FilterOidRequest 関数を呼び出します。 フィルター ドライバーは、 NdisFOidRequest 関数を呼び出すことによって、基になるドライバーに OID 要求を転送できます。
NDIS は、OID 要求をキャンセルするフィルター ドライバーの FilterCancelOidRequest 関数を呼び出すことができます。 NDIS が FilterCancelOidRequest を呼び出すとき、フィルター ドライバーはできるだけ早く NdisFOidRequest 関数を呼び出そうとする必要があります。
次の図は、フィルター処理された OID 要求を示しています。
フィルター ドライバーは、 FilterOidRequest からそれぞれNDIS_STATUS_SUCCESSまたはNDIS_STATUS_PENDINGを返すことによって、OID 要求を同期的または非同期的に完了できます。 FilterOidRequest は、エラー状態で同期的に完了することもできます。
OID セット要求を正常に処理するフィルター ドライバーは、OID セット要求から戻った時点で、NDIS_OID_REQUEST構造体の SupportedRevision メンバーを設定する必要があります。 SupportedRevision メンバーは、ドライバーがサポートしているリビジョンに関する OID 要求をイニシエーターに通知します。 NDIS 構造体のバージョン情報の詳細については、「 NDIS バージョン情報の指定」を参照してください。
FilterOidRequest がNDIS_STATUS_PENDINGを返す場合は、OID 要求の完了後に NdisFOidRequestComplete 関数を呼び出す必要があります。 この場合、ドライバーは NdisFOidRequestComplete の OidRequest パラメーターで要求の結果を渡します。 ドライバーは、NdisFOidRequestComplete の Status パラメーターで要求の最終的な状態を渡します。
FilterOidRequest がNDIS_STATUS_SUCCESSを返す場合は、OidRequest パラメーターのNDIS_OID_REQUEST構造体でクエリ要求の結果を返します。 この場合、ドライバーは NdisFOidRequestComplete 関数を呼び出しません。
基になるドライバーに OID 要求を転送するには、フィルター ドライバーは NdisFOidRequest 関数を呼び出します。 要求を基になるドライバーに転送しない場合、フィルター ドライバーはすぐに要求を完了できます。 転送せずに要求を完了するために、ドライバーは FilterOidRequest からNDIS_STATUS_SUCCESS (またはエラー状態) を返すか、NDIS_STATUS_PENDINGを返した後 に NdisFOidRequestComplete を呼び出すことができます。
手記 ドライバーが NdisFOidRequest を呼び出す前に、ドライバーは 、NDIS_OID_REQUEST 構造体を割り当て、 NdisAllocateCloneOidRequest を呼び出すことによって、新しい構造体に要求情報を転送する必要があります。
転送された要求は、フィルター ドライバーによって開始された要求と同じように処理されます。 詳細については、「 NDIS フィルター ドライバーからの OID 要求の生成」を参照してください。
基になるドライバーが転送された要求を完了した後、フィルター ドライバーは、必要に応じて、応答を変更し、上にあるドライバーに渡すことができます。
フィルター ドライバーは、 再起動、 実行中、 一時停止中、または 一時停止 状態のときに、上にあるドライバーから OID 要求を受信できます。
手記 ミニポート ドライバーと同様に、フィルター ドライバーは一度に 1 つの OID 要求のみを受信できます。 NDIS はフィルター モジュールに送信される要求をシリアル化するため、フィルター ドライバーは、前の要求を完了する前に FilterOidRequest で呼び出すことはできません。
OID 要求を変更するフィルター ドライバーの例を次に示します。
- フィルター ドライバーは、ヘッダーを追加します。 この場合、ドライバーは、基になるドライバーから OID_GEN_MAXIMUM_FRAME_SIZE のクエリへの応答を受信した後、フィルターは応答からヘッダーのサイズを減算します。 ドライバーは、送信された各パケットの前にヘッダーを挿入し、受信した各パケットのヘッダーを削除するため、そのヘッダー サイズを減算します。