驱动判断 R0 层
BOOLEAN MmIsAddressValid(
PVOID VirtualAddress
);
即使 MmIsAddressValid 返回 TRUE,访问地址也可能导致页错误,除非内存已锁定或地址是有效的非分页池地址。 因为它只判断地址字节的第一个地址.只要你的地址在这个分页.那么可以. 但是就怕分页.后面分页不对就会出错.
驱动判断 R3 层
void ProbeForRead(
const volatile VOID *Address,
SIZE_T Length,
ULONG Alignment
);
void ProbeForWrite(
volatile VOID *Address,
SIZE_T Length,
ULONG Alignment
);
如果指定的内存范围不在用户模式地址范围内,会引发 STATUS_ACCESS_VIOLATION 异常。如果地址范围的开头没有在对齐所指定的字节边界上对齐, 会引发 STATUS_DATATYPE_MISALIGNMENT 异常。
所以一定要配合 SEH 使用:
(例子)
__try
{
ProbeForRead(DbgDir, sizeof(IMAGE_DEBUG_DIRECTORY), 1);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
KdPrint(("EXCEPTION_EXECUTE_HANDLER\n"));
}