1.背景
DriverEntry主要作用是对驱动程序进行初始化工作,它是由系统进程所调用的。DriverEntry的返回值是NTSTATUS,这是一个是被定义为32位的无符号长整形。不同的值对应不同的返回状态。DriverObject是一个驱动对象的指针,RegistryPath是一个指向设备服务器键键名的字符串指针;在DriverEntry函数中,一般设置卸载例程数和IRP的派遣函数,另外还有一部分代码负责创建设备对象。设置卸载例程和设置派遣函数都是对驱动对象的的设置。
extern "C" NTSTATUS DriverEntry (IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{
NTSTATUS status;
DbgPrint(("Wlcome to A Driver!n"));
pDriverObject->MajorFunction[IRP_MJ_CREATE] = FirstDriverRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = FirstDriverRoutine;
pDriverObject->MajorFun8ction[IRP_MJ_WRITE] = FirstDriverRoutine;
pDriverObject->MajorFunction[IRP_MJ_READ] = FirstDriverRoutine;
pDriverObject->DriverUnload = FirstDriverUnload;
//创建驱动设备对象
status = DriverCreateDevice(pDriverObject);
DbgPrint(("See you Again!I'm Kr0netn"));
return status;
}
DriverEntry内部有一个函数DriverCreateDevice(),这是实际是一个自定义的函数,在其内部实现了相关功能,它传入驱动对象的指针。
来看DriverCreateDevice函数,实际上可以直接将这个函数的内容放在DriveEntry函数里。
NTSTATUS DriverCreateDevice (IN PDRIVER_OBJECTpDriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENSION pDevExt;
//1.创建设备名称
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\Device\MyFirstDevice");
//2.创建设备
status = IoCreateDevice( pDriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
FILE_DEVICE_UNKNOWN,
0, TRUE,
&pDevObj );
if (!NT_SUCCESS(status)
{
DbgPrint(("CreateDevice Unsuccess!"));
return status;
}
pDevObj->Flags |= DO_BUFFERED_IO;
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDevice = pDevObj;
pDevExt->ustrDeviceName = devName;
//3.创建符号链接
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\??\FirstDriver");
pDevExt->ustrSymLinkName = symLinkName;
status = IoCreateSymbolicLink( &symLinkName,&devName );
//4.删除设备
if (!NT_SUCCESS(status))
{
IoDeleteDevice( pDevObj );
return status;
}
return STATUS_SUCCESS;
}