次の方法で共有


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 マクロを使用して取得できます。 Length は、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
ターゲット プラットフォーム ウィンドウズ
ヘッダー 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