P87 每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候,被内核中的对象管理程序创建的。
驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载(准确的说,是由内核中的I/O管理器负责加载的),并且内核对一个驱动只加载一个实例。
P89 每个驱动程序都会创建一个或多个设备对象,用DEVICE_OBJECT数据结构表示。
AttachedDevice:是一个指针,指向附加在自身上面的一个上层设备对象。也就是说,如果有更高一层的设备对象附加在自身设备对象的时候,AttachedDevice指向的就是那个高一层的设备对象。如P103中,当一个FDO附加在PDO上的时候,PDO设备对象的子域AttachedDevice会记录FDO的位置。
P90 在驱动程序中,应该尽量避免全局变量的使用,因为全局变量设计不容易同步的问题。解决的办法:将全局变量存在设备扩展中。
P91 设备扩展是由程序员指定内容和大小,由I/O管理器创建的,并保存在非分页内存中。
P93 DriverEntry主要是对驱动程序进行初始化工作,它是由系统进程所调用的。
P95 让用户模式下的应用程序能识别设有两种方法,一是通过符号链接找到设备,二是通过设备接口找到设备。
P96 在内核模式下,符号链接是以"\??\"开头的(或者是以"\DosDevices\"开头的)。而在用户模式下,则是以"\\.\"开头的。
P102 在WDM模型中,完成一个设备的操作,至少有两个设备对象共同完成。一个是物理设备对象(Physical Device Object,简称PDO),另一个是功能设备对象(Function Device Object,简称FDO)。
WDM驱动和NT驱动的区别有:
1. P104 NT式驱动中,创建设备对象是在DriverEntry中实现的。而WDM驱动中,创建设备对象不在DriverEntry中,而是放在了AddDevice例程中。
2. P104 WDM驱动中,在DriverEntry中,需要设置对IRP_MJ_PNP处理的派遣函数。而NT式驱动中不需要。
3. P107 NT式驱动中,DriverUnload例程主要负责做删除设备和取消符号链接的工作。而在WDM驱动中,这部分操作被IRP_MN_REMOVE_DEVICE的处理函数所负责。
P108 在IRP_MN_REMOVE_DEVICE的处理函数中,除了删除设备和取消符号链接外,在此函数中还需要使用函数IoDetachDevice函数将FDO从PDO的堆栈中“摘除”下来。
P114 两个小程序