一、NT式驱动的基本例程
1. 驱动入口函数——DriverEntry
// 驱动程序的一般性定义 NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath); //
DriverEntry的主要工作是对驱动程序进行初始化。它由系统进程System调用的。驱动被加载的时候会创建一个驱动对象,查询此驱动程序对应的注册表项。
DriverEntry被调用的时候会传进两个参数。他们分别是刚才创建的驱动对象的指针和指向设备服务键的键名字符串指针。这个字符串的内容一般是\RESGISTRY\MACHINE\SYSTEM\ControlSet\Services\[服务名]。在驱动程序中,字符串一般以UNICODE形式存在:
注:设备服务键的键名有时候需要保存下来,当函数返回的时候此值可能会被清空。DriverEntry等内核函数的返回值一般是NTSTATUS类型的。使用宏NT_SUCCESS(NTSTATUS status)可检测返回状态是否成功。
在DriverEntry中,一般需要做一下几件事情:
a. 设置驱动卸载例程
b. IRP的派发函数
c. 创建设备对象
其中,驱动卸载例程与IRP派发函数都是对驱动对象设置的。设备对象中有一个MajorFunction数字,用来存放哥哥IRP派发函数的函数指针。
在NT式驱动中,创建设备对象可以调用IoCreateDevice:
// IoCreateDevice在WDK中的定义 NTKERNELAPI NTSTATUS IoCreateDevice( __in PDRIVER_OBJECT DriverObject, __in ULONG DeviceExtensionSize, __in_opt PUNICODE_STRING DeviceName, __in DEVICE_TYPE DeviceType, __in ULONG DeviceCharacteristics, __in BOOLEAN Exclusive, __out __drv_out_deref( __drv_allocatesMem(Mem) __drv_when((((inFunctionClass$("DRIVER_INITIALIZE")) ||(inFunctionClass$("DRIVER_DISPATCH")))), __drv_aliasesMem) __on_failure(__null)) PDEVICE_OBJECT *DeviceObject ); //
DriverObject:当前驱动对象指针。
DeviceExtensionSize:设备扩展的大小。IO管理器会根据这个大小在内存中创建设备扩展,并与驱动