lanshy
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2005-02-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3380回复:23

驱动程序的层次问题!(20分)

楼主#
更多 发布于:2004-12-06 16:57
关于该主题的问题有:

1、到底是在一个Driver Stack里面有多个DeviceObject,还是在一个Device Stack里面有多个DrvierOjbect呢?(5分)

2、我在看NTDDK的例子,我如何能够知道这个例子的驱动程序位于哪个层次,其上层、下层的又是什么呢?(5分)

3、系统如何定位一个驱动程序在Stack里面的层次位置,其规则是什么?(5分)

4、我能不能在已定的两个层次之间插入一个层次呢?(5分)

多谢了,各位大侠!

[编辑 -  12/7/04 by  lanshy]
我现在在搞SDK,但一心想做驱动编程、然后嵌入式编程、直到硬件编程 QQ:40102229
lanshy
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2005-02-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-06 16:59
各位,该出手时就出手呀!

我一直迷糊,看msdn2003也没看多明白
我现在在搞SDK,但一心想做驱动编程、然后嵌入式编程、直到硬件编程 QQ:40102229
aiwadgj
驱动老牛
驱动老牛
  • 注册日期2004-11-13
  • 最后登录2020-12-24
  • 粉丝0
  • 关注0
  • 积分119分
  • 威望84点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-12-06 17:49
这哥们看的阿好仔细啊!
呵呵

问题(一)

应该是 DeviceStack(设备堆栈)
酒也在沉溺,何时麻醉我抑郁。过去了的一切会平息。。。。。。。
lanshy
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2005-02-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-06 20:05
对了,回答不要只下一个结论,最好给出原由。aiwadgj兄弟,能不能详细点?
我现在在搞SDK,但一心想做驱动编程、然后嵌入式编程、直到硬件编程 QQ:40102229
aiwadgj
驱动老牛
驱动老牛
  • 注册日期2004-11-13
  • 最后登录2020-12-24
  • 粉丝0
  • 关注0
  • 积分119分
  • 威望84点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2004-12-06 20:11
这些都是死东西!

它就叫做那东西,

你问我为什么叫啊?

我还不知道呢?

当然一开始要是人们叫它aiwadgj

那就是aiwadgj了。

名字是次要的,主要的是能明白它由什么用?

怎么用就足够了!

你说呢?
呵呵
酒也在沉溺,何时麻醉我抑郁。过去了的一切会平息。。。。。。。
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-07 09:14
1.内核加载的每个驱动程序对应一个设备链表,链表中的每个设备使用相同的驱动程序。
2.关于驱动堆栈,以文件系统为例,一个文件设备对应一个驱动堆栈,堆栈底层为最基本文件驱动,上面则是各种过滤驱动,再上面就是I/O管理器了,因为驱动对象也是由IoCreateDevice产生的,所以MSDN中有时也称为设备对象(例如IoAttachDeviceToDeviceStack的说明),但是它并非一般意义的设备。

不知道我的理解有没有问题,各位高手可以给指点一下。 :) :)
在交流中学习。。。
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-07 12:36
随便找一本介绍WDM的书,都有介绍
建议你看看书
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
lanshy
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2005-02-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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也是没有说明白这个问题!

大侠们,快出手吧!我郁闷极了。
我现在在搞SDK,但一心想做驱动编程、然后嵌入式编程、直到硬件编程 QQ:40102229
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
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的...
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
aiwadgj
驱动老牛
驱动老牛
  • 注册日期2004-11-13
  • 最后登录2020-12-24
  • 粉丝0
  • 关注0
  • 积分119分
  • 威望84点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2004-12-07 14:34
wowocock大侠的回答精彩!!!

呵呵

兄弟给加分吧。 :cool:
酒也在沉溺,何时麻醉我抑郁。过去了的一切会平息。。。。。。。
lanshy
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2005-02-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-07 14:36
To wowocock大侠:

1、你说的“设备对象的ATTACHEDDEVICE”和“设备对象扩展的ATTACHEDTO”,我查MSDN的DEVICE_OBJECT对象并无此成员,请问他们是属于什么对象?在哪里定义的?

2、提及的“设备栈顶的STACKSIZE”,请问如何获得设备栈顶,有API吗?
我现在在搞SDK,但一心想做驱动编程、然后嵌入式编程、直到硬件编程 QQ:40102229
lanshy
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2005-02-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-07 14:36
To wowocock大侠:

1、你说的“设备对象的ATTACHEDDEVICE”和“设备对象扩展的ATTACHEDTO”,我查MSDN的DEVICE_OBJECT对象并无此成员,请问他们是属于什么对象?在哪里定义的?

2、提及的“设备栈顶的STACKSIZE”,请问如何获得设备栈顶,有API吗?

多谢!
我现在在搞SDK,但一心想做驱动编程、然后嵌入式编程、直到硬件编程 QQ:40102229
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
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;
}

花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
lanshy
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2005-02-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-08 10:11
谢谢,你回答了两个问题,给你10分。多谢多谢!
我现在在搞SDK,但一心想做驱动编程、然后嵌入式编程、直到硬件编程 QQ:40102229
lanshy
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2005-02-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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.
我现在在搞SDK,但一心想做驱动编程、然后嵌入式编程、直到硬件编程 QQ:40102229
lanshy
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2005-02-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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之间的层次定位?(因为它们都可以有多个)


我现在在搞SDK,但一心想做驱动编程、然后嵌入式编程、直到硬件编程 QQ:40102229
lanshy
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2005-02-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-12-08 14:10
大侠们,继续呀!
我现在在搞SDK,但一心想做驱动编程、然后嵌入式编程、直到硬件编程 QQ:40102229
d1y2j3
驱动牛犊
驱动牛犊
  • 注册日期2003-10-19
  • 最后登录2011-05-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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的顺序。
lanshy
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2005-02-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-12-17 09:04
TO d1y2j3大侠:
 
你说的“device键”、“class键”、“Service值”是注册表的键吗?我怎没有HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services下面找到,请问是在什么地方有这些东西??

还有,你的意思是不是说,那个设备对象挂在什么地方是在注册表中指点的,是吗?(就像在inf文件中指定这个func驱动设备对象上面挂哪些filter驱动程序一样)

我理解对不??
我现在在搞SDK,但一心想做驱动编程、然后嵌入式编程、直到硬件编程 QQ:40102229
datin
驱动牛犊
驱动牛犊
  • 注册日期2004-11-30
  • 最后登录2004-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-12-17 10:10
我也是好多不懂,看一本书哦,又那么多东西,有大侠教一下经验会好多的
datin
上一页
游客

返回顶部