次の方法で共有


NPI_PROVIDER_ATTACH_CLIENT_FN コールバック関数 (netioddk.h)

プロバイダー モジュールの ProviderAttachClient コールバック関数は、プロバイダー モジュールをクライアント モジュールにアタッチします。

構文

NPI_PROVIDER_ATTACH_CLIENT_FN NpiProviderAttachClientFn;

NTSTATUS NpiProviderAttachClientFn(
  [in]  HANDLE NmrBindingHandle,
  [in]  PVOID ProviderContext,
  [in]  PNPI_REGISTRATION_INSTANCE ClientRegistrationInstance,
  [in]  PVOID ClientBindingContext,
  [in]  const VOID *ClientDispatch,
  [out] PVOID *ProviderBindingContext,
  [out] const VOID **ProviderDispatch
)
{...}

パラメーター

[in] NmrBindingHandle

クライアント モジュールとプロバイダー モジュールの間のバインドを表すために、NMR によって使用されるハンドル。

[in] ProviderContext

プロバイダー モジュールの登録コンテキストへのポインター。 プロバイダー モジュールは、NmrRegisterProvider 関数を呼び出して自身をNMR に登録するときに、このポインターをNMR に渡します。

[in] ClientRegistrationInstance

へのポインター NPI_REGISTRATION_INSTANCE 構造体。 この構造体には、クライアント モジュールの登録データが含まれています。

[in] ClientBindingContext

クライアント モジュールとプロバイダー モジュールの間のバインディングに対するクライアント モジュールのコンテキストへのポインター。 クライアント モジュールはこのコンテキストを使用して、バインディングの状態を追跡します。 クライアント モジュールのバインド コンテキストの内容は、プロバイダー モジュールに対して不透明です。 プロバイダー モジュールは、クライアント モジュールのバインド コンテキストを必要とするクライアント モジュールの NPI コールバック関数を呼び出すたびに、このポインターをクライアント モジュールに渡します。

[in] ClientDispatch

クライアント モジュールの NPI コールバック関数のディスパッチ テーブル 含む定数構造体へのポインター。 構造体の内容は NPI 固有です。 NPI でクライアント ディスパッチ テーブル構造が定義されていない場合、このポインターは NULL

[out] ProviderBindingContext

プロバイダー モジュールがクライアント モジュールとプロバイダー モジュールの間のバインディングのコンテキストへのポインターを格納する変数へのポインター。 プロバイダー モジュールでは、このコンテキストを使用して、バインディングの状態を追跡します。 プロバイダー モジュールのバインド コンテキストの内容は、クライアント モジュールに対して不透明です。 クライアント モジュールは、プロバイダー モジュールのバインド コンテキストを必要とするプロバイダー モジュールの NPI 関数のいずれかを呼び出すたびに、このポインターをプロバイダー モジュールに渡します。 プロバイダー モジュールは、クライアント モジュールがプロバイダー モジュールにアタッチされている限り、このコンテキストが有効であり、メモリ内に常駐していることを確認する必要があります。

[out] ProviderDispatch

プロバイダー モジュールが、プロバイダー モジュールの NPI 関数のディスパッチ テーブルを含む定数構造体へのポインター 格納する変数へのポインター。 プロバイダー モジュールは、クライアント モジュールがプロバイダー モジュールに接続されている限り、この構造体が有効であり、メモリ内に常駐していることを確認する必要があります。 構造体の内容は NPI 固有です。

戻り値

プロバイダー モジュールの ProviderAttachClient コールバック関数は、次のいずれかの NTSTATUS コードを返します。

リターン コード 形容
STATUS_SUCCESS
プロバイダー モジュールがクライアント モジュールに正常にアタッチされました。
STATUS_NOINTERFACE
プロバイダー モジュールがクライアント モジュールにアタッチされませんでした。
その他の状態コードの
エラーが発生しました。

備考

クライアント モジュールがクライアント モジュールとプロバイダー モジュール間のバインドを表すハンドルを使用して のNmrClientAttachProvider 関数を呼び出すたびに、クライアント モジュールの ProviderAttachClient コールバック関数を呼び出します。

プロバイダー モジュールは、クライアント モジュールの登録データを調べることができます。 このデータは、ClientRegistrationInstance パラメーターが指す構造にあります。 プロバイダー モジュールは、このデータを使用して、クライアント モジュールにアタッチするかどうかを判断します。

  • プロバイダー モジュールがクライアント モジュールにアタッチすると判断した場合、ProviderAttachClient コールバック関数は次の操作を行う必要があります。
    1. ClientBindingContext で渡されたポインターを保存し、ClientDispatch パラメーターを して、プロバイダー モジュールがクライアント モジュールの NPI 関数を呼び出すことができるようにします。
    2. NmrBindingHandle パラメーターに渡されたハンドルを保存します。 プロバイダー モジュールは、このハンドルをパラメーターとして NmrProviderDetachClientComplete クライアント モジュールからデタッチするときに機能します。
    3. ProviderBindingContext パラメーターを設定して、クライアント モジュールとプロバイダー モジュール間のバインドのプロバイダー モジュールのバインド コンテキスト構造を指すようにします。
    4. ProviderDispatch パラメーターを、NPI 関数のプロバイダー モジュールのディスパッチ テーブルを含む構造体 ポイントするように設定します。
    5. STATUS_SUCCESSを返します。
  • プロバイダー モジュールがクライアント モジュールにアタッチしないと判断した場合、ProviderAttachClient コールバック関数はSTATUS_NOINTERFACEを返す必要があります。
プロバイダー モジュールがクライアント モジュールにアタッチされ、バインド コンテキスト用にメモリが動的に割り当てられた場合、その割り当てられたメモリは、NMR がプロバイダー モジュールを呼び出すときに解放する必要があります。 ProviderCleanupBindingContext クライアント モジュールとプロバイダー モジュールが互いにデタッチされた後のコールバック関数です。

このNMRは、IRQL = PASSIVE_LEVELでプロバイダーモジュールの ProviderAttachClient コールバック関数を呼び出します。

必要条件

要件 価値
サポートされる最小クライアント Windows Vista 以降のバージョンの Windows オペレーティング システムで使用できます。
ターゲット プラットフォーム ウィンドウズ
ヘッダー netioddk.h (Wsk.h を含む)
IRQL PASSIVE_LEVEL

関連項目

NPI_PROVIDER_CHARACTERISTICS

NPI_REGISTRATION_INSTANCE

NmrClientAttachProvider

NmrProviderDetachClientComplete

NmrRegisterProvider

ProviderCleanupBindingContext

ProviderDetachClient