MM_BAD_POINTER
Примечание
На этой странице ранее содержался список макросов ядра, а не только MM_BAD_POINTER. Теперь эти макросы разбиты на отдельные страницы. Для получения ссылок используйте раздел См. также ниже или выполните поиск в Интернете.
Определяется в: Wdm.h
Драйвер может использовать макрос MM_BAD_POINTER в качестве неправильного значения указателя для назначения переменной указателя, которая либо не инициализирована, либо больше не действительна. Попытка получить доступ к расположению памяти, на которую указывает эта недопустимая переменная указателя, вызовет ошибку проверка.
На многих аппаратных платформах адрес 0 (часто представленный как именованной константой NULL) является недопустимым адресом, но разработчикам драйверов не следует предполагать, что адрес 0 является универсальным недопустимым на всех платформах. Установка неинициализированных или недопустимых переменных указателя для адреса 0 не всегда может гарантировать, что будут обнаружены недопустимые методы доступа через эти указатели.
В отличие от этого, значение MM_BAD_POINTER гарантированно будет недопустимым адресом на каждой платформе, на которой работает драйвер.
На платформах, на которых адрес 0 является недопустимым адресом, драйвер, который обращается к адресу 0 в IRQL < DISPATCH_LEVEL вызывает исключение (нарушение доступа), которое может быть случайно перехвачено try/except
инструкцией . Таким образом, код обработки исключений драйвера может скрыть недопустимый доступ и предотвратить его обнаружение во время отладки. Однако доступ к MM_BAD_POINTER адресу гарантированно вызовет проверка ошибок, которые не могут быть замаскированы обработчиком исключений.
В следующем примере кода показано, как назначить значение 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
указывает , вызовет проверка ошибок.
Фактически MM_BAD_POINTER является базовым адресом всей страницы недопустимых адресов. Таким образом, любой доступ к адресу в диапазоне MM_BAD_POINTER (MM_BAD_POINTER + PAGE_SIZE – 1) вызовет ошибку проверка.
Начиная с Windows 8.1 макрос MM_BAD_POINTER определяется в файле заголовка Wdm.h. Однако код драйвера, использующий это определение макроса, может выполняться в предыдущих версиях Windows, начиная с Windows Vista.
Начиная с Windows Vista глобальная переменная MmBadPointer доступна в качестве указателя на значение указателя, которое гарантированно будет недопустимым адресом. Однако, начиная с Windows 8.1, использование MmBadPointer не рекомендуется, и вам следует обновить драйверы, чтобы использовать макрос MM_BAD_POINTER.
Доступно начиная с Windows 8.1. Совместимость с предыдущими версиями Windows, начиная с Windows Vista.
См. также раздел
- 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