커널 드라이버에서 EventViewer를 위한 로그 작성

커널 드라이버에서 Event Log를 생성하기 위해서는 

    • 구현부
    • Message 리소스 작성
    • 시스템에 리소스 path 작성

이렇게 3부분을 살펴 보아야 한다.

System Event Log 작성을 위한 코드 작성

아래의 function과 data structure를 사용한다.

Function

Data Structure

IoAllocateErrorLogEntry()으로 IO_ERROR_LOG_PACKET 타입의 메모리를 할당받은 후 적절한 값을 assign 후 IoWriteErrorLogEntry()으로 log를 작성하면 된다. 

개념적으로는 IoFreeErrorLogEntry()이 필요하지만 드라이버에서 이를 직접 호출할 필요는 없다.

IO_ERROR_LOG_PACKET 구조체 값 뒷부분에 필요한 argument들을 연속적으로 넣어주면 된다.

이 구조체 값에는 몇몇 주요한 변수들이 있는데 이는 MSDN 문서를 참고한다.

 

과정은 단순하며 2가지 정도 주의할 점이 있다.

    1. 인자로 사용될 메모리 사이즈
    2. 2byte 문자열을 다룰 경우 IRQL 제한


인자의 사이즈 제한

IO_ERROR_LOG_PACKET 의 instance의 메모리 사이즈는 패킷 헤더 포함 size가 ERROR_LOG_MAXIMUM_SIZE를 넘지 못하며 헤더 패킷 size 48을 빼주면 52글자 정도 밖에는 쓸수 없다.

IoWriteErrorLogEntry passes at most 52 characters?

따라서 mc 파일로 작성된 것 외에 argument로는 52 character 그러니까 대략 104byte 정도 더 추가할 수 있다.

2byte 유니코드 사용으로 인한 IRQL 제한

1byte 문자열을 2byte 문자열로 변환할 때 라이브러리에서 제공해주는 일반적인 함수들은 유니코드 변환에 따른 테이블을 참조한다. 이것으로 인해 IRQL 문제가 발생한다.

참고로 변환에 사용해봤던 함수들은 RtlStringCbLength()swprintf_s() 이며 모두 문제를 일으켰다. (DW-23)

IRQL for RtlStringxxx functions

 

MC파일 작성

EventViewer에 남길 메시지를 별도의 text 리소스 파일로 작성해야 한다.

mvolmsg.mc
MessageID       = 5001
Severity        = Informational
SymbolicName    = MSG_DRIVER_LOAD
Language        = English
Driver is loading successfully.
.
MessageID       = 5002
Severity        = Error
SymbolicName    = MSG_NO_JOB
Language        = English
No Job on %2.
.
MessageID       = 5003
Severity        = Error
SymbolicName    = MSG_FIND_JOB_ERROR
Language        = English
cannot find same job on %2.
.
 
 
...

여기에 대한 좀더 자세한 내용은 Creating the Error Message Text File 을 참조한다.

MC.exe compile

MC.exe는 Visual Studio 설치 폴더 중 별도로 있는 util 이며 이를 찾으려면 Windows 버전에 맞는 곳의 bin 경로에서 찾으면 된다.

(참고로 난 c:\Program Files (x86)\Windows Kits\8.1\bin\x64\) 

mc 파일에 필요한 스트링 내용을 정리한 후 이를 message binary로 만드는 것은 아래의 명령어로 할 수 있다.

mc xxxxmsg.mc

이에 대한 자세한 내용은 Defining Custom Error Types를 참고하면 된다.

이렇게 mc build를 하고 나면

    • xxxxmsg.rc
    • xxxxmsg.h
    • MSG00001.bin

이렇게 3 파일이 생성되며 이를 모두 visual studio 프로젝트에 포함시켜 주면 된다.

출력 메시지 path 지정

드라이버에서 해야 할 작업을 모두 마쳤다면 마지막으로 레지스트리에 출력 메시지 binary의 path를 지정해 주는 일을 추가해 주어야 한다.

message binary의 위치가 지정되지 않았다면 아래처럼 실제 메시지 내용을 EventViewer에 보여주지 못한다.



xxxx.sys 를 빌드하면서 메시지도 포함시켰다면 xxxx.sys의 경로를 레지스트리에 지정해 주어야 하는데

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog\System\DriverName 경로에 아래의 값을 추가한다. 

(관련내용 : Registering as a Source of Error Messages)

    1. EventMessageFile (REG_EXPAND_SZ)
    2. TypesSupported (REG_DWORD)



이렇게 설정 후 별도의 리붓 없이 EventViewer를 실행시키면


이렇게 메시지가 정상적으로 보여진다.

Reference


