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._
ptr
が MM_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 との互換性があります。
関連項目
- ADDRESS_AND_SIZE_TO_SPAN_PAGES
- BYTE_OFFSET
- BYTES_TO_PAGES
- CONTAINING_RECORD
- IoSkipCurrentIrpStackLocation
- KeInitializeCallbackRecord
- MmGetMdlByteCount
- MmGetMdlByteOffset
- MmGetMdlPfnArray
- MmGetMdlVirtualAddress
- MmGetSystemAddressForMdlSafe
- MmInitializeMdl
- MmPrepareMdlForReuse
- PAGE_ALIGN
- PAGED_CODE
- PAGED_CODE_LOCKED
- PoSetDeviceBusy
- PsGetCurrentProcess
- READ_REGISTER_BUFFER_ULONG64
- READ_REGISTER_ULONG64
- ROUND_TO_PAGES
- RtlEqualLuid
- RtlInitEmptyAnsiString
- RtlInitEmptyUnicodeString
- RtlIsZeroLuid
- RtlRetrieveUlong
- RtlRetrieveUshort
- RtlStoreUlong
- RtlStoreUlonglong
- RtlStoreUlongPtr
- RtlStoreUshort
- WRITE_REGISTER_BUFFER_ULONG64
- WRITE_REGISTER_ULONG64
- ZwCurrentProcess
- ZwCurrentThread