[펌] WinDbg를 이용해서 컴파일 후 파일 debuggee로 자동 복사하기

드라이버를 개발하면서 WinDbg 로 커널 디버깅을 할 때 가장 귀찮은 작업중 하나가
Debugger(개발시스템)에서 드라이버를 빌드한 후에 이것을 Debuggee (테스트시스템)로
복사해줘야 한다는 것입니다.
이것을 해결해 주는 편리한 명령어가 있었으니 바로 .kdfiles 입니다.


.kdfiles (Set Driver Replacement Map)
.kdfiles command 는 맵파일을 읽어서 그 내용에 있는 대로 Debugger 시스템에 있는
드라이버 파일을 Debuggee 시스템에 복사하게 합니다.


[Syntax]
.kdfiles MapFile ( MapFile 을 읽는다 )
.kdfiles -c         ( 현재 설정을 지운다 )
.kdfiles             ( 현재 설정을 보인다 )


파일복사는 커널 디버거가 연결된 통로로 이루어집니다. Serial 디버깅이면 Serial,
1394 디버깅이라면 1394죠. 파일복사이므로 파일이 큰 경우 당연히 1394 권장입니다.


이해가 잘 안가시죠?
예제를 통해 확인해 보겠습니다.


kd> .kdfiles
No KD file associations set


이게 일반적인 상황입니다.
다음과 같이 설정할 수 있습니다.


kd> .kdfiles d:\dbgmap\mymap.ini
KD file assocations loaded from ‘d:\dbgmap\mymap.ini’


mymap.ini 파일의 내용은 다음과 같습니다.


# [주석] mydrv.sys 에 대한 맵
map
\Systemroot\system32\drivers\mydrv.sys
D:\mytest\mydrv\Build\I386\checked\mydrv.sys


내용은 debuggee 의 \Systemroot\system32\drivers\mydrv.sys 는 debugger 시스템의 D:\mytest\
mydrv\Build\I386\checked\mydrv.sys 를 가져와서 사용하도록 해 달라는 의미입니다.
아래와 같이 설정된 내용을 확인할 수 있습니다.


kd> .kdfiles
KD file assocations loaded from ‘d:\dbgmap\mymap.ini’
\Systemroot\system32\drivers\mydrv.sys -> D:\mytest\mydrv\Build\I386\checked\mydrv.sys


실제 파일 교체는 드라이버 로드시에 이루어 집니다. 리부팅은 필요없습니다.
테스트시스템의 드라이버를 로드하려는 순간 debugger 측에서 지정된 폴더의 파일을 전송하고
테스트시스템의 드라이버가 전송된 파일로 교체된 후에 드라이버가 로드됩니다.
이 때 다음과 같은 메시지가 뿌려집니다.


KD: Accessing ‘D:\mytest\mydrv\Build\I386\checked\mydrv.sys’ (\SystemRoot\system32\drivers\mydrv.sys)
  File size 64K……………………
MmLoadSystemImage: Pulled \SystemRoot\system32\drivers\mydrv.sys from kd


Windows File Protection (WFP)과 관계없이 교체되구요 부팅하는 시점이더라도 드라이버가
로드되면 교체됩니다.


드라이버 자동 복사가 필요없어지면 다음 명령으로 설정을 지우면 됩니다.


kd> .kdfiles -c


이 명령을 알고 있으면 수동으로 파일을 복사하는 작업이 없어져서 아주 편리합니다.
하지만 가끔 원하지 않게 빌드된 드라이버 파일이 무심코 복사되기도 하지요. ^^


참고로 맵파일 작성시 다음과 같은 포맷도 가능함을 보여드립니다.


# Symbolic Link Example
map
\??\c:\windows\system32\beep.sys
\\myserver\myshare\new_drivers\new_beep.sys

복사할 곳 지정시 심볼릭링크 표현으로 어느 위치던지 지정할 수 있습니다.
원본위치 지정시 네트웍에 있는 위치도 지정할 수 있습니다.


그리고 안타깝게도 .kdfiles 명령어는 타겟시스템이 XP 이후인 경우만 동작합니다.





greemate 테스트 시스템의 드라이버 경로는 시스템에 등록된 드라이
버의 ImagePath 와 동일해야 합니다. ImagePath 에 \??
\c:\windows\system32\drivers\mydrv.sys 와 같이 등록되
어 있다면 위 설정은 동작하지 않습니다. 이 때는 맵파일
의 내용을 다음과 같이 작성해야 합니다.

map
\??\c:\windows\system32\drivers\mydrv.sys
D:\mytest\mydrv\Build\I386\checked\mydrv.sys

펌 : www.driveronline.org

댓글 남기기