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 コードを返します。
リターン コード | 説明 |
---|---|
|
操作は正常に完了しました。 |
|
要求は保留中です。LAM ビルド操作が完了すると、 RequestCompletion パラメーター (NDK_FN_REQUEST_COMPLETION) で指定された関数が呼び出されます。 |
|
開始仮想アドレスから Length パラメーターで指定されたバイト数までの MDL チェーンの部分は、実質的に連続するメモリ領域を表していません。 |
|
リソースが不足しているため、要求は失敗しました。
大事な 要求はインラインで失敗し、この状態コードを使用して非同期的に失敗する可能性があります。
|
|
*pLAMSize パラメーターで示されるバッファー・サイズが小さすぎて LAM を保持できません。 この場合、 *pLAMSize の値は必要なバッファー サイズで更新されます。 |
|
エラーが発生しました。 |
解説
開始仮想アドレスから Length パラメーターで指定されたバイト数までの MDL チェーンの部分は、実質的に連続するメモリ領域を表す必要があります。 それ以外の場合、NDK プロバイダーは要求を失敗する必要があります。 MDL チェーンがロックされていることを確認するのは、NDK コンシューマーの責任です。 つまり、MDL 変更のページは物理メモリに固定されます。
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 |