在WDM程序中,创建设备等功能都被转移到AddDevice例程中。AddDevice是WDM驱动与老式NT式驱动的重要区别。
当有设备插入电脑后,系统总线驱动(根总线)会枚举到有新设备被插入;这时会通知PNP管理器寻找需要加载的设备驱动。根据此种设备的总线,PNP管理器会加载相应的总线驱动设备,并得到这种物理设备对象(PDO);PNP管理器会根据ProductID,VendorID等信息加载这种设备的驱动,并将刚才创建好的PDO作为参数,传递给AddDevice例程,而AddDevice例程会将自己的设备对象挂载在PDO之上。至此设备栈创建完毕。
1、功能设备对象
是DEVICE_OBJECT数据结构,一般由AddDevice例程创建,然后加载在物理设备对象上。功能设备对象的驱动也会在DriverEntry里设置各个派遣函数的入口。
2、物理设备对象
可以用Device Object Viewer来观察一下。
当系统启动时,根总线驱动被加载,然后寻找挂载于根总线上的驱动设备。如果发现有PCI设备,就会加载PCI设备的PDO,然后寻找适合的FDO进行加载。如USB适配器等会被当做是PCI设备,被加载PDO,FDO。
物理设备对象一般都是由总线驱动所创建的设备。WDM使人们都更多的精力放在FDO上。在PDO与FDO之间可以加入一个或多个过滤驱动,过滤驱动可以从中截取并修改即插即用相关的IRP。
WDM是基于分层驱动的概念发展而来的。WDM驱动一般分为总线驱动程序和功能驱动程序。功能驱动程序挂载于总线上,功能驱动程序处理一部分IRP,大部分的即插即用IRP和电源处理IRP被转发到总线驱动上处理。