I am Pengrammer :)

Programming/Windows Driver

DriverEntry 함수

펭구 2016. 3. 30. 11:35

DriverEntry 함수




C언어에서는 main()함수가 entry point가 된다.

Windows 응용프로그램에서는 WinMain() 함수가 entry point가 된다.


이처럼 드라이버에서는 DriverEntry 함수가 entry point 역할을 하게 된다. 

그래서 드라이버에서의 초기화 작업은 이 DriverEntry 함수에서 해주면 된다.

DriverEntry는 디바이스가 몇 개가 들어오든 맨 처음 한번만 호출된다.


DRIVER_INITIALIZE DriverEntry;

NTSTATUS DriverEntry(
  _In_ struct _DRIVER_OBJECT *DriverObject,
  _In_ PUNICODE_STRING       RegistryPath
)
{ ... }

pDriverObject

pDriverObject 구조체에 기록하는 자신의 함수 포인터는 크게 2종류로 나뉜다. 


1. IRP 명령어 처리 그룹

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

 - ex) pDriverObject->MajorFunction[IRP_MJ_***] = ****를 처리할 함수명


2. IRP 명령어 비처리 그룹

 - AddDevice, Unload 등

 - ex) pDriverObject->DriverExtension->AddDevice = SampleAddDevice;


pRegistryPath

디바이스 드라이버를 설치하는 당시에 운영체제에 의해서 지정된 디바이스 드라이버를 위한 소프트웨어 서비스 키를 가리키는 위치 정보를 담고있다. 시스템이 부팅되는 초반 시기에 메모리에 적재되는 디바이스 드라이버들은 시스템 레지스트리를 접근하는데 있어서 제한을 받게 된다. 

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




+ Reference

1. [책] 디바이스 드라이버 구조와 원리 그리고 제작 노하우

2. https://blogs.msdn.microsoft.com/noenemy/2009/09/11/driverentry/