Share via


MM_BAD_POINTER

Note

このページには、以前は MM_BAD_POINTER だけでなく、カーネル マクロの一覧も含まれていました。 これらのマクロは、それぞれ個別のページに分けられました。 リンクについては、以下の「関連項目」セクションを使用するか、Web を検索してください。

Wdm.h で定義

ドライバーで MM_BAD_POINTER マクロを無効なポインター値として使用して、初期化されていない、または無効になったポインター変数に割り当てることができます。 この無効なポインター変数が指すメモリ位置にアクセスしようとすると、バグ チェックが発生します。

多くのハードウェア プラットフォームでは、アドレス 0 (多くの場合、名前付き定数 NULL として表される) は無効なアドレスですが、ドライバー開発者はアドレス 0 がすべてのプラットフォームで汎用的に無効であると想定することはできません。 初期化されていない、または無効なポインター変数をアドレス 0 に設定した場合、これらのポインターによる不適切なアクセスが常に検出されるとは限りません。

これに対し、MM_BAD_POINTER 値は、ドライバーが実行されるすべてのプラットフォームで無効なアドレスであることが保証されます。

アドレス 0 が無効なアドレスであるプラットフォームでは、IRQL < DISPATCH_LEVEL でドライバーがアドレス 0 にアクセスすることによって例外 (アクセス違反) が発生します。この例外が、誤って try/except ステートメントで捕捉されることがあります。 このため、無効なアクセスがドライバーの例外処理コードによってマスクされ、デバッグ中に検出されない可能性があります。 ただし、MM_BAD_POINTER アドレスへのアクセスによって必ずバグ チェックが行われます。これは、例外ハンドラーによってマスクされることはありません。

次のコード例は、ptr という名前のポインター変数に MM_BAD_POINTER 値を割り当てる方法を示しています。 unsigned char へのポインターとなる PUCHAR 型は、Ntdef.h ヘッダー ファイルに定義されています。

PUCHAR ptr = (PUCHAR)MM_BAD_POINTER; // Now _ptr is guaranteed to fault._

ptrMM_BAD_POINTER に設定された後、ptr が指すメモリ位置にアクセスしようとすると、バグ チェックが行われます。

実際には、MM_BAD_POINTER は無効なアドレスのページ全体のベース アドレスです。 したがって、MM_BAD_POINTER から (MM_BAD_POINTER + PAGE_SIZE - 1) までの範囲にあるアドレスにアクセスすると、バグ チェックが発生します。

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 Vista 以降には、以前のバージョンの Windows との互換性があります。

関連項目