zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
阅读:1418回复:9

PDEVICE_OBJECT的有效范围

楼主#
更多 发布于:2005-06-03 09:24
大家讨论一下:我用IoGetDeviceObjectPointer得到了 PFILE_OBJECT  和PDEVICE_OBJECT类型的两个变量,我想知道这两个变量的有效范围,是线程内有效?进程内有效?进程外有效吗?
如果我把这个两个变量传递到本线程外的线程(比如驱动中创建的系统线程,但是还是在一个进程内),是否可以在线程外引用这两个变量?如果我传递到本进程外,或者另外一个驱动程序,这个驱动程序可能和得到这两个变量的驱动程序不在同一个进程,这个可以引用这两个变量吗?
我觉得是进程内有效,在进程外就无效了。大家认为呢?
abanwjc
驱动小牛
驱动小牛
  • 注册日期2003-12-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-03 10:02
进程内肯定有效,可以从创建它的线程传给另一个系统线程使用。
进程外,偶就不能确定是无效的了,我没测试过。

我更发现一个更奇怪的问题:
在windows2000系统打上sp3及震荡波补丁kb835732后,IoGetDeviceObjectPointer函数将失败,不能得到设备对象,我在普通PC或工业主板上均测试,每次都失败,即使我系统启动期间延迟使用该函数的时间,仍然失败,是何原因?
但当将SP3补丁升级为SP4时,该故障消失。
有遇到该问题的吗?我们讨论一下这个问题。

当不能解决这个问题时,有替代方案吗?
比如用其他的函数来代替IoGetDeviceObjectPointer,目前我是采用的createfile和ZwDeviceIoControlFile来完成这部分功能,但代码需要从DDK环境移到IFS环境中。
“老婆,快搬个凳子出来,一起看火星来的楼主升天啦!”
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-03 11:18
我还没有遇到过你说的问题,因为我开发2000的时候都打上sp4,在但是我想从ddk移植到ifs不会很麻烦吧,比较来说,没有什么差异,只是一些头文件和库ddk没有,ifs有,不过现在我不存在这些问题,因为我就是用ifs开发,只是我只有xp的ifs,没有2003的ifs,大侠有吗?
还有,我想问一下大侠,ZwDeviceIoControlFile,这个函数在我的msdn上查不到(我的msdn是studio2003带的),但是我知道有这个函数,因为我看到很多代码都使用了这个函数,我想问一下大侠,使用这个函数的时候要包含什么特殊的头文件和库吗?我没有试,我觉得这个函数msdn没有,是不是微软将来可能会改变的,不建议使用的?
还有我一直想找这个函数的实现,我叫我朋友查找,也没有找到,他有部分window代码。
至于我的问题,我知道在进程内有效,我想知道在进程外是否有效,或者说,我把那两个变量的地址重新mapping到另外一个进程的地址空间上去,是否可以引用?望大侠做解答,只是做试验太麻烦,就没有去试。
打字真累
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-06-03 12:51
这2个变量,在其的有效范围内有效,出了范围就无效,比如说,出了某个函数体
但是,这2个变量的值(为地址),指向的是2个对象,只要对象还在,值就是一直有效,不管是在什么地方,都可以通过这2个值(不是变量)去访问这2个对象
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-03 15:45
可能arthurtu理解错了我的意思,也可能我说得不清楚,我说的就是这两个变量所指向的对象的有效范围,当然不是这两个变量,在这两个变量的名空间之外引用这两个变量,编译是通过不了的。我的意思就是两个变量所指向的对象的有效范围。比如我把这个变量的值(其实就是地址),通过某种方式,传递给另外一个驱动程序,把这个值赋值给第二个驱动的一个变量,然后通过这个变量去引用它所指向的对象,这样可以吗?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-06-03 16:16
可能arthurtu理解错了我的意思,也可能我说得不清楚,我说的就是这两个变量所指向的对象的有效范围,当然不是这两个变量,在这两个变量的名空间之外引用这两个变量,编译是通过不了的。我的意思就是两个变量所指向的对象的有效范围。比如我把这个变量的值(其实就是地址),通过某种方式,传递给另外一个驱动程序,把这个值赋值给第二个驱动的一个变量,然后通过这个变量去引用它所指向的对象,这样可以吗?
 

可以,只要对象还在
abanwjc
驱动小牛
驱动小牛
  • 注册日期2003-12-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-03 16:43
有一点疑问,为什么非要在另一个驱动中使用这个驱动的这两个值呢??可以在该驱动中使用IoGetDeviceObjectPointer函数来获得啊!

很抱歉我也没有2003的ifs,另外ZwDeviceIoControlFile是在IFS中提供的。声明在ntifs.h文件中。实现的函数我也没看过。

我的问题就出在“比较来说,没有什么差异,只是一些头文件和库ddk没有,ifs有”。我用的DDK开发的,因此不能用ZwDeviceIoControlFile函数,我换成IFS后,又有些函数包含在ntddk.h中,而不在ntifs.h中,库也有了差别,我目前都编译不过,有谁有这方面经验的,请不吝赐教!
“老婆,快搬个凳子出来,一起看火星来的楼主升天啦!”
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-06-04 09:02
句柄是只在线程内有效,而对象指针是全程有效
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2005-06-04 09:20
句柄是只在线程内有效,而对象指针是全程有效

bmyyyud是笔误吧,句柄是进程内有效
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-06-04 09:45
[quote]句柄是只在线程内有效,而对象指针是全程有效

bmyyyud是笔误吧,句柄是进程内有效
 [/quote]
核心中都是线程吧,当然把System与Idle这两个怪物进程除外
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
游客

返回顶部