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

要探测参数的访问模式, KernelModeUserMode

[in] Operation

调用方希望探测其访问权限并锁定页面的操作类型。 将此参数设置为 IoReadAccessIoWriteAccessIoModifyAccessIoReadAccess 指示驱动程序可以检查缓冲区的内容,但无法更改内容。 IoWriteAccessIoModifyAccess 是等效的,它们表示驱动程序对缓冲区具有读写访问权限。

返回值

备注

使用直接 I/O 的分层驱动程序链中的最高级别驱动程序调用此例程。 使用缓冲 I/O 的驱动程序永远不会调用 MmProbeAndLockPages

MmProbeAndLockPages 执行以下操作:

  1. 如果指定的内存范围 (磁盘、网络等) 分页到后备存储, 则 MmProbeAndLockPages 会将其驻留。
  2. 然后,该例程确认页面是否允许 Operation 参数指定的操作。
  3. 如果内存范围允许指定操作,则例程会锁定内存中的页面,使其无法分页。使用 MmUnlockPages 例程解锁页面。
  4. 最后,例程更新 MDL 中的 页帧编号 (PFN) 数组,以描述锁定的物理页面。
成功调用 MmProbeAndLockPages 可锁定 MDL 中的页面,并将 MDL 结构设置为锁定状态。 每个此类调用都必须通过对 MmUnlockPages 的 相应调用进行匹配,该调用将解锁页面并将 MDL 设置为已解锁状态。 在 MmProbeAndLockPages 调用将 MDL 设置为锁定状态后,在首次调用 MmUnlockPages 以解锁 MDL 之前,不允许对 MmProbeAndLockPages 进行第二次调用以锁定相同的 MDL。

如果两个或更多 MDL 描述同一个物理页,则页面可以多次锁定-每个 MDL 一次。 当最后一个 MDL 设置为解锁状态时,页面将解锁。

MmBuildMdlForNonPagedPoolIoBuildPartialMdl 等例程更新 MDL 以描述不可分页或已锁定的页面。 不允许调用 MmProbeAndLockPagesMmUnlockPages 来锁定或解锁此类 MDL。

MmProbeAndLockPages 的 调用必须包含在 try/except 块中。 如果页面不支持指定的操作,则例程将引发STATUS_ACCESS_VIOLATION或其他异常。 有关详细信息,请参阅 处理异常

对于可分页 地址,MmProbeAndLockPages 的调用方必须在 IRQL <= APC_LEVEL 运行,对于不可分页的地址,必须在 IRQL <= DISPATCH_LEVEL 运行。

此例程不保证描述这些页面的虚拟地址 (即,虚拟地址可能未映射、重复使用等) 。 但是,保证在成功返回时锁定物理页面。

若要避免页面错误,请使用 VirtualLock 锁定虚拟地址,因此除非应用解锁虚拟地址或通过调用 VirtualFreeUnmapViewOfFile 显式释放该地址,否则不会对其进行修整。

要求

要求
最低受支持的客户端 从 Windows 2000 开始可用。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 请参见“备注”部分。
DDI 符合性规则 HwStorPortProhibitedDDI (storport)

另请参阅

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages