Types of Device Drivers
Windows可能会有User-mode的驱动,但是我们只关注Kernel-Mode的驱动。
WDM Drivers
WDM是一种驱动模型,是比较常用的驱动模型。
WDM可以分为以下几类:
- Bus Drivers
负责检测到连接到该总线的设备的与PnP/Power相关的事件,并且通知IO Manager, PnP Manager, Power
Manager。
- Function Drivers
负责某一具体设备的driver,是狭义上的driver。
Function Driver是唯一了解某类硬件特性,并且与这类硬件直接(通过调用HAL提供的接口)打交道的driver。
- Filter Drivers
过滤驱动,负责修改或者补充某些特定driver的功能。
Layered Drivers
Structure of a Driver
由各种routine构成
Driver Objects and Device Objects
加载driver,会调用init routine。
对于PnP driver,新的设备plug到系统上时,driver的add device routine会被调用,此时driver可以创建一个Device
Object;
对于其他driver,通常driver在init
routine时调用IoCreateDevice/IoCreateDeviceSecure创建Device Object;
对于应用程序来说,它要操作的是Device,它并不知道该Device相对应的Driver。应用程序如果要操作Device,只能按照文件模型来进行操作,比如Read/Write/IOControl。
而打开文件,必须知道文件的路径,对于Device来说,它们的路径是\Device目录下,这个路径是不能被应用程序访问到的,因此需要创建软链接到\Global??目录下,这样就可以被应用程序打开了。
对于PnP设备来说,它们的路径名是动态生成的GUID表示。
Device Object与Driver Object是互相通过指针关联在一起的。
Device Object里面保存device queue,里面保存所有发送到该设备上的IRP数据包;
IO System会将Device Object的device queue中的IRP按照一定的顺序取出,连同Device
Object的指针一同传递给Driver Object,由Driver调用相应的routine完成对于IRP的操作。