阅读:4106回复:16
怎样获得USB设备被意外拔除的消息?
USB设备在被主机客户程序访问过程中被突然断电,是不是称为“意外拔除”?这个意外是不是在下面的驱动程序片段中被处理
----------------- case IRP_MN_REMOVE_DEVICE: ntStatus =USB_HandleRemoveDevice(fdo,Irp); Usb_HandleRemoveDevice( IN PDEVICE_OBJECT fdo, IN PIRP Irp ) { NTSTATUS ntStatus; PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension; ULONG i; // set the removing flag to prevent any new I/O\'s pdx->removing = TRUE; // brute force - send an abort pipe message to all pipes to cancel any // pending transfers. this should solve the problem of the driver blocking // on a REMOVE message because there is a pending transfer. for (i = 0; i < pdx->Interface->NumberOfPipes; i++) { Ezusb_AbortPipe(fdo,(USBD_PIPE_HANDLE) pdx->Interface->Pipes.PipeHandle); } UnlockDevice(fdo); // once for LockDevice at start of dispatch UnlockDevice(fdo); // once for initialization during AddDevice KeWaitForSingleObject(&pdx->evRemove, Executive, KernelMode, FALSE, NULL); Ezusb_RemoveDevice(fdo); ntStatus = Ezusb_DefaultPnpHandler(fdo, Irp); return ntStatus; // lower-level completed IoStatus already } ----------------- 我遇到的问题是:驱动程序处理了底层的一些问题,但客户程序仍然在等待设备响应,并且一直挂起、等待。重新上电设备,重启客户程序,虽然设备能正常出现,但客户程序已经不能访问设备了,明明有设备却打不开设备句柄,问题出在哪里?我该怎样解决? 我想在设备被意外拔除时使客户程序也得到这个消息,立即停止访问设备,这样做能不能使程序免遭pengding?客户程序从哪里能得到设备被意外拔除的消息? 谢谢 [编辑 - 5/4/02 作者: sunkai] [编辑 - 5/4/02 作者: sunkai] |
|
最新喜欢:aollyi... |
沙发#
发布于:2002-05-05 01:05
应该是属于设备意外拔除,在此例程里应该做善后工作,把创建的资源释放掉,线程停下来,句柄关闭,内存释放等,以保证系统正常运行。
|
|
板凳#
发布于:2002-05-05 02:23
我遇到的问题是:驱动程序处理了底层的一些问题,但客户程序仍然在等待设备响应,并且一直挂起、等待。重新上电设备,重启客户程序,虽然设备能正常出现,但客户程序已经不能访问设备了,明明有设备却打不开设备句柄,问题出在哪里?我该怎样解决?
我想在设备被意外拔除时使客户程序也得到这个消息,立即停止访问设备,这样做能不能使程序免遭pengding?客户程序从哪里能得到设备被意外拔除的消息? 谢谢 |
|
地板#
发布于:2002-05-05 22:16
LIUTANG,请指教啊,谢谢啦
|
|
地下室#
发布于:2002-05-05 23:00
你说的客户软件是不是指你的应用程序?具体好办法我一时没有,不过窗口程序可以响应WINDOWS的一条消息WM_DEVICECHANGE,当设备状态改变的时候就可以触发,包括加入设备和拔除设备,应用程序得到这一消息后应该马上把所有阻塞的访问部分全部结束掉。
或者,你在驱动程序里面当设备拔除时唤醒所有被阻塞的进程访问动作,另外,你的驱动程序访问设备时不妨采用异步的方式,这样比较合理。 还有,我在LINUX下编程时可以从驱动程序里发送signal到应用程序,但不知道在WINDOWS里能不能这样。 [编辑 - 5/5/02 作者: LIUTANG] |
|
5楼#
发布于:2002-05-05 23:38
你要处理的是IRP_MN_SURPRISE_REMOVAL
不过,根据我发现,如果你在CloseHandle以前突然拔掉设备,就一定会出现你说的现象。 |
|
|
6楼#
发布于:2002-05-06 04:45
你说的客户软件是不是指你的应用程序?具体好办法我一时没有,不过窗口程序可以响应WINDOWS的一条消息WM_DEVICECHANGE,当设备状态改变的时候就可以触发,包括加入设备和拔除设备,应用程序得到这一消息后应该马上把所有阻塞的访问部分全部结束掉。 谢谢了,我觉得很有道理,不过对于象我这样的俗手来说,仅仅知道个方法还不够,还得先去搞清楚什么是异步方式,然后才能慢慢编啊编啊,:(。 |
|
7楼#
发布于:2002-05-06 04:49
你要处理的是IRP_MN_SURPRISE_REMOVAL 那就完了,我发现驱动程序里好象没有处理IRP_MN_SURPRISE_REMOVAL的代码。 我相信这是因为程序(驱动或APP)不完善才这样,应该可以避免的吧?斑竹遇到这样的情况是怎么解决的? 谢谢斑竹大人 |
|
8楼#
发布于:2002-05-08 23:42
有大虾愿意提供详细的解决方案吗?
|
|
9楼#
发布于:2002-05-09 08:29
在98下没有IRP_MN_SURPRISE_REMOVAL,只有IRP_MN_REMOVE_DEVICE;
在CreateFile中加入FILE_FLAG_OVERLAPPED异步属性。在ReadFile、WriteFile、DeviceIoControl中加入OVERLAPPED的参数,如 HANDLE FileIOWaiter = CreateEvent( NULL, TRUE, FALSE, NULL); if( FileIOWaiter==NULL) return RStatus; OVERLAPPED ol; ol.Offset = 0; ol.OffsetHigh = 0; ol.hEvent = FileIOWaiter; if(!WriteFile(hDEV, Buffer+nWriteAllBytes, DMALength, &nWriteBytes, &ol)) { if(GetLastError()==ERROR_IO_PENDING) { while(WaitForSingleObject(FileIOWaiter, 100)==WAIT_TIMEOUT) { } GetOverlappedResult(hDEV, &ol, &nWriteBytes, FALSE); } } } 在设备意外拔除时可调用可正常结束。 |
|
|
10楼#
发布于:2002-05-09 14:10
太感谢了!tigerzd兄的做法是客户程序用异步访问吧?那么驱动程序也需要做相应的改动吗?LIUTANG兄在前面说过“驱动程序访问设备时不妨采用异步的方式,这样比较合理。”。客户应用程序和客户驱动程序都有同步和异步两种访问属性,是否存在搭配上的问题?有的话究竟要怎样搭配算合理呢?我水平够菜,问的好象也不专业,请勿笑话。
|
|
11楼#
发布于:2002-05-09 14:48
驱动程序中不用特别处理,因为驱动程序中处理方式本身就是异步的。比如获取设备数据,就需要等待设备发送完毕。驱动程序中按DDK的例子写就可以了。
|
|
|
12楼#
发布于:2002-05-10 00:29
我觉得USB这个东西对于开发人员来说讨厌的地方就是热插拔,有时候想,假如这个设备是个装在机箱里面的东西,不会在开机状态被拔下来,那编程时要方便的多。就向我做数码相机的驱动程序,就是有人喜欢在图象下载到一半的时候把线拔了,你说郁闷不郁闷?
|
|
13楼#
发布于:2002-05-13 14:34
我觉得USB这个东西对于开发人员来说讨厌的地方就是热插拔,有时候想,假如这个设备是个装在机箱里面的东西,不会在开机状态被拔下来,那编程时要方便的多。就向我做数码相机的驱动程序,就是有人喜欢在图象下载到一半的时候把线拔了,你说郁闷不郁闷? 深有同感!我有一半的bug fix就是为了解决因为usb p&p造成的各种奇奇怪怪的问题。 |
|
|
14楼#
发布于:2002-05-14 13:00
听说我上传的几个东西有被人删掉了,想要的朋友又不得不给我写信来。不会是斑竹删的吧?
|
|
15楼#
发布于:2002-05-14 22:51
这么好的东西难得无私的sunkai大侠拿出来免费与大家共享,还被删除?我声讨这种行为!
|
|
|
16楼#
发布于:2002-05-15 01:59
liuxf:大概是提醒我的那位朋友搞错了,没有删,错怪了。东西是好东西,但不是我自己的,我也只是转手抄给大家,只要CYPRESS不找驱动开发网的麻烦就行了,说到这里,我要提醒打算引用那些源代码的朋友,请在你的代码中注明它来自于CYPRESS,我本人认为还是有必要的,“君子爱财取之有道”嘛。
|
|