[DDK] 가장 간단한 커널 드라이버 코드 작성

디바이스 드라이버를 공부하면서 가장 어려운 것이 있다.

"왜 이런 구조이지? 왜 기존의 프로그램 구조랑 다르지?"

제약도 많이 존재한다. BSOD의 압박,

기본적인 드라이버를 작성할때 조건이 몇가지 있다.

일단은 DriverEntry() 가 존재해야한다.

DriverEntry()는 Main() 함수랑 같다.

DriverEntry() 안에서 Dispatch 루틴을 작성해야한다.

그리고 Unload() 루틴도 작성해야한다. 등록을 했으면 리소스를 반납해야한다.

그리고 MAKEFILESOURCES 파일이 필요하다.

이렇게 알았으면 코드를 보자.
 
  1. #include "ntddk.h"  
  2.  
  3. #define FILE_DEVICE_HZ 0x9000  
  4.  
  5. VOID HzUnload( IN PDRIVER_OBJECT );  
  6.  
  7. typedef struct _DEVICE_EXTENSION  
  8. {  
  9.     ULONG Ordinal;  
  10. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;  
  11.  
  12. NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegPath )  
  13. {  
  14.     // 드라이버 로드된 것을 DebugView에 뿌려준다.  
  15.     DbgPrint("HzDevice is Loaded\n");  
  16.       
  17.     // Dispatch Table을 작성한다.  
  18.     DriverObject->DriverUnload = HzUnload;  
  19.           
  20.     return STATUS_SUCCESS;  
  21. }  
  22.  
  23. VOID HzUnload( IN PDRIVER_OBJECT DriverObject )  
  24. {  
  25.     DbgPrint(" Hz Driver UnLoaded \n");  
  26. }  
<TEXTAREA class="cpp" style="DISPLAY: none" name=code rows=10 cols=60>#include "ntddk.h" #define FILE_DEVICE_HZ 0x9000 VOID HzUnload( IN PDRIVER_OBJECT ); typedef struct _DEVICE_EXTENSION { ULONG Ordinal; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegPath ) { // 드라이버 로드된 것을 DebugView에 뿌려준다. DbgPrint("HzDevice is Loaded\n"); // Dispatch Table을 작성한다. DriverObject->DriverUnload = HzUnload; return STATUS_SUCCESS; } VOID HzUnload( IN PDRIVER_OBJECT DriverObject ) { DbgPrint(" Hz Driver UnLoaded \n"); } </TEXTAREA>

Driver Loader란 프로그램을 다운로드 해서 등록을 시켜보자.

DriverLoader를 못구하겠다면 SCM을 이용해서 프로그램을 작성하면된다.

나중에 시간나면 코드를 올려야겠다.

이렇게 해서 DebugView로 출력을 보고 있으면

Load, Unload 글자가 뜨는것을 확인할 수 있을것이다.

다음에는 Driver의 Dispatch 루틴과 Unload 루틴을 좀더 보강시켜보자.
 
출처 : http://ssmhz.tistory.com
위로 스크롤