31 Jul
2011
Posted in: 코드
By    3 Comments

Visual Studio로 드라이버 개발하기


Visual Studio로 드라이버 개발하기
by 신영진(YoungJin Shin), codewiz at gmail.com, @codemaru, http://www.jiniya.net

빌 조이는 vi로 vi를 개발하고, 리차드 스톨만 아저씨는 emacs를 emacs로 개발한다는 전설같은 무용담들이 있지만, 우리같은 쪼렙 개발자들에게는 에디터보다는 편리한 툴들이 필요합니다. 전 그간 드라이버를 개발할 때에는 소스 인사이트라는 프로그램을 사용했는데, 혼자 개발할 때에는 그럭 저럭 편했는데 여러 명이 개발하게 되니깐 좀 불편하더군요. 그래서 여차저차해서 Visual Studio로 개발 환경을 모두 통합하게 되었습니다. 물론 이제는 Visual Studio에 드라이버 개발 프로젝트가 빌트인된 시대지만 아직까지 구시대적인 개발 방법도 필요한지라 정리해놓습니다.

#0.
제일 먼저 필요한 도구는 ddkbuild입니다. ddkbuild.bat 파일만 있으면 끝입니다. 해당 파일을 Visual Studio 프로젝트 파일이 있는 폴더에 같이 복사해 둡니다. 깔았냐, 머 설치해라 이런말 안해도 되서 여러모로 편합니다. 근데 ddkbuild를 어디서 다운 받냐구요? 여기서 받으시면 됩니다.

#1.
ddkbuild 설명서를 보면서 sources 파일을 수정하면 한 군데서 막힐 텐데요. 브라우저 정보를 생성하는 부분이죠. 아래와 같이 브라우저 정보를 생성하도록 source 파일을 수정하면 오류가 발생할 겁니다.

sources
BROWSER_INFO=1
BSCMAKE_FLAGS=$(BSCMAKE_FLAGS) -n
BROWSERFILE=$(TARGETNAME).bsc

오류가 생기는 원인은 ddk 때문에 그런 건데요. ddk 설치 폴더를 간 다음 verify.src 파일의 아래 줄들을 주석 처리해 주시면 해당 오류가 발생하지 않도록 만들 수 있습니다. 브라우저 정보는 왜 생성하냐구요? 여러분이 F12를 눌렀을 때 정의된 곳으로 이동시켜 주기 위해서 생성한답니다. 그 기능을 사용하고 싶으시다면 이 작업을 하시고, 필요 없다면 안하셔도 됩니다. 하지만 하시는게 좋을 거예요.

C:\WinDDK\7600.16385.1\bin\verify.src
#!if defined(BROWSER_INFO) && !defined(USER_ENV_BROWSER_INFO)
#!error BLD1007 : BROWSER_INFO defined in sources file – this is a user environment setting ($(MAKEDIR))
#!endif

#2.
요즘은 64비트를 지원하는게 필수기 때문에 대부분 한 드라이버 프로젝트에서 32, 64 빌드가 모두 나옵니다. 그런데 이 때 32, 64 구성 파일이 모두 동일하다면 상관 없는데 아마도, 종종, 제법 심하게 자주 구성 파일 한 두개가 서로 다른 시츄에이션이 발생할 겁니다. 현란한 전처리기를 사용해서 그것들을 처리하는 것도 한 방법이긴 하지만 별로 추천해 드리고 싶지는 않군요. 제가 추천해 드리고 싶은 방법은 속편하게 sources 파일을 두 개 만들라는 겁니다. sources_x86, source_x64 이렇게 두 개를 만들어 두세요.

#3.
이제 빌드 배치 파일을 만들어 봅시다. 이 배치 파일들이 하는 일은 32, 64 빌드에 따른 sources 파일 교체 및 인증서 서명, 그리고 최종적으로 빌드된 파일을 Dist 폴더로 복사해주는 역할을 합니다. 이 마법같은 배치 파일은 다음과 같이 작성하면 됩니다.

build_x64_release.bat
set name=%1
copy sources_x64 sources
call ddkbuild.bat -WIN7A64 -oacr free .  -cZg
call sign.bat objfre_win7_amd64\amd64\%name%64.sys
mkdir Dist
copy objfre_win7_amd64\amd64\%name%64.sys Dist
copy objfre_win7_amd64\amd64\%name%64.pdb Dist
del sources

build_x86_release.bat
set name=%1
copy sources_x86 sources
call ddkbuild.bat -WIN7 -oacr free .  -cZg
call sign.bat objfre_win7_\i386\%name%32.sys
mkdir Dist
copy objfre_win7_x86\i386\%name%32.sys Dist
copy objfre_win7_x86\i386\%name%32.pdb Dist
del sources

sign.bat
signtool sign /a /v /ac MSCV-VSClass3.cer /s my /n “인증서이름” /t “http://timestamp.verisign.com/scripts/timestamp.dll” %1

#4.
다시 정리하면 이렇습니다. 드라이버 프로젝트 폴더에는 ddkbuild.bat, sources_x86, sources_x64, build_x64_release.bat, build_x86_release.bat, sign.bat 파일이 있는 겁니다.

#5.
이제 Visual Studio에서는 make 프로젝트로 프로젝트를 생성하시고 프로젝트 빌드 커맨드로는 build_x86_release.bat 드라이버명, build_x64_release.bat 드라이버명 이렇게 만드시면 됩니다.

Browser does not supports flash movie

  • 트랙백 주소: http://www.jiniya.net/wp/archives/4195/trackback

관련 글

  • 질문이요.

    이게 무슨 드라이버를 만드는 건가요?
    실은 이미지 프린터 드라이버를 개발해야 할 일이 있어서 자료를 찾는 도중에 보게 됐습니다.
    (드라이버 개발의 ㄷ도 모릅니다.)

  • codewiz

    질문이요. // 그냥 모든 드라이버를 제작하는 환경을 만드는 일이라고 보시면 됩니다. 그냥 좀 편하게 드라이버 개발을 위해서 환경을 구축하는 일이랄까요~

  • 프린터드라이버!

    저또한 프린터 드라이버 형식으로 문서를 pdf파일로 변환시켜보여주는 프로그램을 만들려하고있습니다. 드라이버 제작은 처음이라 그런데 조금 여쭤봐도 될까요? ㅎㅎ ^^ ;