[Windows 驱动开发] 驱动判断地址是否有效


驱动判断 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"));
}

原文地址:https://www.cnblogs.com/csnd/p/15613338.html