'bugcheck code'에 해당되는 글 1건

  1. 2007/02/15 Verifier.exe로 bugcheck code를 좀더 명확하게

Verifier.exe로 bugcheck code를 좀더 명확하게
2007/02/15 14:07

작성중인 드라이버에서 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에서 메모리를 충분히 할당하지 못했던게 원인.
메모리를 충분히 할당하여 해결.

(Language : c)
  1. ...
  2.     pFilterNameOfReg = ExAllocatePool( PagedPool, nLen)
  3. ...
  4.     wcscpy(pFilterNameOfReg, pRegValue)// bugcheck 0xcd
  5. ...
  6.      if(wcscmp(pFilterNameOfReg, filtername) == 0)
  7.      {
  8.             ExFreePool(pFilterNameOfReg);   // bugcheck 0x19
  9.             return;
  10.      }
  11.     ExFreePool(pFilterNameOfReg);
  12.     return FALSE;
  13.  

다소 애매한 bugcheck code라면 verifier를 사용하면 확실히(?) 알수있다.
-PREFAST 옵션과 더불어 verifier를 사용하면 어지간한 블루스크린을 방지할수 있겠다.

관련링크
Windows 2000에서 Driver Verifier를 사용하여 장치 드라이버 문제를 해결하는 방법

2007/02/15 14:07 2007/02/15 14:07
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다