MM_BAD_POINTER

참고

이 페이지에는 이전에 MM_BAD_POINTER 아니라 커널 매크로 목록이 포함되어 있습니다. 이러한 매크로는 이제 고유한 개별 페이지로 나뉘어졌습니다. 링크를 보려면 아래 참고 섹션을 사용하거나 웹을 검색합니다.

정의됨: Wdm.h

드라이버는 MM_BAD_POINTER 매크로를 잘못된 포인터 값으로 사용하여 초기화되지 않았거나 더 이상 유효하지 않은 포인터 변수에 할당할 수 있습니다. 이 잘못된 포인터 변수가 가리키는 메모리 위치에 액세스하려고 하면 버그 검사가 발생합니다.

많은 하드웨어 플랫폼에서 주소 0(명명된 상수 NULL로 자주 표시됨)은 잘못된 주소이지만 드라이버 개발자는 주소 0이 모든 플랫폼에서 보편적으로 유효하지 않다고 가정해서는 안 됩니다. 초기화되지 않았거나 잘못된 포인터 변수를 주소 0으로 설정해도 이러한 포인터를 통한 부적절한 액세스가 항상 검색되지는 않을 수 있습니다.

반면, MM_BAD_POINTER 값은 드라이버가 실행되는 모든 플랫폼에서 잘못된 주소가 되도록 보장됩니다.

주소 0이 잘못된 주소인 플랫폼에서 IRQL < DISPATCH_LEVEL 주소 0에 액세스하는 드라이버는 문에 의해 try/except 실수로 catch될 수 있는 예외(액세스 위반)를 발생합니다. 따라서 드라이버의 예외 처리 코드는 잘못된 액세스를 마스킹하고 디버깅 중에 검색되지 않도록 방지할 수 있습니다. 그러나 MM_BAD_POINTER 주소의 액세스는 예외 처리기에서 마스킹할 수 없는 버그 검사를 발생하도록 보장됩니다.

다음 코드 예제에서는 MM_BAD_POINTER 값을 포인터ptr변수에 할당하는 방법을 보여줍니다. Ntdef.h 헤더 파일은 PUCHAR 형식을 포인터 unsigned char로 정의합니다.

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

MM_BAD_POINTER 설정되면 ptr 가리키는 ptr 메모리 위치에 액세스하려고 하면 버그 검사가 발생합니다.

실제로 MM_BAD_POINTER 잘못된 주소의 전체 페이지의 기본 주소입니다. 따라서 (MM_BAD_POINTERPAGE_SIZE - 1)에 MM_BAD_POINTER + 범위의 주소에 액세스하면 버그 검사가 발생합니다.

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 호환

참조