阅读:5521回复:20
ZwClose(...) 关闭句柄的问题
我用KsCreatePin(..,OUT PHANDLE PinHandle) 创建了一个 Pin Handle ,用完后调用ZwClose(PinHandle)释放这个局柄,常常出现0xc0000008 (An invalid HANDLE was specified)错误,不知何故?
|
|
|
沙发#
发布于:2003-06-17 14:20
怎么没人发表看法?
|
|
|
板凳#
发布于:2003-06-17 16:46
嫌分数少,我可以加的,给点提示吧!
|
|
|
地板#
发布于:2003-06-20 17:17
我真傻,以为那么多的顶级会员都是高手!
|
|
|
地下室#
发布于:2003-06-21 12:44
HANDLE IS A PROCESS SPCIFIC DATA.
USE IN PROCESS OTHER THAN OPENING PROCESS WILL CAUSE THIS PROBLEM. |
|
|
5楼#
发布于:2003-06-21 17:38
1.KsCreatePin调用没有成功
2.在另一个进程关闭handle [编辑 - 6/21/03 by rookie_cn] |
|
|
6楼#
发布于:2003-06-23 09:16
谢谢 luo 和 rookie_cn 的回答。
首先 KsCreatePin 调用能成功,但在ZwClose()时,有时不能成功,当能正常关闭时,下次再调用KsCreatePin就能成功,当不能正常关闭时,在下次在调用KsCreatePin就不能成功。 我发现在KsCreatePin 与 Zwclose 之间基本没有进行什么操作,它有时也不能正常关闭。 奇怪的是我感觉这好像与程序的流程有关,也就是说与这两个函数的调用时机有关,我自己再试试。 |
|
|
7楼#
发布于:2003-06-23 17:35
用SOFTICE跟踪你的指令流,看看有什么问题
|
|
|
8楼#
发布于:2003-06-24 11:23
谢谢大家的讨论!我会放分的。
|
|
|
9楼#
发布于:2003-06-24 11:33
driver工作在任意线程上下文中,当你的ZwClose和KsCreatePin不在同一个routine而且各自所在的routine不是在同一时机被触发的时候,有可能进程已经切换了
我说的对吗?我也不确定 |
|
|
10楼#
发布于:2003-06-24 14:38
我当时也怀疑与线程的上下文有关,只是没法证明。
|
|
|
11楼#
发布于:2003-06-24 16:54
我真傻,以为那么多的顶级会员都是高手!
----------- haha,隔壁看到一个资深会员连个event都要人解释半天。 言归正转。 我怀疑是不是哪里已经误释放掉了。我看到很多代码里都是这样用的: CreateXXX(&handle) ObReferenceObjectByHandle(handle, ..., &object) ZwClose(handle) - 然后就把句柄关闭了 ObDereferenceObject - 最后用这个 他们这样做是多此一举吗?(反正我也这么用着) |
|
|
12楼#
发布于:2003-06-24 16:57
我觉得rookie_cn所说的“进程切换”有一定道理,至少可以解释:为什么很多代码都像我上面说的那样,呵呵
|
|
|
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] |
|
|
14楼#
发布于:2003-06-24 21:50
CreateXXX(&handle)
ObReferenceObjectByHandle(handle, ..., &object) ZwClose(handle) - 然后就把句柄关闭了 在用完了之后 ObDereferenceObject - 最后用这个 我谈谈对这段代码的看法吧 这应该就是防止进程切换的做法吧。 前3句通过进程句柄得到内核对象指针,最后释放句柄,防止进程切换,对句柄的引用失去意义,我们知道,内核对象有一个引用计数,所以用完之后就ObDereferenceObject 楼主不妨把代码改成这个样子,应该就没有问题了 要是对的麻烦告诉我一声,stevenluo@msik.com.cn |
|
|
15楼#
发布于:2003-06-25 09:38
CreateXXX(&handle) 我其实也差不多是这样做的。 创建是 CreateXXX(&handle) ObReferenceObjectByHandle(handle, ..., &object) 释放是 ObDereferenceObject(object) ZwClose(handle) 这样有时能行,有时不行。 |
|
|
16楼#
发布于:2003-06-25 10:02
另:swf2003在做stream driver?有个问题顺便问问你 我找不到这个帖子,我不知道你的具体问题。 我做过stream driver (pc camera driver) 对 stream minidriver 在每个SRB(STREAM REQUEST BLOCK)中都保存了设备扩展的指针(pSrb->HwDeviceExtension) 如果你绕过Class Driver, 你调用 IoCreateDevice创建一个设备对象的话,也可以增加自己的设备扩展,IoCreateDevice中有参数 DeviceExtensionSize 可以填上。这样在以后的回调例程中,通过pDeviceObject->DeviceExtension 就能访问到你的设备扩展。 |
|
|
17楼#
发布于:2003-06-25 17:26
谢谢!我看到了,情况有所不同。那边有具体的。
|
|
|
18楼#
发布于:2003-06-25 17:40
对了,你这段代码和我说的还是有一定差别的(你说的和不用ObRef.../ObDeref...没区别嘛) :D |
|
|
19楼#
发布于:2003-06-26 10:17
我明白了,主要是要通过内核对象的引用计数来控制这个对象的生命周期。
谢谢jason.gao。 |
|
|
上一页
下一页