驱动开发学习笔记一
Windows 驱动的基本功能是为上层服务提供一些调用例程,总的来说,驱动程序可以分为用户模式的驱动(如,打印机驱动程序,和VDD)和内核模式的驱动,而内核模式的驱动有如下三种类型:
a ::文件系统驱动 File System drviers 处理I/O请求
b :即插即用驱动 Plug and Play drivers 用于pnp和电源管理的硬件设备
c :非即插即用驱动 NO plug and play drivers 用于扩展系统功能
DriverEntry的第一个参数是一个指针,指向一个刚被初始化的驱动程序对象,该对象就代表你的驱动程序。WDM驱动程序的DriverEntry例程应完成对这个对象的初始化并返回。非WDM驱动程序需要做大量额外的工作,它们必须探测自己的硬件,为硬件创建设备对象(用于代表硬件),配置并初始化硬件使其正常工作。而对于WDM驱动程序,颇麻烦的硬件探测和配置工作由PnP管理器自动完成,如果你想知道非WDM驱动程序是如何初始化自身的,参见Art Baker的《The Windows NT Device Driver Book (Prentice Hall, 1997)》、Viscarola和Mason的《Windows NT Device Driver Development (Macmillan, 1998)》。
DriverEntry的第二个参数是设备服务键的键名。这个串不是长期存在的(函数返回后可能消失),如果以后想使用该串就必须先把它复制到安全的地方。
这里我们只需要知道,DriverEnter函数的功能只是为由System进程创建的驱动对象进行初始化,例如,为常用IRP注册派遣例程,或者是startI/O例程,以及设置卸载例程函数和创建设备对象;
其实,上面这段代码中,真正创建设备的是IoCreateDevice函数,此函数在DDk中声明如下;
NTKERNELAPI
NTSTATUS
IoCreateDevice(
IN PDRIVER_OBJECT DriverObject, //设备对象
IN ULONG DeviceExtensionSize, //扩展大小
IN PUNICODE_STRING DeviceName OPTIONAL, //设备对象名
IN DEVICE_TYPE DeviceType, //设备类型
IN ULONG DeviceCharacteristics, //设备对象特征
IN BOOLEAN Exclusive, //设置设备对象是否可在内核模式下使用
OUT PDEVICE_OBJECT *DeviceObject //输出参数,I/o管理器负责创建这个设备对象
);
CreateDevice这个函数时,有几点需要注意:
1: 设备名称用unicode 字符指定,并且字符串必须是 “\Device\设备名 的形式,如磁盘分区C盘,为\Device\harddisk\volume1,当然你也可以不用指定设备名,但是这样做,不是设备就不需要设备名了,而是I/O管理器为设备创建一设备名,如果指定了设备名,只能被内核模式下的其他驱动程序识别,但是在用户模式下的应用程序能识别它吗?答案是否定的; 为了让用户模式的应用程序能够识别或者是使用设备,有两种方法可以使用: 一是通过创建一符号链接给用户模式应用程序使用,二是使用设备接口,一般NT中很少使用设备接口,而WDM中使用的较多;
2:你可以将符号链接理解为是设备对象的一个别名,设备对象的名称只能被内核模式下的驱动识别,而别名也可以被用户模式下的应用程序识别.创建符号链接用如下函数:
NTKERNELAPI
NTSTATUS
IoCreateSymbolicLink(
IN PUNICODE_STRING SymbolicLinkName,
IN PUNICODE_STRING DeviceName
);