MmProbeAndLockPages routine
MmProbeAndLockPages 例程检验一些指定的虚拟内存页面,使它们常驻内存(非分页,不被交换), 在内存中锁定这些页面。
Syntax
VOID MmProbeAndLockPages(
_Inout_ PMDLX MemoryDescriptorList,
_In_ KPROCESSOR_MODE AccessMode,
_In_ LOCK_OPERATION Operation
);
Parameters
MemoryDescriptorList [in, out]
一个MDL指针,它指定了一个虚拟内存缓冲区。如果例程成功锁定了在内存中的那些页面, 它被更新为描述底层物理页面的MDL。
AccessMode [in]
MemoryDescriptorList 的访问模式, KernelMode or UserMode之一。
Operation [in]
调用者期望访问这些将被锁定页面的方式,设置为IoReadAccess,IoWriteAccess, 或者是IoModifyAccess.IoReadAccess 表示驱动可以检查缓冲区的内容,但是不可以改变内容。IoWriteAccess 和IoModifyAccess,是等效的,表示驱动可以读写这些缓冲区。
Return value
None
Remarks
再一个分层驱动的链表中,那些使用direct I/O最高层级的驱动程序调用这个例程。使用buffered I/O 的驱动程序从不调用MmProbeAndLockPages.
MmProbeAndLockPages 执行以下操作:
1.
如果指定的(虚拟)内存范围被交换到备用存储(硬盘,网络,等等),MmProbeAndLockPages 调用使它常驻内存。
2.
例程确认页面是否允许Operation 参数指定的操作。
3.
如果内存缓冲区允许这些指定的操作,例程锁定这些内存中的页面使得他们不能不交换出去。使用MmUnlockPages 例程可解锁这些页面。
4.
最后例程更新MDL 的PFN数组以描述被锁定的物理内存。
5.
一个成功的MmProbeAndLockPages 调用锁定MDL内的页面,并设置这个MDL结构体为锁定的状态。每一个这个MmProbeAndLockPages 调用必须和一个对应的 MmUnlockPages 以解锁这些页面并设置MDL为解锁状态。在一个 MmProbeAndLockPages 调用设置了一个MDL为锁定状态后。再次在同一个MDL上调用是不被允许的,直到MmUnlockPages 被调用以解锁这个MDL。如果两个或者更多的MDL描述了同一个物理页面,页面可以被锁定多次,但是,一个MDL只能被锁定一次。当最后一个(描述同一个物理页面的)MDL被解锁后,页面被解锁。
如MmBuildMdlForNonPagedPool 或者 IoBuildPartialMdl 的一个调用更新一个MDL以描述那些不可交换的或者是已经锁定的页面。不允许用一个MmProbeAndLockPages or MmUnlockPages 调用去锁定或者解锁这样一个MDL。
MmProbeAndLockPages 必须包含在一个try/except 块中。如果页面不支持指定的操作,例程触发一个STATUS_ACCESS_VIOLATION 或者是其他的异常。更多信息见Handling Exceptions.
Callers of MmProbeAndLockPages must be running at IRQL <= APC_LEVEL for pageable addresses, or at IRQL <= DISPATCH_LEVEL for nonpageable addresses.
This routine does not provide any guarantees about the virtual address that describes these pages (that is, the virtual address might be unmapped, reused, and so on). However, the physical pages are guaranteed to be locked on successful return.例程不为描述页面的虚拟地址提供任何保证(也就是,虚拟地址可能是未被映射的,重用的,等等)。然而当例程成功返回时物理页面是可以确保被锁定的。
Requirements
Target platform | |
Version | Available starting with Windows 2000. |
Header | Wdm.h (include Wdm.h, Ntddk.h, or Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | See Remarks section. |
DDI compliance rules |
See also