드라이버 언로드의 고뇌




회사에서 요즘 만들고있는 넘이 Core 2 Duo에서는 중간에 한번씩 다운되는 현상이 있어
그걸 금욜내내 디버깅하다가 실마리를 겨우 찾게 되어... 그러나 퇴근시간이 되어 :)
작업물을 집에 갖고 와서 마저 하고 있는데,,,

갑자기 unload가 제대로 되지 않는 현상을 발견했다.

어느 순간부터일까 ;;; 집이라 svn의 로그를 찾아볼수도 없으니 대략 난감... 혹시 그전까지의
테스트도 다 드라이버가 언로드 되지 않은 상태에서 계속 예전 드라이버로 테스트 되었던게 아닐까
하는 의구심이 들며, 디버그 로그도 제대로 확인하지 않은 내 자신이 한심해지기 시작했다.

어쨌든 unload 실패에 대한 이유는 찾아야했기에 이런저런 삽질을 계속 하고 있었는데...
뭐 그동안의 코딩 내용으로는 unload가 되지 않을 이유가 없다... 계속 미궁으로 빠진채 오리무중...

혹시 드라이버 로드에 문제가 있지 않을까 싶어, ZwLoadDriver로 올리던 것을
서비스 모드로 바꿔서 드라이버를 올려보았다... 그래도 실패...

혹시 그렇다면 언로드 자체에 문제가 생긴걸까? DriverEntry에서 DriverObject의 UnloadDriver의
포인터를 확실히 전달해 주었음에도 별도로, IRP_MJ_CLOSE 에서 ZwUnloadDriver를 다시 한번
러 보았다(구글링을 하다보니 그런 희안한 방법도 있길래) ... 역시 안된다....

뭐가 문제일까... 계속 삽질을 하다가 결국 문제를 찾아냈다...

문제는 S.O.U.R.C.E.S 파.일.이.었.다.

DRIVERTYPE=WDM 이게 붙어있으면 Unload가 되지 않는다. 왜지 -.-?
일단 문제의 발단은 작업물을 갖고오다가 soruces파일이 없어서 갖고있던 예제소스 암거나
복사해서 include랑 sources경로만 수정해서 만들었던 것이 화근인데, 암튼 저거 한줄 넣었다고
왜 언로드가 안되는지는 무식한 나는 모르겠따 -.-

한번 그래서 간단한 기본 골격만 갖춘 예제 드라이버를 만들어서 같은 소스에다가 하나는
DRIVERTYPE=WDM를 붙히고 하나는 붙히지 않은 채 build를 해보았다. disassembling해서
비교해 보았지만, 코드상의 변화는 없다. 단지 DRIVERTYPE=WDM를 붙히지 않았을 때의
(반대였던가 기억이 안 난다 ㅋ ) 중간에 할당된  공간이 더 많이 있었다는 것..

이 차이가 무슨 심오한 의미가 있기에 언로드의 존립 여부를 결정해 주는 것일까..

어쨌든 이짓을 하느라 만화책을 보아야 할 귀중한 토요일 오후 시간을 가뿐히 날려먹었는데...

머 sources파일 때문에 이런 오묘한 차이가 생긴다는 사실은 알게 되었다... 더 나아가서
드라이버 타입에 wdm을 붙히면 왜 언로드가 안되는지 그건 정말 모르겠는데, 왜 그러는지
가 좀 알려줬으면...;;

이젠 콘솔에서 빌드하지 말구 익숙하지 않더라도 닷넷2003이상으로 바꿔야겠다는 생각이 든다..


2007년 5월
Posted by window31


트랙백 보낼 주소 : http://window31.com/trackback/11 관련글 쓰기

댓글을 달아주세요

BLOG main image
by window31

카테고리

분류 전체보기 (281)
Reverse Engineering (21)
C, C++ (20)
Kernel (8)
Guitar (19)
잡담 (77)
etc (8)
who am i (8)
보안 이야기 (88)
Tools (3)
월간 마이크로소프트웨어/그.. (28)

글 보관함