【发布时间】:2018-12-22 20:09:33
【问题描述】:
在更高 IRQL 中使用的回调函数可能需要访问内存中的一系列地址。所以我想知道是否有一个内核函数可以判断地址PVOID 是否在内存的NonPagedPool 部分中,或者当前是否映射到物理内存并且如果我从中读取不会导致页面错误?
【问题讨论】:
标签: c windows memory-management kernel paging
在更高 IRQL 中使用的回调函数可能需要访问内存中的一系列地址。所以我想知道是否有一个内核函数可以判断地址PVOID 是否在内存的NonPagedPool 部分中,或者当前是否映射到物理内存并且如果我从中读取不会导致页面错误?
【问题讨论】:
标签: c windows memory-management kernel paging
MmIsAddressValid 将检查驻留在非分页池中的指定地址是否会发生页面错误。 Microsoft 警告不要使用此函数,因为如果传递的地址被分页,它将导致未定义的行为。这还检查虚拟地址是否在物理内存范围内,并检查有效的 PTE,如果条件不满足则返回 false。
MmGetPhysicalAddress 将返回驻留在非分页池中的虚拟地址的物理地址。如果例程不满足正确的条件,则返回零。
【讨论】:
MmIsAddressValid 不应该记录在 WDK 中并且不可靠,因为它的响应可能已经过时。这可能是微软建议不要使用它的原因。我相信它返回取决于是否存在有效的 PTE,但结果来自内存管理器上次检查的时间。