MmMapLockedPagesSpecifyCache 関数 (wdm.h)

MmMapLockedPagesSpecifyCache ルーチンは、MDL によって記述された物理ページを仮想アドレスにマップし、呼び出し元がマッピングの作成に使用するキャッシュ属性を指定できるようにします。

構文

PVOID MmMapLockedPagesSpecifyCache(
  [in]           PMDL                                                                          MemoryDescriptorList,
  [in]           __drv_strictType(KPROCESSOR_MODE / enum _MODE,__drv_typeConst)KPROCESSOR_MODE AccessMode,
  [in]           __drv_strictTypeMatch(__drv_typeCond)MEMORY_CACHING_TYPE                      CacheType,
  [in, optional] PVOID                                                                         RequestedAddress,
  [in]           ULONG                                                                         BugCheckOnFailure,
  [in]           ULONG                                                                         Priority
);

パラメーター

[in] MemoryDescriptorList

マップされる MDL へのポインター。 この MDL では、ロックダウンされている物理ページを記述する必要があります。 ロックダウンされた MDL は、 MmProbeAndLockPages または MmAllocatePagesForMdlEx ルーチンによって構築できます。 ユーザー空間へのマッピングでは、 MmBuildMdlForNonPagedPool ルーチンによって構築された MDL を使用できます。

[in] AccessMode

MDL をマップするアクセス モードを指定します: KernelMode または UserMode。 ほぼすべてのドライバーで KernelMode を使用する必要があります。

[in] CacheType

MEMORY_CACHING_TYPE値を指定します。これは、MDL のマップに使用するキャッシュ属性を示します。 詳細については、「解説」を参照してください。

[in, optional] RequestedAddress

AccessMode = UserMode の場合、このパラメーターは、MDL をマップする開始ユーザー仮想アドレスを指定するか、NULL に設定してシステムが開始アドレスを選択できるようにします。 システムは、要求されたアドレスをアドレス境界の要件に合わせて切り捨て、呼び出し元が戻り値をチェックする必要があります。

[in] BugCheckOnFailure

システム リソースが少ないために MDL をマップできない場合の AccessMode = KernelMode のルーチンの動作を指定します。 TRUE の場合、システムはバグ チェックを発行します。 FALSE の場合、ルーチンは NULL を返します。 ドライバーは、このパラメーターを FALSE に設定する必要があります。

[in] Priority

ページ テーブル エントリ (PTEs) が不足している場合の成功の重要性を示すMM_PAGE_PRIORITY値。 Windows 8以降、指定された優先度の値は、書き込みまたは命令の実行を無効にするメモリを指定するために、MdlMappingNoWrite フラグまたは MdlMappingNoExecute フラグを使用してビットごとの ORed にすることができます。 Priority に使用できる値の詳細については、「MmGetSystemAddressForMdlSafe」を参照してください。

戻り値

MmMapLockedPagesSpecifyCache は 、マップされたページの開始アドレスを返します。 ページをマップできず、 BugCheckOnFailureFALSE の場合、ルーチンは NULL を返します。

注釈

MmUnmapLockedPages を使用して、MmMapLockedPagesSpecifyCache によってマップされた物理ページのマップを解除します。

AccessModeKernelMode で、MmMapLockedPagesSpecifyCache で指定したページをマップできない場合、ルーチンは NULL (BugCheckOnFailure = FALSE の場合) を返すか、オペレーティング システムがバグ チェックを発行します (BugCheckOnFailure = TRUE の場合)。

AccessModeUserMode の場合は、次の詳細に注意してください。

  • 指定したページをマップできない場合、ルーチンは例外を発生させます。 UserMode を指定する呼び出し元は、MmMapLockedPagesSpecifyCache の呼び出しを try/except ブロックでラップする必要があります。 詳細については、「例外の 処理」を参照してください。

  • ルーチンは、ドライバーが実行されているプロセスのコンテキストで有効なユーザー アドレスを返します。 たとえば、64 ビット ドライバーが 32 ビット アプリケーションのコンテキストで実行されている場合、バッファーはアプリケーションの 32 ビット アドレス範囲のアドレスにマップされます。

  • AccessModeUserMode の場合、非実行可能マッピングは常に作成されます。 したがって、このシナリオでは、Priority パラメーターで MdlMappingNoExecute フラグを使用する必要はありません。 ただし、このシナリオでは、 MdlMappingNoWrite フラグを Priority パラメーターと共に使用して、読み取り専用マッピングを要求できます。

  • マッピングの実行可能でない保護と、 MdlMappingNoWrite フラグと Priority パラメーターを使用して指定されたマッピングの書き込み保護は、ユーザー モードで実行されているコードでは変更できません。 たとえば、ドライバーが一部のページをユーザー プロセスにマップし、 MdlMappingNoWrite フラグを指定した場合、システムはプロセスがページを変更できないことを保証します。

このルーチンでは、MDL で記述されているページにまだキャッシュの種類が関連付けられていない場合にのみ、 CacheType パラメーターが使用されます。 ただし、ほぼすべての場合において、ページには既に関連付けられたキャッシュの種類があり、このキャッシュの種類が新しいマッピングに使用されます。 この規則の例外は、 MmAllocatePagesForMdl によって割り当てられたページに対して発生します。このページには、特定のキャッシュの種類が関連付けられません。 このようなページでは、 CacheType パラメーターによってマッピングのキャッシュの種類が決まります。

ドライバーは、MDL に対して複数のシステム アドレス空間マッピングを作成しようとしないでください。 さらに、 MmBuildMdlForNonPagedPool ルーチンによってビルドされた MDL は既にシステム アドレス空間にマップされているため、ドライバーは MmMapLockedPagesSpecifyCache ルーチンを使用して、この MDL をシステム アドレス空間にマップし直す必要はありません (ただし、ユーザー アドレス空間マッピングの作成は許可されます)。 ロックダウンされた MDL にシステム アドレス空間マッピングが既にあるかどうかが不明な場合、ドライバーは MmMapLockedPagesSpecifyCache の代わりに MmGetSystemAddressForMdlSafe マクロを使用できます。 MDL がシステム アドレス空間に既にマップされている場合、 MmGetSystemAddressForMdlSafe は、新しいマッピングを作成する代わりに、既存のシステム アドレス空間マッピングを返します。

警告

カーネル メモリをユーザー アドレス空間にマップするドライバーでは、機密性の高い可能性のあるカーネル データを信頼されていないプロセスに公開しないようにする必要があります。 初期化されていないバッファー (プールから割り当てられるバッファーなど) は、マップされる前に明示的にゼロで埋める必要があります。 さらに、バッファー内のページの一部が他の割り当てに使用されないようにするには、プールから割り当てられるユーザー モード バッファーのサイズは、仮想メモリ ページ サイズの倍数である必要があります。 最後に、バッファーがユーザー アドレス空間にマップされている間は、プールにバッファーを解放し直す必要はありません。

AccessModeUserMode の場合、呼び出し元は IRQL <= APC_LEVELで実行されている必要があります。 AccessModeKernelMode の場合、呼び出し元は IRQL <= DISPATCH_LEVELで実行されている必要があります。

要件

要件
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL 「解説」を参照してください。
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport)

こちらもご覧ください

MmAllocatePagesForMdl

MmAllocatePagesForMdlEx

MmBuildMdlForNonPagedPool

MmGetSystemAddressForMdlSafe

MmProbeAndLockPages

MmUnmapLockedPages