阅读:2503回复:18
为什么在APP中一用CloseHandle(m_hDevice)关闭Device,机子就动不了,很急,帮忙看一看,问题在哪!!(50分送上)
在我的应用程序中用
m_hDevice= CreateFile(\"\\\\\\\\.\\\\myDevice\", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 和 m_hEvent = CreateEvent(NULL, false, false, NULL); DeviceIoControl(h_mDevice, IO_REFERENCE_EVENT, (LPVOID)m_hEvent, 0, NULL, 0, &dwReturn, NULL); 建立驱动对象和事件对象后,程序在使用其和驱动通信一切者OK. 但是当我退出应用程序时,用下列语句关闭,机子就动不了.如下: if(h_mDevice) { if(h_mEvent) { //先在驱动中清除EVENT DeviceIoControl(h_mDevice, IO_STOP_EVENT, NULL, 0, NULL, 0, &dwReturn, NULL); CloseHandle(m_hEvent); } CloseHandle(m_hDevice); } 当然这里的m_hDevice和m_hEvent是全局变量,并且在创建后一直没关闭过. 我百思不得其解,很急,只能求助请各位高手了. [编辑 - 6/9/03 by shrimp] [编辑 - 6/9/03 by shrimp] |
|
最新喜欢:![]()
|
沙发#
发布于:2003-06-09 17:24
板主们提点意见呀!!
|
|
|
板凳#
发布于:2003-06-10 09:27
如果去掉m_hDevice= CreateFile( )和m_hEvent = CreateEvent( )
即不建立驱动,就没问题 |
|
|
地板#
发布于:2003-06-10 10:46
请高人指点!
|
|
|
地下室#
发布于:2003-06-10 11:46
1. 是在那个OS下面.
2. 你的PROTOCOL DRIVER是动态BIND的吗? 3. 如果是在9X下面, 通常一次只打开一块DRIVER所BIND的卡片, 或者说一次只OPEN一块卡片. 如果是在2000或XP下面, 可以同时打开多块卡, 退出时必须都CLOSE了. |
|
5楼#
发布于:2003-06-10 12:06
你CloseHandle()时有没有让驱动不再发中断啊。如果还在发中断,却又不处理(清中断标志位)是会出现这种情况的。
|
|
6楼#
发布于:2003-06-10 15:44
re:LinX
是在w2k下,我这出错是在用户态的应用程序中,与内核驱动设备(myDevice)通信,内核驱动本身应该没问题。 RE:mach 我在APP中开了一个线程,线程中等待驱动(即myDevice)传回一个信号,有信号则工作,否则等待。 如下: while(pThis->Monitor!= false)//是否监视 { if(pThis->m_hEvent) { WaitForSingleObject(pThis->m_hEvent, INFINITE); .....//处理驱动传给的数据,即共享地址中的数据 // 设置事件对象为非信号态 DeviceIoControl(pThis->m_hDevice, IO_CLEAR_EVENT, NULL, 0, NULL, 0, &dwReturn, NULL); } } 在这里会不会出问题,也就是说这个线程还在工作, 而在另一个地方又企图CloseHandle(m_hEvent)和CloseHandle(m_hDevice)。 我发现我的程序退不出,而用w2k的“任务管理器”查看发现程序的进程还在,而且中断不了,提示为“未过成的操作,拒绝...”。 |
|
|
7楼#
发布于:2003-06-10 15:48
呵呵!你还是看看你的驱动程序关闭处理函数吧!估计是那个处理函数的问题
|
|
8楼#
发布于:2003-06-10 15:59
呵呵!你还是看看你的驱动程序关闭处理函数吧!估计是那个处理函数的问题 在驱动中对应的处理如下: case IO_STOP_EVENT://清除与应用程序通信的 Event 对象 if(gpEventObject) { ObDereferenceObject(gpEventObject); DbgPrint(\"ObDereferenceObject sussfully!\\n\"); } else{} Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0L; break; 这个有问题吗? [编辑 - 6/10/03 by shrimp] |
|
|
9楼#
发布于:2003-06-10 16:16
没有调用 IoCompleteRequest(pIrp,IO_NO_INCREMENT)完成I/O
|
|
|
10楼#
发布于:2003-06-10 16:38
没有调用 IoCompleteRequest(pIrp,IO_NO_INCREMENT)完成I/O 我在 switch (ControlCode) { ..... } 后是紧跟着 IoCompleteRequest(pIrp,IO_NO_INCREMENT) 这一句的。 |
|
|
11楼#
发布于:2003-06-11 08:10
有一个更奇怪的现象是:
我的应用程序启动(启动过程同时建立与驱动通信机制)后,隐藏主窗体,只显示托盘图标.(这一切都正常) 问题出现在,当我点击托盘图标的采单\"退出\"(在此主要做了清除驱动对象和事件对象的工作)时,不能退出,也就是前面提到的不能正常退出,但在这过程Dbgview查看输出信息显示 DbgPrint(\"ObDereferenceObject sussfully!\\n\"); 说明驱动能正常结束Event对象(Device设备对象不清除). :(说奇怪就出现在,如果我先运行其他项,也就是先弹出其他的对话框(窗体)随便一个都可以, 然后再单击托盘上的\"退出\", 那一切正常. 现在我搞不清楚是应用程序出问题还是驱动出问题? 我现在排查很困难,敬请大虾小虾们参一参! ;) |
|
|
12楼#
发布于:2003-06-11 11:54
估计是你的驱动出问题了. 另外, 如果你的驱动是动态BIND的话, 当你CLOSEHANLE时, 你的驱动应该UNLOAD了. 在这之前, 所有的REQUEST必须完成. 你不能够正常退出, 可能是你没有完全完成REQUEST.
|
|
13楼#
发布于:2003-06-11 15:30
估计是你的驱动出问题了. 另外, 如果你的驱动是动态BIND的话, 当你CLOSEHANLE时, 你的驱动应该UNLOAD了. 在这之前, 所有的REQUEST必须完成. 你不能够正常退出, 可能是你没有完全完成REQUEST. 我的驱动是修改passthru例子的,我是在DriverEntry() 里用NdisMRegisterDevice( )注册的,说实在的我也弄不清是不是动态BIND :mad: 但是, 我在驱动里没有清除Device设备对象,而是清除Event对象, 也即ObDereferenceObject(gpEventObject); 我CLOSEHANLE是在用户态,影响到驱动的也只是清除Event对象,当应用程序需要的时候(比如重新运行),完全可以再在用户态里重新与驱动建立连接呀? 不知道我这样理解对不对? |
|
|
14楼#
发布于:2003-06-11 23:29
也不见得是驱动的问题啊,APP中打开COM也会出现这样的情况的,如果你一个线程在操作,另一个线程在关闭
|
|
15楼#
发布于:2003-06-12 08:20
也不见得是驱动的问题啊,APP中打开COM也会出现这样的情况的,如果你一个线程在操作,另一个线程在关闭 我认为也是这个问题,我试过先关闭线程然后才关闭其他的.但问题依旧. :) [编辑 - 6/12/03 by shrimp] |
|
|
16楼#
发布于:2003-06-12 18:39
我是说你处理irp_mj_close的部分可能有问题
|
|
17楼#
发布于:2003-06-13 08:14
我是说你处理irp_mj_close的部分可能有问题 这样行吗? case IRP_MJ_CLOSE: Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0L; MmUnmapLockedPages(UserVirtualAddress, Mdl); break; .... IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; |
|
|
18楼#
发布于:2004-07-22 08:44
我现在遇到和你同样的问题,能告诉问题出在什么地方,你最后怎么处理的吗?谢了先!
mail:zhangxd@gzsts.com |
|