다음을 통해 공유


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 주소의 액세스는 버그 검사 발생하도록 보장되며, 예외 처리기는 마스킹할 수 없습니다.

다음 코드 예제에서는 라는 ptr포인터 변수에 MM_BAD_POINTER 값을 할당하는 방법을 보여 있습니다. 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_POINTER PAGE_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와 호환됩니다.

추가 정보