阅读:3491回复:23
驱动程序的层次问题!(20分)
关于该主题的问题有:
1、到底是在一个Driver Stack里面有多个DeviceObject,还是在一个Device Stack里面有多个DrvierOjbect呢?(5分) 2、我在看NTDDK的例子,我如何能够知道这个例子的驱动程序位于哪个层次,其上层、下层的又是什么呢?(5分) 3、系统如何定位一个驱动程序在Stack里面的层次位置,其规则是什么?(5分) 4、我能不能在已定的两个层次之间插入一个层次呢?(5分) 多谢了,各位大侠! [编辑 - 12/7/04 by lanshy] |
|
|
沙发#
发布于:2004-12-06 16:59
各位,该出手时就出手呀!
我一直迷糊,看msdn2003也没看多明白 |
|
|
板凳#
发布于:2004-12-06 17:49
这哥们看的阿好仔细啊!
呵呵 问题(一) 应该是 DeviceStack(设备堆栈) |
|
|
地板#
发布于:2004-12-06 20:05
对了,回答不要只下一个结论,最好给出原由。aiwadgj兄弟,能不能详细点?
|
|
|
地下室#
发布于:2004-12-06 20:11
这些都是死东西!
它就叫做那东西, 你问我为什么叫啊? 我还不知道呢? 当然一开始要是人们叫它aiwadgj 那就是aiwadgj了。 名字是次要的,主要的是能明白它由什么用? 怎么用就足够了! 你说呢? 呵呵 |
|
|
5楼#
发布于:2004-12-07 09:14
1.内核加载的每个驱动程序对应一个设备链表,链表中的每个设备使用相同的驱动程序。
2.关于驱动堆栈,以文件系统为例,一个文件设备对应一个驱动堆栈,堆栈底层为最基本文件驱动,上面则是各种过滤驱动,再上面就是I/O管理器了,因为驱动对象也是由IoCreateDevice产生的,所以MSDN中有时也称为设备对象(例如IoAttachDeviceToDeviceStack的说明),但是它并非一般意义的设备。 不知道我的理解有没有问题,各位高手可以给指点一下。 :) :) |
|
|
6楼#
发布于:2004-12-07 12:36
随便找一本介绍WDM的书,都有介绍
建议你看看书 |
|
|
7楼#
发布于:2004-12-07 14:09
我看过Walter Oney的《Programming The Microsoft Windows Driver Model(WDM)》,书中只是提到:
PDO,FDO以及Function Driver,Filter Driver(Upper and Lower), 并没有提到: 1、我的驱动程序应该怎么写才是Function Driver层的,怎么写才是Filter Driver层的? 2、也没有提到驱动程序在AddDevice()例程中调用IoCreateObject()创建的是Driver Stack中什么层次的DeviceObject? 就连最权威的MSDN 2003也是没有说明白这个问题! 大侠们,快出手吧!我郁闷极了。 |
|
|
8楼#
发布于:2004-12-07 14:10
1、到底是在一个Driver Stack里面有多个DeviceObject,还是在一个Device Stack里面有多个DrvierOjbect呢?(5分)
一般有一至多个,每个设备对象都对应一个驱动对象 2、我在看NTDDK的例子,我如何能够知道这个例子的驱动程序位于哪个层次,其上层、下层的又是什么呢?(5分) 这个你可以自己枚举设备堆栈,上层设备对象位于设备对象的ATTACHEDDEVICE中,下层设备对象位于设备对象扩展的ATTACHEDTO中 3、系统如何定位一个驱动程序在Stack里面的层次位置,其规则是什么?(5分) 系统不管你都多少设备,他只根据设备栈顶的STACKSIZE来分配,然后把IRP发往设备栈顶的设备对象. 4、我能不能在已定的两个层次之间插入一个层次呢?(5分) 可以,但没有现成的函数可用,你必须自己搜索设备栈,然后更新相应的指针,还有必须把位于你插入设备对象之上的所有设备对象的STACKSIZE都要增加一,不然系统在IRP到底的时候会BUGCHECK的... |
|
|
9楼#
发布于:2004-12-07 14:34
wowocock大侠的回答精彩!!!
呵呵 兄弟给加分吧。 :cool: |
|
|
10楼#
发布于:2004-12-07 14:36
To wowocock大侠:
1、你说的“设备对象的ATTACHEDDEVICE”和“设备对象扩展的ATTACHEDTO”,我查MSDN的DEVICE_OBJECT对象并无此成员,请问他们是属于什么对象?在哪里定义的? 2、提及的“设备栈顶的STACKSIZE”,请问如何获得设备栈顶,有API吗? |
|
|
11楼#
发布于:2004-12-07 14:36
To wowocock大侠:
1、你说的“设备对象的ATTACHEDDEVICE”和“设备对象扩展的ATTACHEDTO”,我查MSDN的DEVICE_OBJECT对象并无此成员,请问他们是属于什么对象?在哪里定义的? 2、提及的“设备栈顶的STACKSIZE”,请问如何获得设备栈顶,有API吗? 多谢! |
|
|
12楼#
发布于:2004-12-08 09:14
1、你说的“设备对象的ATTACHEDDEVICE”和“设备对象扩展的ATTACHEDTO”,我查MSDN的DEVICE_OBJECT对象并无此成员,请问他们是属于什么对象?在哪里定义的?
DDK里有说明,你可以查看NTDDK.H里的结构. 2、提及的“设备栈顶的STACKSIZE”,请问如何获得设备栈顶,有API吗? 可以通过IOGETATTACHEDDEVICE,来获得栈顶设备然后再获得其STACKSIZE IoGetAttachedDevice proc near ; CODE XREF: IoGetRelatedDeviceObject+33p .text:00411BAC ; IoGetAttachedDeviceReference+12p ... .text:00411BAC .text:00411BAC arg_4 = dword ptr 8 .text:00411BAC .text:00411BAC mov edi, edi .text:00411BAE push ebp .text:00411BAF mov ebp, esp .text:00411BB1 mov eax, [ebp+arg_4] .text:00411BB4 .text:00411BB4 loc_411BB4: ; CODE XREF: IoGetAttachedDevice+15j .text:00411BB4 mov ecx, [eax+10h] .text:00411BB7 test ecx, ecx .text:00411BB9 jnz short loc_411BBF .text:00411BBB pop ebp .text:00411BBC retn 4 PDEVICE_OBJECT IoGetAttachedDevice(PDEVICE_OBJECT DeviceObject) { while(DeviceObject->Object) DeviceObject = DeviceObject->AttachedDevice; return DeviceObject; } |
|
|
13楼#
发布于:2004-12-08 10:11
谢谢,你回答了两个问题,给你10分。多谢多谢!
|
|
|
14楼#
发布于:2004-12-08 10:16
The operating system represents devices by device objects. One or more device objects are associated with each device. Device objects serve as the target of all operations on the device.
Devices are usually represented by multiple device objects, one for each driver in the driver stack that handles I/O requests for the device. The device objects for a device are organized into a device stack. Whenever an operation is performed on a device, the system passes an IRP data structure to the driver for the top device object in the device stack. Each driver either handles the IRP or passes it to the driver that is associated with the next-lower device object in the device stack. |
|
|
15楼#
发布于:2004-12-08 11:15
关于Bus Driver、Function Driver与Filter Driver的区别:
Creating Device Objects for WDM Function and Filter Drivers: WDM drivers, other than bus drivers, call IoCreateDevice to create their device objects. Most WDM drivers create their device objects from within their AddDevice routines. Some drivers, such as disk drivers that must respond to drive layout IOCTLs, call IoCreateDevice from a dispatch routine. Creating Device Objects for WDM Bus Drivers: A WDM bus driver creates a PDO when it is enumerating a new device in response to an IRP_MN_QUERY_DEVICE_RELATIONS request, if the relation type is BusRelations. 也就是说关键是看DEVICE_OBJECT在何处创建的来区别是bus driver还是function driver/filter driver; 但是fuction driver与filter driver的区别?以及funtion driver之间的层次如何定位,filter driver之间的层次定位?(因为它们都可以有多个) |
|
|
16楼#
发布于:2004-12-08 14:10
大侠们,继续呀!
|
|
|
17楼#
发布于:2004-12-16 22:30
不知道你看的是第1版还是第2版
第2版里介绍这个顺序 1. 系统首先调用被列在device键中的下层过滤器驱动中的AddDevice函数。其按LowerFilters值的顺序出现。 2. 其次系统调用被列在class键中的下层过滤器驱动的AddDevice函数。其顺序为驱动出现在LowerFilters串中的顺序。 3. 之后系统调用被列在在device键中Service值的驱动程序的AddDevice函数。这是功能驱动。 4. 系统调用被列在device键中的上层过滤器驱动中的AddDevice函数。其按UpperFilters数据串中的顺序出现。 5. 最终系统调用被列在class键中的上层过滤器驱动的AddDevice函数。其顺序为驱动出现在UpperFilters数据串中的顺序。 每一个AddDevice函数创建了一个DEVICE_OBJECT内核并将其链接到以PDO为根的栈中。因此,调用AddDevice的顺序决定了栈中设备对象的顺序 ,并且最终驱动程序看到了IRP的顺序。 |
|
18楼#
发布于:2004-12-17 09:04
TO d1y2j3大侠:
你说的“device键”、“class键”、“Service值”是注册表的键吗?我怎没有HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services下面找到,请问是在什么地方有这些东西?? 还有,你的意思是不是说,那个设备对象挂在什么地方是在注册表中指点的,是吗?(就像在inf文件中指定这个func驱动设备对象上面挂哪些filter驱动程序一样) 我理解对不?? |
|
|
19楼#
发布于:2004-12-17 10:10
我也是好多不懂,看一本书哦,又那么多东西,有大侠教一下经验会好多的
|
|
|
上一页
下一页