2008. 9. 4. 14:40
DriverEntry()
2008. 9. 4. 14:40 in Windows/Device Driver
디바이스 드라이버가 최초로 시작되는 DriverEntry()에 대해 간단하게 알아보자!
이름 그대로 Driver Entry.. 드라이버의 엔트리(입장)이다. 일반적인 프로그램.. 예를 들의 C 프로그램에서 main()과 같은 역할을 하는 함수라고 보면 된다.
MSDN의 내용을 참고 하고 싶으면.. 여기를 클릭해서 보길 바람!!
드라이버는 I/O Manager에 의해 메모리에 로드(load)되어지고, I/O Manager는 DriverObject를 만들어 DriverEntry() 함수를 호출한다.
그리고 이 DriverEntry() 함수에서는 DriverObject를 초기화 해주는 작업을 진행하게 된다.
초기화 해주는 작업이란것은 드라이버의 I/O 요청에 의한 IRP를 처리해주는 핸들러(함수)를 초기화 해주는 것이라고 알면 될듯 하다.
다음은 WDM 드라이버인 kbfiltr(Keyboard Filter Driver)의 DriverEntry()이다.
NTSTATUS DriverEntry ( IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath )
{
ULONG i;
UNREFERENCED_PARAMETER (RegistryPath);
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) {
DriverObject->MajorFunction[i] = KbFilter_DispatchPassThrough;
}
DriverObject->MajorFunction [IRP_MJ_CREATE] =
DriverObject->MajorFunction [IRP_MJ_CLOSE] = KbFilter_CreateClose;
DriverObject->MajorFunction [IRP_MJ_PNP] = KbFilter_PnP;
DriverObject->MajorFunction [IRP_MJ_POWER] = KbFilter_Power;
DriverObject->MajorFunction [IRP_MJ_INTERNAL_DEVICE_CONTROL] =
KbFilter_InternIoCtl;
DriverObject->DriverUnload = KbFilter_Unload;
DriverObject->DriverExtension->AddDevice = KbFilter_AddDevice;
return STATUS_SUCCESS;
}
IN PUNICODE_STRING RegistryPath )
{
ULONG i;
UNREFERENCED_PARAMETER (RegistryPath);
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) {
DriverObject->MajorFunction[i] = KbFilter_DispatchPassThrough;
}
DriverObject->MajorFunction [IRP_MJ_CREATE] =
DriverObject->MajorFunction [IRP_MJ_CLOSE] = KbFilter_CreateClose;
DriverObject->MajorFunction [IRP_MJ_PNP] = KbFilter_PnP;
DriverObject->MajorFunction [IRP_MJ_POWER] = KbFilter_Power;
DriverObject->MajorFunction [IRP_MJ_INTERNAL_DEVICE_CONTROL] =
KbFilter_InternIoCtl;
DriverObject->DriverUnload = KbFilter_Unload;
DriverObject->DriverExtension->AddDevice = KbFilter_AddDevice;
return STATUS_SUCCESS;
}
하는 일을 보면, 인자로 넘어오는 DriverObject의 접근 가능한 필드를 채워넣는 작업을 하고 있다는 것을 알 수 있다.
IRP를 처리하기 위한 루틴들을 MajorFunction[]에 넣고 있다.
그리고 DriverExtension->AddDevice를 통해 AddDevice()를 호출한다.
WDM이 아닌 다른 방식의 드라이버의 DriverEntry()함수도 생긴 모습은 거의 동일하다.
다음은 Ctrl2Cap라는 함수의 DriverEntry() 이다.
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
{
...
ntStatus = IoCreateDevice (DriverObject,
0,
&deviceNameUnicodeString,
FILE_DEVICE_CTRL2CAP,
0,
TRUE,
&deviceObject );
if (NT_SUCCESS(ntStatus)) {
....
// Create dispatch points for all the IRPs the keyboard class device handles.
DriverObject->MajorFunction[IRP_MJ_READ] = Ctrl2capDispatchRead;
DriverObject->MajorFunction[IRP_MJ_CREATE] =
DriverObject->MajorFunction[IRP_MJ_CLOSE] =
DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] =
DriverObject->MajorFunction[IRP_MJ_CLEANUP] =
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Ctrl2capDispatchGeneral;
}
...
return Ctrl2capInit( DriverObject );
}
{
...
ntStatus = IoCreateDevice (DriverObject,
0,
&deviceNameUnicodeString,
FILE_DEVICE_CTRL2CAP,
0,
TRUE,
&deviceObject );
if (NT_SUCCESS(ntStatus)) {
....
// Create dispatch points for all the IRPs the keyboard class device handles.
DriverObject->MajorFunction[IRP_MJ_READ] = Ctrl2capDispatchRead;
DriverObject->MajorFunction[IRP_MJ_CREATE] =
DriverObject->MajorFunction[IRP_MJ_CLOSE] =
DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] =
DriverObject->MajorFunction[IRP_MJ_CLEANUP] =
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Ctrl2capDispatchGeneral;
}
...
return Ctrl2capInit( DriverObject );
}
대충 차이점을 보자면, WDM의 디바이스 드라이버는 DriverObject의 DeviceObject를 AddDevice에서 생성을하고, Ctrl2Cap와 같은 드라이버는 DriverEntry()에서 DeviceObject를 생성한다는 것... -_-;;
맞나 모르겠음...^^;
여튼 DriverEntry()의 하는 일은 현재 사용하고자 할 드라이버가 메모리에 적재될 때 , 디바이스 드라이버가 가지는 다양한 기능을 처리할 함수 엔트리들의 주소를 등록한다.
'Windows > Device Driver' 카테고리의 다른 글
키보드 스캔코드 (0) | 2009.05.21 |
---|---|
시스템 장치별 CLASS GUID (0) | 2009.02.17 |
DDK 다운로드, Windbg 사용... (2) | 2008.11.04 |
DEVICE_OBJECT (0) | 2008.09.04 |
DRIVER_OBJECT (1) | 2008.09.04 |