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

另请参阅

IoBuildPartialMdl

mmBuildMdlForNonPagedPool

mmUnlockPages