BAD_POINTER与NULL
2023-08-08
13
0
NULL一般被定义为0,但对驱动来说并不是所有的平台中的0地址均无效,因此初始化为NULL的并不一定总能保证可以检测到通过这些指针进行的不当访问。
而可以保证 MM_BAD_POINTER 值是运行驱动程序的每个平台上的无效地址。
另外,在地址为0的平台上,在 IRQL < DISPATCH_LEVEL 访问地址 0 的驱动程序会导致异常 (访问冲突) ,语句可能会无意中捕获 try/except 。 因此,驱动程序的异常处理代码可能会屏蔽无效访问,并在调试过程中阻止检测这种访问。 但是,可以保证对 MM_BAD_POINTER 地址的访问会导致 bug 检查,异常处理程序无法对此进行屏蔽。
下面的代码示例演示如何将 MM_BAD_POINTER 值分配给名为 ptr 的指针变量。 Ntdef.h 标头文件将 PUCHAR 类型定义为指向 unsigned char 的指针。
PUCHAR ptr = (PUCHAR)MM_BAD_POINTER; // Now _ptr is guaranteed to fault._
将 ptr 设置为 MM_BAD_POINTER 后,尝试访问 ptr 指向的内存位置会导致 bug 检查。
https://learn.microsoft.com/zh-cn/windows-hardware/drivers/kernel/mm-bad-pointer
#ifdef _WIN64
#define BAD_POINTER ((PVOID)0xFFFFFFFFFFFFFF00)
#else
#define BAD_POINTER ((PVOID)0xFFFFFF00)
#endif
#define ISPTR(ptr) ((ptr) && ((ptr) != BAD_POINTER))