Поделиться через


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.

См. также раздел