Windows驱动
+ -

BAD_POINTER与NULL

2023-08-08 9 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))

0 篇笔记 写笔记

驱动中的空地址NULL和MM_BAD_POINTER
平时我们对于无效的地址或者不用的地址会将指针初始化为NULL,而NULL会被定义为0#ifndef NULL#ifdef __cplusplus#define NULL 0#define NULL64 0#else#define NULL ((void *)0)#defi......
BAD_POINTERNULL
NULL一般被定义为0,但对驱动来说并不是所有的平台中的0地址均无效,因此初始化为NULL的并不一定总能保证可以检测到通过这些指针进行的不当访问。而可以保证 MM_BAD_POINTER 值是运行驱动程序的每个平台上的无效地址。另外,在地址为0的平台上,在 IRQL < DISPATCH_LE......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!