次の方法で共有


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

NdkBuildLam (NDK_FN_BUILD_LAM) 関数は、仮想連続メモリ領域の NDK プロバイダーからアダプター論理アドレス マッピング (LAM) を取得します。

構文

NDK_FN_BUILD_LAM NdkFnBuildLam;

NTSTATUS NdkFnBuildLam(
  [in]           NDK_ADAPTER *pNdkAdapter,
  [in]           MDL *Mdl,
  [in]           SIZE_T Length,
  [in]           NDK_FN_REQUEST_COMPLETION RequestCompletion,
  [in, optional] PVOID RequestContext,
                 NDK_LOGICAL_ADDRESS_MAPPING *pNdkLAM,
                 ULONG *pLAMSize,
  [out]          ULONG *pFBO
)
{...}

パラメーター

[in] pNdkAdapter

NDK アダプター オブジェクト (NDK_ADAPTER) へのポインター。

[in] Mdl

メモリ記述子リスト (MDL) または MDL のチェーン。 開始仮想アドレスから Length パラメーターのバイト数までの MDL チェーンの部分は、事実上連続するメモリ領域を表す必要があります。

[in] Length

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

[in] RequestCompletion

NdkRequestCompletion (NDK_FN_REQUEST_COMPLETION) コールバック関数へのポインター。

[in, optional] RequestContext

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

pNdkLAM

アダプター ページ配列を含む NDK_LOGICAL_ADDRESS_MAPPING 構造体を保持するバッファーへのポインター。 アダプター ページ配列は AdapterPageArray メンバーに格納され、 AdapterPageCount メンバーにはアダプター ページ要素の数が含まれています。

pLAMSize

入力の pNdkLAM パラメーターのバッファーのサイズ (バイト単位)、または出力用に書き込まれた実際のバイト数。

[out] pFBO

この場所では、最初のバイト オフセット (FBO) 値が返されます。 FBO は、最初のアダプター ページ内の開始オフセットです。

戻り値

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

リターン コード 説明
STATUS_SUCCESS
操作は正常に完了しました。
STATUS_PENDING
要求は保留中です。LAM ビルド操作が完了すると、 RequestCompletion パラメーター (NDK_FN_REQUEST_COMPLETION) で指定された関数が呼び出されます。
STATUS_INVALID_PARAMETER
開始仮想アドレスから Length パラメーターで指定されたバイト数までの MDL チェーンの部分は、実質的に連続するメモリ領域を表していません。
STATUS_INSUFFICIENT_RESOURCES
リソースが不足しているため、要求は失敗しました。
大事な 要求はインラインで失敗し、この状態コードを使用して非同期的に失敗する可能性があります。
 
STATUS_BUFFER_TOO_SMALL
*pLAMSize パラメーターで示されるバッファー・サイズが小さすぎて LAM を保持できません。 この場合、 *pLAMSize の値は必要なバッファー サイズで更新されます。
その他の状態コード
エラーが発生しました。

解説

開始仮想アドレスから Length パラメーターで指定されたバイト数までの MDL チェーンの部分は、実質的に連続するメモリ領域を表す必要があります。 それ以外の場合、NDK プロバイダーは要求を失敗する必要があります。 MDL チェーンがロックされていることを確認するのは、NDK コンシューマーの責任です。 つまり、MDL 変更のページは物理メモリに固定されます。

大事な NdkBuildLam が完了待ちの間は 、NDK コンシューマーは MDL チェーンを使用しないでください。
 
アダプターは、論理アドレスを使用して物理メモリにアクセスします。 これは、仮想アドレスを使用して物理メモリにアクセスする CPU に似ています。 NDK コンシューマーが送信、受信、読み取り、または書き込み要求でローカル データ バッファーとして物理メモリ ページを直接使用する場合は、NDK プロバイダーから NDK アダプターの論理アドレス マッピングを取得し、物理アドレスではなく論理アドレスを使用する必要があります。 同様に、NDK コンシューマーは、高速登録要求でも論理アドレスを使用する必要があります。

NDK コンシューマーは 、NdkGetPrivilegedMemoryRegionToken (NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN) 関数を呼び出して、NDK プロバイダーから特権メモリ領域トークンを取得できます。

NDK プロバイダーによって返されるすべてのアダプター ページの長さは PAGE_SIZE バイトである必要があります。 ここで、PAGE_SIZE は wdm.h で定義されているホスト プラットフォームでサポートされているメモリ ページ サイズです。

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

NdkBuildLam 要求の処理中にプロバイダーにエラーが発生した場合、プロバイダーは、エラーで要求を完了する前に、これまで内部的に構築された部分マッピングを解放する必要があります。

要件

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

こちらもご覧ください

MmGetMdlVirtualAddress

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

NDK_ADAPTER

NDK_ADAPTER_DISPATCH

NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN

NDK_FN_RELEASE_LAM

NDK_FN_REQUEST_COMPLETION

NDK_LOGICAL_ADDRESS_MAPPING