Notes: Device Stack. Device Object. Driver Object.

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

 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值