Share via


NDIS フィルター ドライバーでの OID 要求のフィルター処理

フィルター ドライバーは、基になるドライバーによって発生した OID リクエストを処理できます。 NDIS は、各 OID リクエストを 処理する FilterOidRequest 関数を呼び出します。 フィルター ドライバーは、NdisFOidRequest 関数を呼び出すことによって、基になるドライバーに OID リクエストを転送できます。

NDIS は、OID 要求をキャンセルするフィルター ドライバーの FilterCancelOidRequest 関数を呼び出すことができます。 NDIS が FilterCancelOidRequest を呼び出すとき、フィルター ドライバーはできるだけ早く NdisFOidRequest 関数を呼び出そうとする必要があります。

フィルター処理された OID リクエストを示している図は次の通りです。

Diagram illustrating the process of a filtered OID request.

フィルター ドライバーは、FilterOidRequest からそれぞれNDIS_STATUS_SUCCESSまたはNDIS_STATUS_PENDINGを返すことによって、OID 要求を同期的または非同期的に完了できます。 FilterOidRequest は、エラー状態で同期的に完了することもできます。

OID セットリクエストを正常に処理するフィルターは、OID セットリクエストから戻ると、NDIS_OID_REQUEST 構造体の SupportedRevision メンバーを設定する必要があります。 SupportedRevision メンバーは、ドライバーがサポートしたリビジョンのOIDリクエストについてイニシエーターに通知します。 NDIS 構造体の中のバージョン情報については、「NDIS バージョン情報の指定」を参照してください。

FilterOidRequestNDIS_STATUS_PENDINGを返す場合は、OID リクエストの完了後に NdisFOidRequestComplete 関数を呼び出す必要があります。 この場合、ドライバーは NdisFOidRequestCompleteOidRequest パラメーターでリクエストの結果を渡します。 ドライバーは、NdisFOidRequestCompleteStatus パラメーターでリクエストの最終的な状態を渡します。

FilterOidRequest NDIS_STATUS_SUCCESS を返す場合は、NDIS_OID_REQUEST 構造体の OidRequest パラメーターにクエリ要求の結果を返します。 この場合、ドライバーは 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のクエリへの応答を受信した後、フィルターは応答からヘッダーのサイズを減算します。 ドライバーは、送信された各パケットの前にヘッダーを挿入し、受信した各パケットのヘッダーを削除するのでそのヘッダー サイズを減算します。