shrimp
驱动牛犊
驱动牛犊
  • 注册日期2003-04-30
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2503回复:18

为什么在APP中一用CloseHandle(m_hDevice)关闭Device,机子就动不了,很急,帮忙看一看,问题在哪!!(50分送上)

楼主#
更多 发布于:2003-06-09 15:41
在我的应用程序中用
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]

最新喜欢:

chilichili
不要拒绝我... 哈!哈! 给分!
shrimp
驱动牛犊
驱动牛犊
  • 注册日期2003-04-30
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-09 17:24
板主们提点意见呀!!
不要拒绝我... 哈!哈! 给分!
shrimp
驱动牛犊
驱动牛犊
  • 注册日期2003-04-30
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-10 09:27
如果去掉m_hDevice= CreateFile(    )和m_hEvent = CreateEvent(  )
即不建立驱动,就没问题
不要拒绝我... 哈!哈! 给分!
shrimp
驱动牛犊
驱动牛犊
  • 注册日期2003-04-30
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-10 10:46
请高人指点!
不要拒绝我... 哈!哈! 给分!
LinX
驱动牛犊
驱动牛犊
  • 注册日期2002-08-19
  • 最后登录2007-07-05
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望10点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-10 11:46
1. 是在那个OS下面.
2. 你的PROTOCOL DRIVER是动态BIND的吗?
3. 如果是在9X下面, 通常一次只打开一块DRIVER所BIND的卡片, 或者说一次只OPEN一块卡片. 如果是在2000或XP下面, 可以同时打开多块卡, 退出时必须都CLOSE了.
mach
驱动牛犊
驱动牛犊
  • 注册日期2001-04-16
  • 最后登录2004-08-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-10 12:06
你CloseHandle()时有没有让驱动不再发中断啊。如果还在发中断,却又不处理(清中断标志位)是会出现这种情况的。
shrimp
驱动牛犊
驱动牛犊
  • 注册日期2003-04-30
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
呵呵!你还是看看你的驱动程序关闭处理函数吧!估计是那个处理函数的问题
shrimp
驱动牛犊
驱动牛犊
  • 注册日期2003-04-30
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
不要拒绝我... 哈!哈! 给分!
kaput
驱动中牛
驱动中牛
  • 注册日期2002-06-26
  • 最后登录2004-08-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-10 16:16
没有调用 IoCompleteRequest(pIrp,IO_NO_INCREMENT)完成I/O
天下风云出我辈 一入江湖岁月催 鸿图霸业谈笑中 不胜人生一场醉......
shrimp
驱动牛犊
驱动牛犊
  • 注册日期2003-04-30
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-06-10 16:38
没有调用 IoCompleteRequest(pIrp,IO_NO_INCREMENT)完成I/O
 

我在
switch (ControlCode)
 {
   .....
 }
后是紧跟着
IoCompleteRequest(pIrp,IO_NO_INCREMENT)
这一句的。
不要拒绝我... 哈!哈! 给分!
shrimp
驱动牛犊
驱动牛犊
  • 注册日期2003-04-30
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-06-11 08:10
有一个更奇怪的现象是:
我的应用程序启动(启动过程同时建立与驱动通信机制)后,隐藏主窗体,只显示托盘图标.(这一切都正常)
问题出现在,当我点击托盘图标的采单\"退出\"(在此主要做了清除驱动对象和事件对象的工作)时,不能退出,也就是前面提到的不能正常退出,但在这过程Dbgview查看输出信息显示
DbgPrint(\"ObDereferenceObject sussfully!\\n\");
说明驱动能正常结束Event对象(Device设备对象不清除).
:(说奇怪就出现在,如果我先运行其他项,也就是先弹出其他的对话框(窗体)随便一个都可以, 然后再单击托盘上的\"退出\", 那一切正常.

现在我搞不清楚是应用程序出问题还是驱动出问题?
我现在排查很困难,敬请大虾小虾们参一参!
  ;)
不要拒绝我... 哈!哈! 给分!
LinX
驱动牛犊
驱动牛犊
  • 注册日期2002-08-19
  • 最后登录2007-07-05
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望10点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-06-11 11:54
估计是你的驱动出问题了. 另外, 如果你的驱动是动态BIND的话, 当你CLOSEHANLE时, 你的驱动应该UNLOAD了. 在这之前, 所有的REQUEST必须完成. 你不能够正常退出, 可能是你没有完全完成REQUEST.
shrimp
驱动牛犊
驱动牛犊
  • 注册日期2003-04-30
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-06-11 15:30
估计是你的驱动出问题了. 另外, 如果你的驱动是动态BIND的话, 当你CLOSEHANLE时, 你的驱动应该UNLOAD了. 在这之前, 所有的REQUEST必须完成. 你不能够正常退出, 可能是你没有完全完成REQUEST.

我的驱动是修改passthru例子的,我是在DriverEntry()
里用NdisMRegisterDevice( )注册的,说实在的我也弄不清是不是动态BIND :mad:
但是, 我在驱动里没有清除Device设备对象,而是清除Event对象,
也即ObDereferenceObject(gpEventObject);
我CLOSEHANLE是在用户态,影响到驱动的也只是清除Event对象,当应用程序需要的时候(比如重新运行),完全可以再在用户态里重新与驱动建立连接呀?
不知道我这样理解对不对?
不要拒绝我... 哈!哈! 给分!
zgm78
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望31点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-06-11 23:29
也不见得是驱动的问题啊,APP中打开COM也会出现这样的情况的,如果你一个线程在操作,另一个线程在关闭
shrimp
驱动牛犊
驱动牛犊
  • 注册日期2003-04-30
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-06-12 08:20
也不见得是驱动的问题啊,APP中打开COM也会出现这样的情况的,如果你一个线程在操作,另一个线程在关闭

我认为也是这个问题,我试过先关闭线程然后才关闭其他的.但问题依旧. :)

[编辑 -  6/12/03 by  shrimp]
不要拒绝我... 哈!哈! 给分!
16楼#
发布于:2003-06-12 18:39
我是说你处理irp_mj_close的部分可能有问题
shrimp
驱动牛犊
驱动牛犊
  • 注册日期2003-04-30
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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;
不要拒绝我... 哈!哈! 给分!
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-07-22 08:44
我现在遇到和你同样的问题,能告诉问题出在什么地方,你最后怎么处理的吗?谢了先!
mail:zhangxd@gzsts.com
游客

返回顶部