次の方法で共有


MmBuildMdlForNonPagedPool 関数 (wdm.h)

MmBuildMdlForNonPagedPool ルーチンは、非ページ仮想メモリ バッファーを指定する MDL を受け取り、基になる物理ページを記述するように更新します。

構文

void MmBuildMdlForNonPagedPool(
  [in, out] PMDL MemoryDescriptorList
);

パラメーター

[in, out] MemoryDescriptorList

非ページ メモリ内の仮想メモリ バッファーを指定する MDL へのポインター。 呼び出し元は IoAllocateMdl ルーチンを使用して、このバッファーの MDL を作成しました。

戻り値

なし

解説

入力時に、指定された MDL は、PoolType = NonPagedPool を使用する ExAllocatePoolWithTag ルーチンまたは MmAllocateContiguousMemorySpecifyCache ルーチンによって割り当てられるメモリなど、非ページ システム メモリまたはロックダウンされたメモリ内のバッファーを記述する必要があります (物理ページを交換できません)。 MmBuildMdlForNonPagedPool は、基になる物理ページを記述するように MDL を更新します。

MmBuildMdlForNonPagedPool は、カーネル スタックに割り当てられたバッファーを記述する MDL では使用できません。 カーネル スタック バッファーを記述する MDL をビルドするには、ドライバーは MmProbeAndLockPages を呼び出す必要があります。 これは、カーネル スタック ページがプローブとロックされていない限り、交換できるためです。 この規則は、ドライバーがカーネル スタックをページングできないことを保証する場合でも適用されます。

MDL によって記述されるページは既にページが使用できず、既にシステム アドレス空間にマップされているため、ドライバーは MmProbeAndLockPages ルーチンを使用してロックしたり、 MmMapLockedPagesSpecifyCache ルーチンを使用して追加のシステム アドレス空間マッピングを作成したりしないでください。 同様に、ドライバーは MmUnlockPages ルーチンを使用してページのロックを解除したり、 MmUnmapLockedPages ルーチンを使用して既存のシステム アドレス空間マッピングを解放したりしないでください。 MmBuildMdlForNonPagedPool によってビルドされた MDL に対してドライバーがこれらの無効な操作のいずれかを実行した場合、結果の動作は未定義になります。

MmBuildMdlForNonPagedPool によって構築された MDL を MmGetSystemAddressForMdlSafe ルーチンに渡すことが許可されます。 MmGetSystemAddressForMdlSafe 呼び出しでは、MDL で記述されているバッファーの開始仮想アドレスを返すだけです。

ドライバーは 、MmMapLockedPagesSpecifyCache ルーチンを使用して、 MmBuildMdlForNonPagedPool によって構築された MDL をユーザー仮想アドレス空間にマップできます。 ただし、ドライバーは、特定のセキュリティの問題を回避する方法でこの操作を実行する必要があります。 詳細については、「 MmMapLockedPagesSpecifyCache」を参照してください。

要件

要件
サポートされている最小のクライアント Windows 2000 以降で使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

こちらもご覧ください

ExAllocatePoolWithTag

MmAllocateContiguousMemorySpecifyCache

MmGetSystemAddressForMdlSafe

MmMapLockedPagesSpecifyCache

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages