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 関数を呼び出すたびに、NMR はプロバイダー モジュールの ProviderAttachClient コールバック関数を呼び出します。

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

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

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

要件

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

こちらもご覧ください

NPI_PROVIDER_CHARACTERISTICS

NPI_REGISTRATION_INSTANCE

NmrClientAttachProvider

NmrProviderDetachClientComplete

NmrRegisterProvider

ProviderCleanupBindingContext

ProviderDetachClient