次の方法で共有


NDK_FN_REGISTER_MR コールバック関数 (ndkpi.h)

NdkRegisterMr (NDK_FN_REGISTER_MR) 関数は、仮想的に連続したメモリ領域を NDK アダプターに登録します。

構文

NDK_FN_REGISTER_MR NdkFnRegisterMr;

NTSTATUS NdkFnRegisterMr(
  [in]           NDK_MR *pNdkMr,
  [in]           MDL *Mdl,
  [in]           SIZE_T Length,
  [in]           ULONG Flags,
  [in]           NDK_FN_REQUEST_COMPLETION RequestCompletion,
  [in, optional] PVOID RequestContext
)
{...}

パラメーター

[in] pNdkMr

NDK メモリ領域 (MR) オブジェクト (NDK_MR) へのポインター。

[in] Mdl

開始仮想アドレスから Length パラメーターで指定されたバイト数までの仮想連続メモリ領域を表す MDL または MDL のチェーン。

[in] Length

最初の MDL の仮想アドレスから開始して登録するバイト数。 最初の MDL の仮想アドレスは、 MmGetMdlVirtualAddress マクロを呼び出すことによって取得できます。 長さは、MDL チェーンによって表されるバイトの合計数を超えてはなりません。

[in] Flags

登録済みメモリ領域のアクセス許可を指定するフラグのビットマスク。 次のフラグを設定できます。

意味
NDK_MR_FLAG_ALLOW_LOCAL_READ
0x00000000
NDK_MR_FLAG_ALLOW_LOCAL_WRITE
0x00000001
NDK_MR_FLAG_ALLOW_REMOTE_READ
0x00000002
NDK_MR_FLAG_ALLOW_REMOTE_WRITE
0x00000005
NDK_MR_FLAG_RDMA_READ_SINK
0x00000008

[in] RequestCompletion

要求完了コールバック ルーチン NdkRequestCompletion (NDK_FN_REQUEST_COMPLETION) へのポインター。

[in, optional] RequestContext

RequestCompletion パラメーターで指定されたコールバック関数の Context パラメーターに渡すコンテキスト値。

戻り値

NdkRegisterMr 関数は、次のいずれかの NTSTATUS コードを返します。

リターン コード 説明
STATUS_SUCCESS
MR 登録が正常に完了しました。
STATUS_PENDING
操作は保留中であり、後で完了します。 ドライバーは、保留中の操作を完了するために、指定した RequestCompletion (NDK_FN_REQUEST_COMPLETION) 関数を呼び出します。
STATUS_INVALID_PARAMETER
開始仮想アドレスからバイト単位の長さまでの MDL チェーンの部分は、事実上連続するメモリ領域を表していません。
STATUS_INSUFFICIENT_RESOURCES
リソースが不足しているため、要求は失敗しました。
大事な 要求はインラインで失敗し、この状態コードを使用して非同期的に失敗する可能性があります。
 
その他の状態コード
エラーが発生しました。

解説

FastRegister パラメーターを FALSE に設定して作成されたNDK_MR オブジェクトでは、NdkRegisterMr を使用して、事実上連続したメモリ領域をアダプターに登録します。

NDK コンシューマーは、物理メモリに固定されている事実上連続したメモリ領域を表す MDL または MDL のチェーンを渡す必要があります。 登録されているメモリ領域のベース仮想アドレスは、 MmGetMdlVirtualAddress マクロによって示される仮想アドレスです。 MDL チェーンが、開始仮想アドレスから指定された長さ (バイト単位) までの仮想連続メモリ領域を表さない場合、NDK プロバイダーは要求を失敗させる必要があります。

プロバイダーは、 MmGetMdlVirtualAddress が返す仮想アドレスを、登録されているメモリ領域の先頭のインデックスとして扱う必要があります。 プロバイダーは、バッファーの内容を読み取りまたは書き込むための有効な仮想アドレスとして仮想アドレスを使用することはできません。

登録要求が保留中の間、NDK コンシューマーは MDL チェーンを使用しないでください。

NdkRegisterMr では 、0 から始まる仮想アドレスはサポートされていません。

NDK コンシューマーは、RDMA 読み取り要求のシンク バッファーとして使用できるメモリを登録するときに、 NDK_MR_FLAG_RDMA_READ_SINK フラグを渡す必要があります。 特定の NDK プロバイダーでは、NDK_ADAPTER_INFO構造体の AdapterFlags メンバーにNDK_ADAPTER_FLAG_RDMA_READ_SINK_NOT_REQUIRED フラグが設定されていないアダプターの RDMA 読み取り要求に対して、シンク バッファーに対する特別なアクセス権を有効にする必要がある場合があります。 NDK_MR_FLAG_RDMA_READ_SINK フラグを使用すると、このようなプロバイダーは登録要求を適切にサポートできます。

メモ バッファーは複数の目的で登録できます。 したがって、 NDK_MR_FLAG_RDMA_READ_SINK フラグには他のフラグが伴う場合があります。
 
NDK コンシューマーが、NDK_ADAPTER_INFO構造体の AdapterFlags メンバーにNDK_ADAPTER_FLAG_RDMA_READ_SINK_NOT_REQUIRED フラグが設定されているアダプターでNDK_MR_FLAG_RDMA_READ_SINK フラグを渡す場合、プロバイダーはNDK_MR_FLAG_RDMA_READ_SINK フラグを処理する必要がないため、このフラグが存在するため要求を失敗させてはなりません。

メモリ領域を登録解除するには、 NdkDeregisterMr (NDK_FN_DEREGISTER_MR) 関数を使用します。

要件

要件
サポートされている最小のクライアント サポートされていません。NDIS 6.30 以降でサポートされています。
サポートされている最小のサーバー Windows Server 2012
対象プラットフォーム Windows
ヘッダー ndkpi.h (Ndkpi.h を含む)
IRQL <=DISPATCH_LEVEL

こちらもご覧ください

MmGetMdlVirtualAddress

NDKPI オブジェクト有効期間要件

NDK_ADAPTER_INFO

NDK_FN_DEREGISTER_MR

NDK_FN_REQUEST_COMPLETION

NDK_MR