성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <div style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Device Driver 응용 프로그램의 빌드 스크립트</div> <br /> 아래의 이야기에 이어서.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Visual Studio 2010 - Device Driver 제작- Hello World 예제 ; <a target='_tab' href='/2/0/919'>http://www.sysnet.pe.kr/2/0/919</a> </pre> <br /> 그럼, <a target='_tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=542&boardid=331301885'>지난번 만들어 둔 예제 프로젝트</a>를 기반으로 다중 플랫폼들에 설치를 할 수 있도록 그에 맞는 *.sys 파일을 생성하는 배포 스크립트 파일을 만들어 볼까요? ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 목표는 다음과 같습니다.<br /> <br /> <ol> <li>x86, x64 버전으로 빌드</li> <li>Windows XP, 2003, Windows Server 2008 / R2 버전 지원</li> <li>배포</li> </ol> <br /> 차근차근히 하나씩 채워보면,<br /> <br /> 우선, 명령행 빌드 환경을 점검해야 합니다. 이 부분은 일반적인 "Visual Studio Command Prompt (2010)"에 설정된 PATH 값과 이외의 필요에 맞는 환경 변수를 정의합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > SET FrameworkVersion=v4.0.30319 SET PATH=C:\Windows\Microsoft.NET\Framework\%FrameworkVersion%;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools;C:\ProgramFiles (x86)\Microsoft Visual Studio 10.0\VC\VCPackages;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;D:\Tools\SysInternals; FOR /F %%I IN ("%0") DO SET CURRENTDIR=%%~dpI SET BUILDCONFIG=Release SET DriverName=DeviceDriverSample SET SERVICENAME32=%DriverName%32 SET SERVICENAME64=%DriverName%64 </pre> <br /> 자, ^^ 이제 msbuild로 예전에 살펴봤던 대로 x86과 x64 빌드를 해주면 되겠지요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > MSBuild를 이용한 VC++ 프로젝트 빌드 ; <a target='_tab' href='/2/0/871'>http://www.sysnet.pe.kr/2/0/871</a> </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > msbuild ".\DeviceDriverSample\DeviceDriverSample.vcxproj" /p:Platform=Win32;Configuration=%BUILDCONFIG% /p:TargetName=%SERVICENAME32% msbuild ".\DeviceDriverSample\DeviceDriverSample.vcxproj" /p:Platform=x64;Configuration=%BUILDCONFIG% /p:TargetName=%SERVICENAME64% </pre> <br /> 위와 같은 정도면 일단 x86 버전과 x64 버전은 정상적으로 출력이 됩니다. 그런데 Device Driver의 경우 보통, 윈도우 운영체제마다 달리해서 제작이 되곤 합니다. 그래서 x86/x64 버전에 대한 구분을 운영체제별로 해주는 것이 좋습니다. 이를 위해 출력 폴더를 다음과 같은 식으로 잡아주는 것이 좋겠고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > /bin/win7 /win2003 /vista /winxp </pre> <br /> 그럼, Windows 7 / 2008 R2용으로 빌드하고 싶은 경우에는 OutDir 환경 변수를 다음과 같이 맞춰주면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > SET TARGETOS=win7 msbuild ... /p:OutDir=%CURRENTDIR%\bin\%TARGETOS% </pre> <br /> 그런데, 여기서 고려해야 할 사항이 있지요. 운영체제마다 소스 코드 내에 사용되는 구조체 필드의 offset 값, 상수값들이 틀릴 수 있기 때문에 이에 대한 지원을 포함시켜 주어야 합니다. 물론, 이런 경우 프로젝트를 다르게 가져가는 것보다는 적절한 "전처리기"를 정의해서 소스 코드를 단일하게 관리하는 것이 더 편한데요.<br /> <br /> 예를 들어, 다음과 같이 DDK의 VER_PRODUCTBUILD에 따라 내부 정의를 달리하는 ntifs.h 파일을 include 하는 경우라면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > #include <ntddk.h> #include "ntifs.h" </pre> <br /> 다음과 같이 외부에서 정의 가능한 TARGET_PLATFORM_VER 전처리기를 끼워두고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > #include <ntddk.h> <b style='COLOR: blue'>#if defined( TARGET_PLATFORM_VER ) #if defined(VER_PRODUCTBUILD) #undef VER_PRODUCTBUILD #define VER_PRODUCTBUILD TARGET_PLATFORM_VER #else #define VER_PRODUCTBUILD TARGET_PLATFORM_VER #endif #endif</b> #include "ntifs.h" </pre> <br /> 그런 후에, "<a target='_tab' href='/2/0/871'>MSBuild를 이용한 VC++ 프로젝트 빌드</a>" 글에서 설명했던 것처럼, TARGET_PLATFORM_VER 전처리기를 msbuild에서 제어할 수 있도록 vcxproj 파일의 PreprocessorDefinitions를 바꿔주면 다음과 같이 개별 운영체제에 맞는 sys 파일을 생성할 수 있는 msbuild 배치가 구성됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > REM 32 bit Windows XP msbuild ".\DeviceDriverSample\DeviceDriverSample.vcxproj" /p:PLATFORM_PREPROCESSOR=<b style='COLOR: blue'>2600</b> ... REM 32 bit Windows 2003 msbuild ".\DeviceDriverSample\DeviceDriverSample.vcxproj" /p:PLATFORM_PREPROCESSOR=<b style='COLOR: blue'>3790</b> ... </pre> <br /> 와~~~ 그럼, 다음과 같은 정도의 빌드 스크립트를 구성하면 XP/2003/Vista/2008/2008 R2까지 개별 32/64비트 sys 파일이 생성되겠군요. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > REM Windows XP 32/64 SET TARGETOS=winxp msbuild ".\DeviceDriverSample\DeviceDriverSample.vcxproj" /p:PLATFORM_PREPROCESSOR=2600 /p:Platform=Win32;Configuration=%BUILDCONFIG% /p:TargetName=DeviceDriverSample32 /p:OutDir=%CURRENTDIR%bin\%TARGETOS%\ msbuild ".\DeviceDriverSample\DeviceDriverSample.vcxproj" /p:PLATFORM_PREPROCESSOR=2600 /p:Platform=x64;Configuration=%BUILDCONFIG% /p:TargetName=DeviceDriverSample64 /p:OutDir=%CURRENTDIR%bin\%TARGETOS%\ REM Windows 2003 32/64 SET TARGETOS=win2003 msbuild ".\DeviceDriverSample\DeviceDriverSample.vcxproj" /p:PLATFORM_PREPROCESSOR=3790 /p:Platform=Win32;Configuration=%BUILDCONFIG% /p:TargetName=DeviceDriverSample32 /p:OutDir=%CURRENTDIR%bin\%TARGETOS%\ msbuild ".\DeviceDriverSample\DeviceDriverSample.vcxproj" /p:PLATFORM_PREPROCESSOR=3790 /p:Platform=x64;Configuration=%BUILDCONFIG% /p:TargetName=DeviceDriverSample64 /p:OutDir=%CURRENTDIR%bin\%TARGETOS%\ REM Windows Vista/2008 32/64 SET TARGETOS=vista msbuild ".\DeviceDriverSample\DeviceDriverSample.vcxproj" /p:PLATFORM_PREPROCESSOR=6002 /p:Platform=Win32;Configuration=%BUILDCONFIG% /p:TargetName=DeviceDriverSample32 /p:OutDir=%CURRENTDIR%bin\%TARGETOS%\ msbuild ".\DeviceDriverSample\DeviceDriverSample.vcxproj" /p:PLATFORM_PREPROCESSOR=6002 /p:Platform=x64;Configuration=%BUILDCONFIG% /p:TargetName=DeviceDriverSample64 /p:OutDir=%CURRENTDIR%bin\%TARGETOS%\ REM Windows 7/2008 R2 32/64 SET TARGETOS=win7 msbuild ".\DeviceDriverSample\DeviceDriverSample.vcxproj" /p:PLATFORM_PREPROCESSOR=7600 /p:Platform=Win32;Configuration=%BUILDCONFIG% /p:TargetName=DeviceDriverSample32 /p:OutDir=%CURRENTDIR%bin\%TARGETOS%\ msbuild ".\DeviceDriverSample\DeviceDriverSample.vcxproj" /p:PLATFORM_PREPROCESSOR=7600 /p:Platform=x64;Configuration=%BUILDCONFIG% /p:TargetName=DeviceDriverSample64 /p:OutDir=%CURRENTDIR%bin\%TARGETOS%\ </pre> <br /> 마지막으로 배포는... 해당 VPC를 각각 만들어 두어서 복사 작업만 해주면 됩니다. 다음과 같이. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > SET TESTPC=WIN7X64EN robocopy %CURRENTDIR%bin \\%TESTPC%\d$\devicetest /S SET TESTPC=win2003x86 robocopy %CURRENTDIR%bin \\%TESTPC%\d$\devicetest /S SET TESTPC=win2008x86 robocopy %CURRENTDIR%bin \\%TESTPC%\d$\devicetest /S </pre> <br /> 그런데, 배포를 단순 복사하는 것만으로는 좀 아쉽죠. 복사하기 전 서비스를 중지 -> 복사 -> 서비스 시작하는 작업을 해주면 더 좋을 것 같습니다. 그럼 sc.exe 가 떠오르는 군요. ^^<br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > SET TESTPC=WIN7X64EN SET SERVICENAME64=%DriverName%64 sc \\%TESTPC% stop "%SERVICENAME64%" robocopy %CURRENTDIR%bin \\%TESTPC%\d$\devicetest /S sc \\%TESTPC% start "%SERVICENAME64%" </pre> <br /> 최초의 배포 한번은 오류가 날 테지만 상관없습니다. 다음 빌드부터는 편하게 자동으로 업데이트 되는 효과를 얻을 테니.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, 윈도우 운영체제가 Windows 7 x64/2008 R2부터는 정식 인증서로 서명하지 않은 드라이버는 올라오지 않게 됩니다. 이를 위해 우선, "테스트 인증서"로 서명해야 하는데요. 여기서는 다음에 첨부한 인증서를 가져다가,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 인증서 관련(CER, PVK, SPC, PFX) 파일 만드는 방법 ; <a target='_tab' href='/2/0/863'>http://www.sysnet.pe.kr/2/0/863</a> </pre> <br /> 아래의 글에서 설명한 방법 대로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Appinit_Dlls로 구현한 환경변수 설정 DLL ; <a target='_tab' href='/2/0/883'>http://www.sysnet.pe.kr/2/0/883</a> </pre> <br /> singtool.exe를 이용해서 서명하는 작업을 빌드 스크립트에 추가하였습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Signtool sign /v /sm /n "mytest" %CURRENTDIR%bin\%TARGETOS%\%SERVICENAME64%.sys </pre> <br /> 그다음, 아래와 같이 대상 운영체제에서 미리 관리자 권한으로 명령어를 실행해 두고 재부팅합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > === Windows 7 / 2008 R2 ==== bcdedit /set TESTSIGNING ON </pre> <br /> 위의 명령어가 실행된 PC에서는 "테스트 인증서"로 서명된 디바이스 드라이버를 로드할 수 있도록 허용되어지고, 구분을 쉽게 하기 위해 <a target='_tab' href='http://support.microsoft.com/default.aspx/kb/982393/ko?p=1'>바탕 화면에는 "Test Mode Windows 7 Build 7600"과 같은 메시지가 나타납니다.</a><br /> <br /> <hr style='width: 50%' /><br /> <br /> 기타 몇 가지 더... ^^<br /> <br /> 위의 sc.exe를 이용해서 대상 서비스를 로드/해제하게 되는데요. 이에 앞서 드라이버를 시스템에 등록해 주어야 합니다. 이런 경우, 쉽게 사용할 수 있는 툴이 "OSR Driver Loader"인데요. 다음의 경로에서 다운로드 받을 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > OSR Online - Driver Loader ; <a target='_tab' href='http://www.osronline.com/article.cfm?article=157'>http://www.osronline.com/article.cfm?article=157</a> </pre> <br /> <img alt='device_driver_build_script_1.png' src='/SysWebRes/bbs/device_driver_build_script_1.png' /><br /> <br /> 이 외에, 가상 머신에 대한 windbg 연결이 필요한 데, 그에 관해서는 다음의 글을 참조합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 원격 컴퓨터 디버깅 - VPC 설정 ; <a target='_tab' href='/2/0/265'>http://www.sysnet.pe.kr/2/0/265</a> </pre> <br /> 위의 글에서는 Virtual Server를 기준으로 설명하고 있지만, Hyper-V에서도 설정은 유사합니다.<br /> <br /> 그리고 중요한 것 하나 더!<br /> <br /> 소스 코드 형상관리는 잊으시면 안되죠. ^^ 이 부분은, 다음의 글을 참고하셔서 필요한 부분을 지금까지 위에서 설명한 빌드 스크립트에 추가해 주시면 되겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 배치 파일로 팀 빌드 구성 ; <a target='_tab' href='/2/0/905'>http://www.sysnet.pe.kr/2/0/905</a> </pre> <br /> 첨부한 파일은 제가 예제로 구성한 build.bat 파일과 예제 프로젝트입니다.<br /> <br /><br /><hr /><span style='color: Maroon'>[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1395
(왼쪽의 숫자를 입력해야 합니다.)