1.
Driver Object: 主要涉及内容: 入口DriverEntry , Unload, 以及Dispatch 函数。DriverEntry , Unload 即是针对此对象,各含一个PDRIVER_OBJECT 参数( 这是系统传递的)
Device Object: 对设备进行操作的对象,如读写。 同一个driver可以创建 多个 device obj。 各dispatch 函数中即需传递一个PDEVICE_OBJECT 以指明操作针对哪个device.
层次:
所建Device 可为FilterDevice/FDO/PDO。
驱动也是分层的。
DRIVER_OBJECT 中维护一个 PDEVICE_OBJECT DeviceObject.
DEVICE_OBJECT 中维护一个 PDEVICE_OBJECT NextDevice.
经调试验证: driverObj->DeviceObject指向这个driver创建的最后一个device object, 在IoCreateDevice时, IoManager 会自动维护这2个指针。 e.g. 第一次create 的dev1, dev1->NextDevice为NULL, 此时 driverObj->DeviceObject 指向的就是dev1。 倘若再次 create dev2, 成功后, dev2->NextDevice = dev1. driverObj->DeviceObject = dev2;
DeviceObject --> Dev1<---
|
DeviceObject --> Dev2 -----
DeviceStack:
Attach 成。 IoAtachDevice IoAttachDeviceToDeviceStack IoAttachDeviceToDeviceStackSafe. 个人理解:这里的device stack 指的是 绑定的设备栈, 是区别于 devObj->NextDevice 的, NextDevice指针 用来维护的是同一个driver创建的device list, 其中他们中有可能被attach到某个设备栈里了。
e.g. (可参考《寒江独钓》4章 键盘过滤 中attach操作)
[Stack 1] [ Stack2]
SrcDev1 <---(NextDevice)--- SrcDev2 (Created by filter driver)
---------- -----------
OldTop1---(NextDevice)----> OldTop2
---------- ------------
... ....
---------- -----------
Target1 Target2
--------- ----------
... ....
--------
Lowest(bus)
----------------
Attach 操作是栈操作, 所以不会打乱已有的元素顺序, 总是加在栈顶(push),即最上层。 SourceDevice : 想Attach哪个device?
TargetDevice: Attach到哪个设备所在的栈? ReturnDevice(LowerDevice): Attach成功后位于SourceDevice下的device,也就是attach之前的最上层device(原最上层)。 之所以返回这个,因为 需要知道它(PDEVICE_OBJECT),以便将 请求发下去。
http://msdn.microsoft.com/en-us/library/ff565639%28VS.85%29.aspx