Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Примечание
На этой странице ранее содержался список макросов ядра, а не только 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