swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
阅读:5521回复:20

ZwClose(...) 关闭句柄的问题

楼主#
更多 发布于:2003-06-17 11:35
我用KsCreatePin(..,OUT PHANDLE  PinHandle) 创建了一个 Pin Handle ,用完后调用ZwClose(PinHandle)释放这个局柄,常常出现0xc0000008 (An invalid HANDLE was specified)错误,不知何故?
你的认可是对我最大的鼓励!
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-17 14:20
怎么没人发表看法?
你的认可是对我最大的鼓励!
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-17 16:46
嫌分数少,我可以加的,给点提示吧!
你的认可是对我最大的鼓励!
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-20 17:17
我真傻,以为那么多的顶级会员都是高手!
你的认可是对我最大的鼓励!
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-21 12:44
HANDLE IS A PROCESS SPCIFIC DATA.
USE IN PROCESS OTHER THAN OPENING PROCESS WILL CAUSE  THIS PROBLEM.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
rookie_cn
驱动牛犊
驱动牛犊
  • 注册日期2002-11-28
  • 最后登录2004-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-21 17:38
1.KsCreatePin调用没有成功
2.在另一个进程关闭handle


[编辑 -  6/21/03 by  rookie_cn]
rookie_cn:相信我,我会让你成为世界上第2幸福的人 girl:那谁是第一幸福的人 rookie_cn:拥有了你,还有谁比我幸福
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-23 09:16
谢谢 luo 和 rookie_cn 的回答。

首先 KsCreatePin 调用能成功,但在ZwClose()时,有时不能成功,当能正常关闭时,下次再调用KsCreatePin就能成功,当不能正常关闭时,在下次在调用KsCreatePin就不能成功。
我发现在KsCreatePin 与 Zwclose 之间基本没有进行什么操作,它有时也不能正常关闭。
奇怪的是我感觉这好像与程序的流程有关,也就是说与这两个函数的调用时机有关,我自己再试试。
你的认可是对我最大的鼓励!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2003-06-23 17:35
用SOFTICE跟踪你的指令流,看看有什么问题
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-24 11:23
谢谢大家的讨论!我会放分的。
你的认可是对我最大的鼓励!
rookie_cn
驱动牛犊
驱动牛犊
  • 注册日期2002-11-28
  • 最后登录2004-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-24 11:33
driver工作在任意线程上下文中,当你的ZwClose和KsCreatePin不在同一个routine而且各自所在的routine不是在同一时机被触发的时候,有可能进程已经切换了
我说的对吗?我也不确定
rookie_cn:相信我,我会让你成为世界上第2幸福的人 girl:那谁是第一幸福的人 rookie_cn:拥有了你,还有谁比我幸福
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-06-24 14:38
我当时也怀疑与线程的上下文有关,只是没法证明。
你的认可是对我最大的鼓励!
jason.gao
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2003-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-06-24 16:54
我真傻,以为那么多的顶级会员都是高手!
-----------
haha,隔壁看到一个资深会员连个event都要人解释半天。

言归正转。

我怀疑是不是哪里已经误释放掉了。我看到很多代码里都是这样用的:

CreateXXX(&handle)
ObReferenceObjectByHandle(handle, ..., &object)
ZwClose(handle) - 然后就把句柄关闭了
ObDereferenceObject - 最后用这个

他们这样做是多此一举吗?(反正我也这么用着)
我打字很快。
jason.gao
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2003-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-06-24 16:57
我觉得rookie_cn所说的“进程切换”有一定道理,至少可以解释:为什么很多代码都像我上面说的那样,呵呵
我打字很快。
jason.gao
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2003-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-06-24 17:09
另:swf2003在做stream driver?有个问题顺便问问你

如何(或能不能)在stream minidriver中得到自己的DeviceExtension。因为我绕过了class driver,需要从DeviceObject得到。

如果你知道,可以去这里回答,这里有分 :D :D
http://www.driverdevelop.com/forum/html_44795.html?1056445574



[编辑 -  6/24/03 by  jason.gao]
我打字很快。
rookie_cn
驱动牛犊
驱动牛犊
  • 注册日期2002-11-28
  • 最后登录2004-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-06-24 21:50
CreateXXX(&handle)
ObReferenceObjectByHandle(handle, ..., &object)
ZwClose(handle) - 然后就把句柄关闭了

在用完了之后
ObDereferenceObject - 最后用这个

我谈谈对这段代码的看法吧
这应该就是防止进程切换的做法吧。
前3句通过进程句柄得到内核对象指针,最后释放句柄,防止进程切换,对句柄的引用失去意义,我们知道,内核对象有一个引用计数,所以用完之后就ObDereferenceObject

楼主不妨把代码改成这个样子,应该就没有问题了
要是对的麻烦告诉我一声,stevenluo@msik.com.cn
rookie_cn:相信我,我会让你成为世界上第2幸福的人 girl:那谁是第一幸福的人 rookie_cn:拥有了你,还有谁比我幸福
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-06-25 09:38
CreateXXX(&handle)
ObReferenceObjectByHandle(handle, ..., &object)
ZwClose(handle) - 然后就把句柄关闭了

在用完了之后
ObDereferenceObject - 最后用这个

我谈谈对这段代码的看法吧
这应该就是防止进程切换的做法吧。
前3句通过进程句柄得到内核对象指针,最后释放句柄,防止进程切换,对句柄的引用失去意义,我们知道,内核对象有一个引用计数,所以用完之后就ObDereferenceObject

楼主不妨把代码改成这个样子,应该就没有问题了
要是对的麻烦告诉我一声,stevenluo@msik.com.cn


我其实也差不多是这样做的。
创建是
CreateXXX(&handle)
ObReferenceObjectByHandle(handle, ..., &object)

释放是
ObDereferenceObject(object)
ZwClose(handle)

这样有时能行,有时不行。
你的认可是对我最大的鼓励!
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-06-25 10:02
另:swf2003在做stream driver?有个问题顺便问问你

如何(或能不能)在stream minidriver中得到自己的DeviceExtension。因为我绕过了class driver,需要从DeviceObject得到。

如果你知道,可以去这里回答,这里有分 :D :D
http://www.driverdevelop.com/forum/html_44795.html?1056445574



[编辑 -  6/24/03 by  jason.gao]


我找不到这个帖子,我不知道你的具体问题。
我做过stream driver (pc camera driver)
对 stream minidriver 在每个SRB(STREAM REQUEST BLOCK)中都保存了设备扩展的指针(pSrb->HwDeviceExtension)
如果你绕过Class Driver, 你调用 IoCreateDevice创建一个设备对象的话,也可以增加自己的设备扩展,IoCreateDevice中有参数 DeviceExtensionSize 可以填上。这样在以后的回调例程中,通过pDeviceObject->DeviceExtension 就能访问到你的设备扩展。



你的认可是对我最大的鼓励!
jason.gao
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2003-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-06-25 17:26
谢谢!我看到了,情况有所不同。那边有具体的。
我打字很快。
jason.gao
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2003-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-06-25 17:40

创建是
CreateXXX(&handle)
ObReferenceObjectByHandle(handle, ..., &object)

释放是
ObDereferenceObject(object)
ZwClose(handle)


对了,你这段代码和我说的还是有一定差别的(你说的和不用ObRef.../ObDeref...没区别嘛) :D
我打字很快。
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-06-26 10:17
我明白了,主要是要通过内核对象的引用计数来控制这个对象的生命周期。

谢谢jason.gao。
你的认可是对我最大的鼓励!
上一页
游客

返回顶部