次の方法で共有


MmBuildMdlForNonPagedPool 関数 (wdm.h)

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

構文

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

パラメーター

[in, out] MemoryDescriptorList

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

戻り値

何一つ

備考

エントリ時に、指定された MDL は、非ページ システム メモリ内またはロックダウンされているメモリ内のバッファー (物理ページを交換できません) を記述する必要があります。たとえば、ExAllocatePoolWithTag ルーチンによって割り当てられるメモリは、PoolType = NonPagedPool または 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 以降で使用できます。
ターゲット プラットフォーム 万国
ヘッダー wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

関連項目

ExAllocatePoolWithTag

mmAllocateContiguousMemorySpecifyCache

mmGetSystemAddressForMdlSafe

mmMapLockedPagesSpecifyCache する

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages