次の方法で共有


PROTOCOL_OID_REQUEST_COMPLETEコールバック関数 (ndis.h)

ProtocolOidRequestComplete 関数は、NdisOidRequest 関数がNDIS_STATUS_PENDING返したプロトコル ドライバーによって開始される OID 要求の処理を完了します。

PROTOCOL_OID_REQUEST_COMPLETE 型を使用して関数を宣言する必要があります。 詳細については、次の例のセクションを参照してください。
 

構文

PROTOCOL_OID_REQUEST_COMPLETE ProtocolOidRequestComplete;

void ProtocolOidRequestComplete(
  [in] NDIS_HANDLE ProtocolBindingContext,
  [in] PNDIS_OID_REQUEST OidRequest,
  [in] NDIS_STATUS Status
)
{...}

パラメーター

[in] ProtocolBindingContext

プロトコル ドライバーがバインドごとの実行時状態を維持する、プロトコル ドライバーによって割り当てられたコンテキスト領域へのハンドル。 ドライバーは、NdisOpenAdapterEx 関数を呼び出すときに、このハンドルを提供しました。

[in] OidRequest

以前に NdisOidRequest 関数に渡されたプロトコル ドライバー提供の NDIS_OID_REQUEST 構造体へのポインター。

[in] Status

要求の最終的な状態。 基になるドライバーまたは NDIS は、この最終的な状態を決定します。 このパラメーターは、OidRequestComplete が OidRequest の情報に対して行う処理決定します。

戻り値

何一つ

備考

ProtocolOidRequestComplete では、次のように Status の入力値が使用されます。

  • 状態 がNDIS_STATUS_SUCCESSされている場合は、次の操作を行います。 NDIS_OID_REQUEST 構造体の BytesRead または BytesWritten メンバーが NDIS または基になるドライバーによって設定され、設定操作で InformationBuffer でバッファーから NIC に転送されたプロトコル ドライバー指定の情報の量、またはクエリ操作に応答して InformationBuffer で返された情報の量を指定します。

    プロトコル ドライバーがクエリを実行した場合、ProtocolOidRequestComplete は、Oid メンバーの値に応じて、プロトコル ドライバーによって決定される任意の方法で、InformationBuffer で返されたデータを使用できます。

    たとえば、プロトコル ドライバーが最初にクエリ OID_GEN_MAXIMUM_SEND_PACKETSProtocolOidRequestComplete は、NdisSendNetBufferLIsts 関数への後続の呼び出しに対してドライバーが設定する未処理の送信の数を調整するために、ProtocolBindingContext 領域に状態変数を設定する場合があります。

  • Status がNDIS_STATUS_INVALID_LENGTHまたはNDIS_STATUS_BUFFER_TOO_SHORTの場合、BytesNeeded メンバーは、要求された操作を実行するために必要な InformationBufferLength メンバーの OID 固有の値を指定します。

    このような状況では、ProtocolOidRequestComplete は、要求に十分なバッファー領域を割り当て、必要な InformationBufferLength と同じ Oidを使用して別のNDIS_OID_REQUEST構造体を設定し、NdisOidRequest 関数の呼び出しを再試行できます。

    ProtocolOidRequestComplete は、NdisOidRequest 関数のリファレンスで説明されているように、他の特定のNDIS_STATUS_ XXX 引数に対する要求も再試行できます。

  • 状態 が回復不可能なエラーであるNDIS_STATUS_ XXX 値である場合、ProtocolOidRequestComplete は、NDIS_OID_REQUEST構造体に割り当てられたメモリを解放し、ドライバーがバインドを閉じる必要があるかどうかを判断するか、バインディングに対する継続的なネットワーク I/O 操作を処理するようにバインド固有の状態情報を調整する必要があります。
グローバル クエリとセットの場合、基になるコネクションレス ミニポート ドライバーの NdisMOidRequestComplete 関数の呼び出しにより、NDIS は ProtocolOidRequestComplete 関数を呼び出します。 NDIS は、ミニポート ドライバーによって決定された 状態、ProtocolOidRequestComplete への入力 状態 として NdisMOidRequestComplete に渡転送します。

バインド固有のクエリの場合、NDIS は、ProtocolOidRequestComplete 関数自体を呼び出します。 NDIS ライブラリは、すべてのミニポート ドライバーのバインドを保持するため、NDIS は、システムがフィルター ライブラリを提供する 1 つとして、その中の種類を報告する基になるドライバーについてのみバインド固有の情報を返すことができます。 NDIS は、プロトコル ドライバーによって開始されるバインディング固有のクエリのNDIS_STATUS_NOT_SUPPORTEDを他のミニポート ドライバーに返します。

システム定義 OID の詳細については、「NDIS OID を参照してください。

ProtocolOidRequestComplete は、プロトコル ドライバーが状態 で返される NdisOidRequest 状態コードを調べる時間前に呼び出すことができます。

NDIS は、IRQL <= DISPATCH_LEVEL で ProtocolOidRequestComplete 呼び出します。

の例

ProtocolOidRequestComplete 関数を定義するには、まず、定義する関数の型を識別する関数宣言を指定する必要があります。 Windows には、ドライバーの関数の種類のセットが用意されています。 関数の種類を使用して関数を宣言すると、ドライバー のコード分析、静的ドライバー検証ツール (SDV)、およびその他の検証ツールをすると、エラーが検出され、Windows オペレーティング システムのドライバーを記述するための要件になります。

たとえば、"MyOidRequestComplete" という名前の ProtocolOidRequestComplete 関数を定義するには、次のコード例に示すように PROTOCOL_OID_REQUEST_COMPLETE 型を使用します。

PROTOCOL_OID_REQUEST_COMPLETE MyOidRequestComplete;

次に、次のように関数を実装します。

_Use_decl_annotations_
VOID
 MyOidRequestComplete(
    NDIS_HANDLE  ProtocolBindingContext,
    PNDIS_OID_REQUEST  OidRequest,
    NDIS_STATUS  Status
    )
  {...}

PROTOCOL_OID_REQUEST_COMPLETE 関数の種類は、Ndis.h ヘッダー ファイルで定義されています。 コード分析ツールの実行時にエラーをより正確に識別するには、Use_decl_annotations 注釈を関数定義に追加してください。 Use_decl_annotations 注釈を使用すると、ヘッダー ファイル内の PROTOCOL_OID_REQUEST_COMPLETE 関数型に適用される注釈が使用されます。 関数宣言の要件の詳細については、「ndis ドライバーの の関数の役割の種類を使用して関数を宣言するを参照してください。

Use_decl_annotationsの詳細については、「関数の動作に注釈を付ける」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント NDIS 6.0 以降でサポートされています。
ターゲット プラットフォーム ウィンドウズ
ヘッダー ndis.h (Ndis.h を含む)
IRQL <= DISPATCH_LEVEL

関連項目

NDIS_OID_REQUEST

NdisMOidRequestComplete

NdisOidRequest

NdisOpenAdapterEx

OID_GEN_MAXIMUM_SEND_PACKETS