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) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 请参见“备注”部分。 |
DDI 符合性规则 | HwStorPortProhibitedDDI (storport) |