阅读:1143回复:5
请教有关AddDevice
请问 NTSTATUS Wdm1AddDevice(IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT pdo)
里面我感觉 DriverObject 和 pdo 好像是一个东西,谁能给我讲讲联系和区别,多谢 |
|
|
沙发#
发布于:2005-03-11 11:55
请问 NTSTATUS Wdm1AddDevice(IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT pdo) 不是的,,pdo是设备对应的总线驱动创建的物理设备的抽象。。 DriverObject是你对应的功能驱动的抽象对象。。。 系统为他上面的每个资源都创建对象,,便于管理的。。 :P |
|
|
板凳#
发布于:2005-03-11 14:12
多谢aiwadgj兄的指点,可是我概念还是有点模糊
你说DriverObject是对应的功能驱动的抽象对象 那不是FDO吗?在AddDevice中还要声明一个PDEVICE_OBJECT fdo; 然后IoCreateDevice中还要用到fdo,如 status = IoCreateDevice (DriverObject, sizeof(WDM1_DEVICE_EXTENSION), NULL, // No Name FILE_DEVICE_UNKNOWN, 0, FALSE, // Not exclusive &fdo); 我说一下我对fdo和pdo的认识,感觉windows在最开始安装在电脑的时候会搜索硬件的基本信息,首先创立一个总线pdo,然后枚举总线上的设备,为每个设备创建一个pdo,windows根据驱动为这些设备创建一个正确的fdo,如果这个设备还要连接其他设备,那么这个fdo就扮演pdo的角色,枚举连在这个设备上的子设备,为每个子设备创建pdo,并通过用户提供的驱动程序,创建正确的fdo。如果还有子设备的子设备,就以此类推...就这么建立了一个堆栈,最上层是高层的驱动,下面是靠近总线的。要是从用户态调用驱动程序,则传进来一个irq,传递irq的方向和堆栈的建立方向相反,每一层传递都通过下层的实现来屏蔽自己的实现细节,这一点类似osi七层网络模型。 fdo和pdo的概念是相对的,在某一层是自己的fdo,在上一层看来就变成pdo了。 不知道我说的对不对,还要再次请教fdo,pdo,DriverObject三者的联系区别,谢谢 |
|
|
地板#
发布于:2005-03-11 14:57
DriverObject是驱动对象,PDO和FDO才是设备对象。
|
|
|
地下室#
发布于:2005-03-11 15:07
基本上就是你理解的那个样子吧。。。具体的说枚举总线设备的是总线驱动程序。。他们创建设备的pdo,之后加载设备的功能驱动与过滤驱动。。相应的的驱动创建各自响应的对象。。
驱动对象,,跟设备对象是不同的数据结构的。。这个你应该知道的, 而那些所谓的fdo或者pdo,其实都是一种的数据结构,就是各自的域的植不同而已了,,其实这两个感念(pdo与fdo)就是相对的概念。。。 [编辑 - 3/11/05 by aiwadgj] |
|
|
5楼#
发布于:2005-03-11 15:11
DriverObject对象指驱动对象,一个驱动程序相当于一个DriverObject。
由于一个驱动程序可以支持多个设备 pdo为物理设备对象,是pnp在枚举总线设备时为一个(注意:是一个)设备创建的 fdo是功能设备对象,具体负责这个设备的功能实现 所以一个DriverObject可以对应多个pdo和fdo |
|
|