Verifier.exe로 bugcheck code를 좀더 명확하게
작성중인 드라이버에서 blue screen이 뜬다.
WinDBG를 연결해서 !analyze -v 를 해보니...
bugcheck 0x19 : BAD_POOL_HEADER 가 발생한다.
에러가 발생한곳은 return 하기전에 메모리를 해제하기 위해 ExFreePool을 호출하는 곳에서 발생한다.
처음에는 아무리 들여다 보아도 문제 될게 없었다.
ExAllocatePool로 메모리를 할당하고 ExFreePool로 해제하는 순서가 틀린것도 없고...
HELP를 보니 에서 !pool 로 메모리 부분을 살펴보던지 Verifier를 실행시켜 보면 도움이 된다고 한다.
!pool 을 해봤더니 중간에 메모리 링크가 깨졌다고 나오기는 하는데 어떻게 살펴봐야 할지 감이 안온다. (나중에 좀 살펴봐야겠다.)
그래서 결국 Verifier를 실행시키려고 system32 폴더에 있는 verifier.exe, verifier.dll를 복사해서 실행시켰다.
1. Create custome settings을 선택
2. Select individual settings from a full list 선택
3. 조사하고자 하는 task 선택 - Special pool/Pool tracking를 선택
4. Select driver names from a list 선택
5. 드라이버 선택후 마침후 재부팅
WinDBG에 연결한뒤 bugcheck 코드를 살펴봤더니 0x19가 아니라 0xCD 로 변경되었다.
에러가 발생한 곳도 보다 원천적인곳(?)을 가르키고 있었다.
bugcheck 0xCD : PAGE_FAULT_BEYOND_END_OF_ALLOCATION
에러 메세지에서 대략 감이 온다. 더구나 에러가 발생한 코드는 더욱더 확신을 준다.
결국 ExAllocatPool에서 메모리를 충분히 할당하지 못했던게 원인.
메모리를 충분히 할당하여 해결.
다소 애매한 bugcheck code라면 verifier를 사용하면 확실히(?) 알수있다.
-PREFAST 옵션과 더불어 verifier를 사용하면 어지간한 블루스크린을 방지할수 있겠다.
관련링크
Windows 2000에서 Driver Verifier를 사용하여 장치 드라이버 문제를 해결하는 방법