Posted by 없다캐라
나보다 먼저 몸빵하셨을 선배님들의 글들을 링크하고 나서 나의 히스토리도 하나하나 기록으로 남겨둔다. 쿨럭쿨럭~


kernel driver 의 code signing을 위해 인증서를 신청했다.
줸장. 별것도 아니구만 물어 봐도 답변도 잘 안해주고. 시간 축낸거 생각하면 짜증나는 구만.

인증이 뭐고 서명이 뭐고 당췌 뭔얘긴지 모르니깐 어디서 부터 해야하는지 깝깝했다.

간단히 정리하자면 code signing을 하려면 인증서를 가지고 code sign을 한다.

인증서란? 그 회사가 실존하는 회사라는 것을 인증 해주는 것이다.
code signing이란? 그 회사에서 만들었다라고 싸인 하는 거다.

2008 & vista x64 부터는 signing 안된 드라이버는 인증서 찾느라고 아예 부팅도 안된다.
물론 개발상에 테스트 삼아 해 볼 수 있는 방법은 다 있으니 별도로 찾아보고.

아무튼,

1. 회사 인증서를 받자. 회사에 있으면 넘어가고
2. 커널 드라이버 파일에 code signing 하자
로 정리한다.



1. 인증서 받기

한국전자인증에 전화해서 물어봤다.

VeriSign껄루 추천해 주길래 신청했고, 사업자등록증이랑 회사명의가 있는 전화번호 영수증을 팩스로 보내주고
그 외 몇가지 정보 올리고 하니깐 

미국 VeriSign 지사에서 (본사는 호주) pin number 오고 다시 하라는대로 하니깐.

myprivatekey.pvk 와 mycredentials.spc 이렇게 2개의 파일이 왔다.

하나는 인증서 파일이고 다른건 키 파일이란다. 휴.

국내에서도 yessign껄루 하면 요즘은 행사기간인가? 암튼 있긴 있던데 내가 받아보질 않았으니 넘어가구.

자~ 이제 이걸루 뭘 어떡한다?



2. Code Signing 하자

1. 인증서를 pfx파일로 변환

 

드라이버용 code-signing를 하기 위해서는 pfx 파일이 필요하다.

그래서 pvk를 pfx로 변환하는 pvk2pfx.exe 를 사용한다. (pvk2pfx.exe는 ddk 설치하면 있다.)

 

아래대로 입력합니다. pvk파일과 spc 파일을 입력하고 만들게될 pfx파일 이름을 땡땡땡 주고 인증서 암호를 -pi와 -po 뒤에 준다.


위의 절차를 하고 나서 dir을 하면 땡땡땡.pfx 파일이 위에 처럼 생성됩니다.


 

2. CertMgr.msc 에 등록하기

 

여기다가 1.번에서 생성된 인증서 파일을 개인용 부분에 등록 한다.

개인용 에서 마우스 오른쪽으로 [모든작업] - [가져오기] 해서 생성 되었던 pfx 인증서 파일이랑 password를 입력합니다. 그리고 등록하면 아래처럼 된다.

    



3. ms의 cross-certificate 다운받아 준비해두기

뭔지는 잘 몰라도 VeriSign 업체용 ms 상호 인증서를 다운받아 둬야 한다.

상호 인증이라니깐 뭐 서로가 서로꺼는 자기꺼에서도 인증한다 이런건가? 암튼 그렇다.


code signing 할 때 같이 필요하니깐 있어야 된다.

참고로 MS 에서 상호 인증하는 회사가 몇개 있던데 yessign은 없더라. 안하길 잘한건가??? 

yessign도 무슨 방법이 있겠쥐.

 

http://www.microsoft.com/whdc//winlogo/drvsign/crosscert.mspx

 

이 사이트에서 맨 밑에 쯤 VeriSign 업체 버전으로 down 받는 곳이 있다.

그걸 다운 받아서 실행하면 압축이 풀리면서 MSCV-VSClass3.cer  파일을 구할수 있다.


준비는 끝났다. 서명하러 고고 


 

4. code signing 하기


ddk를 설치하면 signtool.exe가 있다.

 

인증서는 이미 certmgr에 등록시켜놨으니깐.

 

MSCV-VSClass3.cersigning할 드라이버 파일을 준비한다.



그림처럼 입력하면 끝이다.


그림처럼 입력이 ㅋㅋㅋ 저걸 다 치긴 힘드니깐 이거 끍어다가 하자.


signtool.exe sign /v /ac MSCV-VSClass3.cer /s my /n ???? /t http://timestamp.verisign.com/scripts/timestamp.dll ####.sys


참고로 ???? 는 인증서 이름이고 ####은 드라이버 파일 이름이다.

 

이 과정을 마친후의 드라이버 파일 사이즈를 보면 더 커진걸 알수 있다.



Posted by 없다캐라

