GomeNasai
驱动牛犊
驱动牛犊
  • 注册日期2003-06-18
  • 最后登录2006-06-01
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1221回复:5

新手求教

楼主#
更多 发布于:2004-02-27 10:46
 :D
1。请问:Win32应用程序中CreateFile()所获得的Handle是从哪,以什么形式分配来的呢?因为在“Windows WDM设备驱动程序开发指南“的例子程序WDM1中,Wdm1Create()好像并没有返回什么句柄之类的。

2。在Windows系统中,设备栈是不只有一个,所有的设备都往上添呢.还是每一类设备有一个设备栈?在“Windows WDM设备驱动程序开发指南“中好像说得不太清楚。

请指教。谢谢!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-02-27 15:08
Handle是内核数据结构表的索引
设备栈是不只有一个,同一种设备类型里所有的设备都往上添。
UPFILTER-》FDO-》LOWER FILTER-》PDO
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
GomeNasai
驱动牛犊
驱动牛犊
  • 注册日期2003-06-18
  • 最后登录2006-06-01
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-02-27 17:13
谢谢答复。

那么,是不是可以这样理解呢,
对于1。在AddDevice()中,通过登录符号连接或设备接口,在系统内核就建立起了这么一个索引,之后在CreateFile()时,内核就可返回一个Handle了?那么,他是根本就不用经过驱动程序呢,还是驱动程序在Wdm1Create()中通过向下传递IO请求包(IRP)来由内核返回Handle呢?

对于2。是不就是说如果USB集线器上挂了3个设备的话,每一个设备都有一个自己的设备栈呢?

对不起,罗罗嗦嗦问了一大堆。
nosegay
驱动牛犊
驱动牛犊
  • 注册日期2003-12-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-02-28 16:11
在chris cant的书的wdm1的exe\wdm1test.cpp里的有wdm1的句柄,涉及到的函数如下。被main调用的函数GetDeviceViaInterface((LPGUID)&WDM1_GUID,0).此函数返回wdm1的句柄。GetDeviceViaInterface((LPGUID)&WDM1_GUID,0).此函数的WIN32调用保证打开指定GUID的设备信息集。最后以return rv=CreateFile( ifDetail->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);来返回实际句柄.rv返回至GetDeviceViaInterface
GomeNasai
驱动牛犊
驱动牛犊
  • 注册日期2003-06-18
  • 最后登录2006-06-01
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-03 17:41
谢谢。
对不起,问题没有写清楚。
我想问的实际上就是Win32应用程序中的CreateFile()与驱动程序中的Create()例程之间是什么关系。因为在Wdm1Create()中正如作者所说什么也没做,只是把IRP向下传递,那么是不是通过这个传递,系统内核向CreateFile()返回一个句柄呢?还是在Wdm1这个例子中实际上没有Wdm1Create()也行?
nosegay
驱动牛犊
驱动牛犊
  • 注册日期2003-12-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-04 09:50
好象是必须的吧,在wdm1源代码的dispatch.cpp里的wdm1creat例程前面有一行注释写着//Handle IRP_MJ_CREATE requests
所以这例程可能是必须的,否则IRP_MJ_CREATE会找不到例程而返回失败(我是菜鸟,说不不定对)
游客

返回顶部