TOASTER例子阅读(一)

来源:互联网 发布:免备案php香港免费空间 编辑:程序博客网 时间:2024/04/29 20:16

TOASTER例子阅读(一)

1、 I/O管理器(根总线)为总线生成并维护PDO,总线驱动为插入的设备生成并维护PDO(即下层设备驱动为上层设备生成并维护PDO);驱动程序中的AddDevice例程接受的参数PhysicalDeviceObject就是下层设备为其生成的PDO, AddDevice例程Create的只能是该设备的FDO

2、 总线驱动发现新设备插入后,通过调用IoInvalidateDeviceRelations告诉PnP管理器BusRelations改变(注意:IoInvalidateDeviceRelations中传入的DeviceObject是总线的PDO)PnP管理器发送IRP_MN_QUERY_DEVICE_RELATIONS查询BusRelations此时总线设备的FDO为新设备生成PDO,并报告。

BTWTOASTER总线驱动是在发现新设备插入后就生成子PDO,然后通知PnP管理器;然后PnP管理器进行查询。这与DDK中说明不一致,可能无关紧要??

3、 UnPlug动作发生时,如同Plug动作发生,总线驱动(FDO) 通过调用IoInvalidateDeviceRelations告诉I/O管理器BusRelations改变(注意:IoInvalidateDeviceRelations中传入的DeviceObject是总线的PDO,不是此时UnPlug的设备PDO)

4、 当设备发生Eject动作时,总线驱动(FDO) 通过调用IoRequestDeviceEject告诉I/O管理器,此时IoRequestDeviceEject的参数PhysicalDeviceObject是该设备的PDO

5、 总线驱动程序需要处理两类PnP事件,一类发给总线FDOPnP事件,一类是总线驱动为插入的设备生成的PDOPnP事件。对于发给总线FDOPnP事件,一般都需要继续下传,而对于发给为插入的设备生成的PDOPnP事件则IoCompleteRequest

6、 每一个设备都有一个设备堆栈,在该设备堆栈里,代表该设备的PDO永远都处于最底层。总线的PDO与在总线上的设备PDO没有层次关系。但是总线驱动程序负责生成其发现的设备的PDO,设备提供商提供的驱动程序主要是该设备的FDOFDO进行数据传输/功能作业时一般不需要与代表设备的PDO进行交互。

7、 FiDO都是相对FDO而言,Upper FiDO表明该FiDO在设备堆栈中处于FDO的上面,Lower FiDO表明该FiDO在设备堆栈中处于FDO的下面;但所有的一切都处于PDO的上面。

8、 PnP管理器不保证设备堆栈中的驱动加载顺序,但是它保证了调用AddDevice的顺序来确保Stack的正确。

9、 如果设备处于Raw状态,则它的设备堆栈里只有PDO与总线驱动生成的FiDO

http://superchaozhou.spaces.live.com/Blog/cns!F08DB5D358C5E29F!184.entry

原创粉丝点击