MM_BAD_POINTER

注意

此页之前包含内核宏的列表,而不只是 MM_BAD_POINTER。 这些宏现在已分解为各自的单独页面。 对于链接,请使用下面的“另请参阅”部分,或通过 Web 搜索。

定义位置:Wdm.h

驱动程序可以使用 MM_BAD_POINTER 宏作为要分配给未初始化或不再有效的指针变量的错误指针值。 尝试访问此无效指针变量指向的内存位置将导致 bug 检查。

在许多硬件平台上,地址 0(往往表示为命名常量 NULL)是无效地址,但驱动程序开发人员不应假设地址 0 在所有平台中均无效。 将未初始化或无效的指针变量设置为地址 0 不一定总能保证可以检测到通过这些指针进行的不当访问。

相反,可以保证 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 检查。

事实上,MM_BAD_POINTER 是无效地址的整个页面的基址。 因此,对 MM_BAD_POINTER 至 (MM_BAD_POINTER + PAGE_SIZE - 1) 范围内的地址进行任何访问都会导致 bug 检查。

从 Windows 8.1 开始,MM_BAD_POINTER 宏在 Wdm.h 标头文件中定义。 但是,使用此宏定义的驱动程序代码可以在 Windows Vista 及更低版本的 Windows 中运行。

从 Windows Vista 开始,MmBadPointer 全局变量可用作指向某个指针值(保证为无效地址)的指针。 但是,从 Windows 8.1 开始,MmBadPointer 已弃用;应将驱动程序更新为改用 MM_BAD_POINTER 宏。

从Windows 8.1开始可用。 与以前版本的 Windows 兼容,从 Windows Vista 开始。

另请参阅