한 걸음씩..

[Device Driver] DriverEntry Routine 본문

프로그래밍

[Device Driver] DriverEntry Routine

반엘 2013. 9. 1. 09:30


     DriverEntry Routine


DriverEntry Routine 은 Device Driver의 시작 위치이다.

코딩상에서 함수명을 반드시 'DeviceEntry' 라고 해야 하는 특징을 가지고 있다.

따라서 C++언어를 사용하는 경우에는 name mangling가 발생할 수 있으므로 반드시 extern "C" 명령을 사용해야 한다


extern "C"

NTSTATUS DriverEntry ( 

PDRIVER_OBJECT pDriverObject,

PUNICODE_STRING pRegistryPath )

{

pDriverObject->MajorFunction[IRP_MJ_PNP] = SamplePnpDispatch;

pDriverObject->DriverExtension->AddDevice = SampleAddDevice;

pDriverObject->DriverUnload = SampleUnload;

return STATUS_SUCCESS;

}



     DriveEntry를 호출하는 이유


1. 드라이버가 메모리에 처음 적재되는 경우에 필요로 하는 내부 변수등을 초기화 하는 작업을 Device Driver 측에서 먼저 수행하라는 의미이다.

똑같은 Device 장치를 같은 PC에 여러 대 설치한다 해도 똑같은 Device Driver를 여러 번 메모리에 적재되지 않고 DriverEntry 는 장치의 개수에 상관없이 단 한번만 호출된다


2. IO Manager가 DriverEntry 함수의 파라미터로 전달되는 pDriverObject를 통해서 Device Driver가 가지는 함수 엔트리를 등록하도록 되어 있다




      pDriverObject


 Device Driver 측에서 이 pDriverObject 구조체에 기록하는 자신의 함수 포인터는 크게 2종류로 나눌 수 있다


- IRP 명령어 처리 그룹

   - Create, Close, Pnp, Read, Write, IoControl 등등



#define IRP_MJ_CREATE                                    0x00 

#define IRP_MJ_CREATE_NAMED_PIPE                  0x01 

#define IRP_MJ_CLOSE                                      0x02 

#define IRP_MJ_READ                                        0x03 

#define IRP_MJ_WRITE                                       0x04 

#define IRP_MJ_QUERY_INFORMATION                  0x05 

#define IRP_MJ_SET_INFORMATION                      0x06 

#define IRP_MJ_QUERY_EA                                 0x07 

#define IRP_MJ_SET_EA                                     0x08 

#define IRP_MJ_FLUSH_BUFFERS                         0x09 

#define IRP_MJ_QUERY_VOLUME_INFORMATION     0x0a 

#define IRP_MJ_SET_VOLUME_INFORMATION         0x0b 

#define IRP_MJ_DIRECTORY_CONTROL                 0x0c 

#define IRP_MJ_FILE_SYSTEM_CONTROL              0x0d 

#define IRP_MJ_DEVICE_CONTROL                       0x0e 

#define IRP_MJ_INTERNAL_DEVICE_CONTROL        0x0f 

#define IRP_MJ_SHUTDOWN                               0x10 

#define IRP_MJ_LOCK_CONTROL                         0x11 

#define IRP_MJ_CLEANUP                                  0x12 

#define IRP_MJ_CREATE_MAILSLOT                    0x13 

#define IRP_MJ_QUERY_SECURITY                      0x14 

#define IRP_MJ_SET_SECURITY                          0x15 

#define IRP_MJ_POWER                                      0x16 

#define IRP_MJ_SYSTEM_CONTROL                    0x17 

#define IRP_MJ_DEVICE_CHANGE                        0x18 

#define IRP_MJ_QUERY_QUOTA                          0x19 

#define IRP_MJ_SET_QUOTA                              0x1a 

#define IRP_MJ_PNP                                         0x1b 


- IRP 명령어 처리 그룹 등록 방법

   - pDriverObject-> MajorFunction[ IRP_MJ_XXXX ] = XXXX를 처리할 함수 명 


- IRP 명령어 비 처리 그룹

   - AddDevice, Unload 등등


- IRP 명령어 비 처리 그룹 등록 방법

   -  pDriverObject->DriverExtension->AddDevice = SampleAddDevice;



      pRegistryPath

디바이스 드라이버를 설치하는 당시에 운영체제에 의해서 지정된 디바이스 드라이버를 위한 소프트웨어 서비스 키를 가리키는 위치 정보를 담고있다

시스템이 부팅되는 초반 시기에 메모리에 적재되는 디바이스 드라이버들은 시스템 레지스트리를 접근하는데 있어서 제한을 받게 된다

이때 pRegistryPath에서 가리키는 레지스트리 키는 언제든지 접근이 가능하다는 점에서 디바이스 드라이버들은 이곳을 정보 보관 장소로 사용하게된다.



출처 : 디바이스 드라이버 구조와 원리 그리고 제작 노하우