inf 파일을 뜯어 보면 DestinationDirs 를 정해주는 것이 있는데 이게 숫자로 되어 있다.

[DefaultDestDir=dirid[,subdir]]
[file-list-section=dirid[,subdir]] ...

이런 형태로. 이게 ,

Value Destination Directory
01 SourceDrive:\pathname (the directory from which the INF file was installed)
10 Windows directory
This is equivalent to %windir%.
11 System directory
This is equivalent to %windir%\system32 for NT-based systems, and to %windir%\system for Windows 9x/Me.
12 Drivers directory
This is equivalent to %windir%\system32\drivers for NT-based platforms, and to %windir%\system\IoSubsys on Windows 9x/Me platforms.
17 INF file directory
18 Help directory
20 Fonts directory
21 Viewers directory
23 Color directory (ICM) (not used for installing printer drivers)
24 Root directory of the system disk.
This is the root directory of the disk on which Windows files are installed. For example, if dirid 10 is "C:\winnt", then dirid 24 is "C:\".
25 Shared directory
30 Root directory of the boot disk, also known as "ARC system partition," for NT-based systems. (This might or might not be the same directory as the one represented by dirid 24.)
50 System directory for NT-based operating systems

This is equivalent to %windir%\system (NT-based systems only).

51 Spool directory (not used for installing printer drivers – see Printer Dirids)
52 Spool drivers directory (not used for installing printer drivers)
53 User profile directory
54 Directory where ntldr.exe and osloader.exe are located (NT-based systems only)
55 Print processors directory (not used for installing printer drivers)
-1 Absolute path


이런 의미가 있었다. ㅡㅡ;

자세한건
http://www.osronline.com/ddkx/install/inf-format_8kfm.htm
http://www.osronline.com/ddkx/install/create-inf_3aav.htm

오늘 참 가지가지 배운다.

Posted by 없다캐라
참고 : http://www.dashken.net/index.php?/archives/244-Install-INF-Drivers-From-Command-Line-or-Script.html

RunDll32.exe setupapi,InstallHinfSection <section> <reboot-mode> <inf-name>

reboot mode:

NeverReboot
Set to 0 or 128. Whatever happens, the computer is not restarted. It's up to the client to determine whether the computer should be restarted. For Setup, this means there is a file C:\Windows\Wininit.ini that is not zero bytes in size.

AlwaysSilentReboot
Set to 1 or 129. The user is not prompted to restart the computer, and the computer will always restart.

AlwaysPromptReboot
Set to 2 or 130. The user will always be prompted about whether or not they want to restart the computer. Setup does not attempt to determine if restarting the computer is necessary.

SilentReboot
Set to 3 or 131. If Setup determines that the computer needs to be restarted, there is no user interaction.

PromptReboot
Set to 4 or 132. If Setup determines that the computer needs to be restarted, it prompts the user with a dialog box.

예를 들어, install은
rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 0 C:\Driver\test\test.inf
이런식으로 사용합니다.

역으로 uninstall은
rundll32.exe setupapi.dll,InstallHinfSection DefaultunInstall 0 C:\Driver\test\test.inf
Posted by 없다캐라

 타입 의미 
 SERVICE_BOOT_START (0x0) 디바이스 드라이버를 시스템 로더에 의하여 부팅시점에 실행하도록 한다. 
 SERVICE_SYSTEM_START (0x1) 디바이스 드라이버를 시스템 부팅 시 IoInitSystem함수가 호출 되는 시점에 실행되도록 한다. 
 SERVICE_AUTO_START (0x2) 부팅 시 SCM에 의하여 서비스 또는 디바이스 드라이버가 실행되도록 한다.
 SERVICE_DEMAND_START (0x3) 사용자에 의하여 StartService() 함수가  호출되어짐으로써 드라이버가 실행되도록 한다.
 SERVICE_DISABLED (0x4) 서비스를 시작하지 못하도록 한다. 
(출처 : Windows 구조와 원리 그리고 Codes - 정덕영 저)


HKLM\SYSTEM\CurrentControlSet\Services 에 등록되어 있다.

'Development > Windows Driver' 카테고리의 다른 글

INF의 DestinationDirs  (0) 2008.12.09
RunDll32를 사용한 install driver  (0) 2008.11.10
Driver Service StartType  (0) 2008.10.21
WinDbg target 머신 설정 (for vmware)  (0) 2008.10.13
DebugView로 dbgprintf를 보자.  (0) 2008.10.13
ddk 설치 및 sample의 compile  (0) 2008.10.10
Posted by 없다캐라
이전버튼 1 2 이전버튼

블로그 이미지
없다캐라

태그목록

공지사항

Yesterday40
Today22
Total188,692

달력

 « |  » 2018.11
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

글 보관함