MmProbeAndLockPages 函数 (wdm.h)
MmProbeAndLockPages 例程探测指定的虚拟内存页,使其驻留,并将其锁定在内存中(例如用于 DMA 传输)。 这可确保设备驱动程序(或硬件)仍在使用页面时无法释放和重新分配页面。
语法
void MmProbeAndLockPages(
[in, out] PMDL MemoryDescriptorList,
[in] KPROCESSOR_MODE AccessMode,
[in] LOCK_OPERATION Operation
);
参数
[in, out] MemoryDescriptorList
指向指定虚拟内存缓冲区的 MDL 的指针。 如果例程成功锁定内存中的页面,则会更新 MDL 以描述基础物理页。
[in] AccessMode
要在其中探测参数的访问模式,KernelMode 或 UserMode。
[in] Operation
调用方希望探测访问权限并锁定页面的作类型。 将此参数设置为 IoReadAccess、IoWriteAccess或 IoModifyAccess。 IoReadAccess 指示驱动程序可以检查缓冲区的内容,但无法更改内容。 IoWriteAccess 和 IoModifyAccess(等效)表示驱动程序对缓冲区具有读取和写入访问权限。
返回值
没有
言论
使用直接 I/O 的分层驱动程序链中的最高级别驱动程序调用此例程。 使用缓冲 I/O 的驱动程序从不调用 MmProbeAndLockPages。
mmProbeAndLockPages 执行以下作:
- 如果将指定的内存范围分页到后备存储(磁盘、网络等),MmProbeAndLockPages 使其驻留。
- 然后,该例程确认页面允许 Operation 参数指定的作。
- 如果内存范围允许指定作,则例程会锁定内存中的页面,以便无法分页。使用 MmUnlockPages 例程解锁页面。
- 最后,例程更新 MDL 中的 页帧编号(PFN)数组,以描述锁定的物理页。
如果两个或更多个 MDL 描述同一物理页,则每个 MDL 可以多次锁定该页。 当最后一个 MDL 设置为已解锁状态时,页面将解锁。
MmBuildMdlForNonPagedPool 或 IoBuildPartialMdl 更新 MDL 来描述不可分页或已锁定的页面的例程。 不允许调用 mmProbeAndLockPages 或 mmUnlockPages 锁定或解锁此类 MDL。
对 mmProbeAndLockPages 的调用必须包含在 try/except 块中。 如果页面不支持指定的作,则例程将引发STATUS_ACCESS_VIOLATION或其他异常。 有关详细信息,请参阅 处理异常。
MmProbeAndLockPages 的调用方必须在 IRQL <= 可分页地址的APC_LEVEL上运行,或者在 IRQL <= 不可分页地址DISPATCH_LEVEL运行。
此例程不提供描述这些页面的虚拟地址的任何保证(即,虚拟地址可能未映射、重复使用等)。 但是,保证在成功返回时锁定物理页。
若要避免页面错误,请使用 VirtualLock 锁定虚拟地址,因此除非应用解锁虚拟地址或通过调用 VirtualFree 或 UnmapViewOfFile显式释放它, 否则不会对其进行修整。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 请参阅“备注”部分。 |
DDI 符合性规则 | HwStorPortProhibitedDIS(storport) |