Windows 驱动开发基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38821919
NT类型的驱动即不是即插即用的驱动,主要包括3部分:DriverEntry函数,CreateDevice函数,DriverUnload函数.其实还有IRP派遣函数,但是这里先不做介绍。
接下来详细的说明一下。
系统启动的时候,就创建了系统进程;驱动加载的时候,系统启动一个新的线程,创建一个驱动对象。而当系统线程调用DriverEntry函数的时候,就实现了对驱动对象的初始化。
1. DriverEntry
extern “C”NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriver_Object,
IN PUNICODE_STRING pRegistryPath );
pDriver_Object:指向这个驱动对象。
pRegistryPath:指向设备服务键的键名字符串的指针。该字符串的内容一般为\REGISTRY\MACHINE\SYSTEM\ControlSet\Services\[服务名]。
其中:IN 是参数的修饰词,代表是 参数时输入,同理,OUT表示存催的输出,两个可以同时用。
返回值是一个32位的LONG,也就是NTSTATUS型的数据。
2. CreateDevice
是通过IoCreateDevice创建的,形式如下:
NTSTATUS
IoCreateDevice(
IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize, //指定设备扩展的大小
IN PUNICODE_STRING DeviceName OPTIONAL,//设备对象的名字
IN DEVICE_TYPE DeviceType,
IN ULONG DeviceCharacteristics,//设置设备对象的特征
IN BOOLEAN Exclusive,//设置设备对象是否在内核模式下使用,一般为TRUE
OUT PDEVICE_OBJECT *DeviceObject //指向新创建的设备对象。
);
需要指出的是,即便是给出了设备的名称也只能是被内核模式下其他驱动所识别,要用用户模式下面的应用程序识别就需要使用:符号链接的方法。也就是起一个别名的方式,就好像我们给硬盘取名叫“C盘”,就可以被其他的应用程序识别了。
这个函数是:
NTSTATUS
IoCreateSymbolicLink(
IN PUNICODE_STRING SymbolicLinkName,//别名(的地址)
IN PUNICODE_STRING DeviceName //这个设备
);
在内核模式下,符号链接就是以”\??\”开头的(或者“\DosDevice\”开头的)。如C盘就是“\??\C:”。而在用户模式下则是以“\\.\”开头的,如C盘就是“\\.\C:”
3. DriverUnload
一般负责删除掉DriverEntry里面创建的设备对象。同时也会删掉创建的符号链接。具体的函数如下:
VOID
IoDeleteDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
IoDeleteSymbolicLink(
IN PUNICODE_STRING SymbolicLinkName
);