阅读:2282回复:14
为什么不能超时退出呢?
我做的应用程序调用DeviceIoControl通过驱动来从usb读数据,
但此时usb并不给我发数据,结果我的驱动就等在那里,等呀等呀 死活不肯出来,我怎么办? 驱动中是这么写的 status = KeWaitForSingleObject( &event, Suspended, KernelMode, FALSE, NULL); 当我的一个线程再调用ioctrl在等待时,我可以用另外的线程来终止它吗?怎么做? |
|
最新喜欢:![]()
|
沙发#
发布于:2003-07-19 15:19
这能在 下位机上想办法。
|
|
板凳#
发布于:2003-07-19 14:33
[QUOTE]原本由 Buddha 发表 SubmitUrb不是有一个超时参数吗? [/quote]我也遇到同样的问题,至今还没解决,如果usb设备没有数据,我的应用程序就停在这里了,而且不能退出,用任何杀进程的方法都不能让它退出,只能重启机器,这个高手,请你告诉我,提交urb怎么设置超时啊?我真的快急疯了。。。谢谢你啊。 |
|
|
地板#
发布于:2001-05-22 09:13
[QUOTE]原本由 Buddha 发表
[B]Re: Re: 为什么不能超时退出呢? 引用: No. Read the data from the buffer. 我并不想读数据了,我只是想让他能退出哪个io请求就可以了,否则我的引用程序就会一直在等待,如何做? 而且那个时候也没有数据呀,我能读到什么呢? [/B][/QUOTE] SubmitUrb不是有一个超时参数吗? |
|
|
地下室#
发布于:2001-05-21 18:45
Re: Re: 为什么不能超时退出呢?
引用: No. Read the data from the buffer. 我并不想读数据了,我只是想让他能退出哪个io请求就可以了,否则我的引用程序就会一直在等待,如何做? 而且那个时候也没有数据呀,我能读到什么呢? |
|
|
5楼#
发布于:2001-05-21 16:39
呵呵,还没有说完呢,
dgxu肯定说的是in包,怎么办? |
|
6楼#
发布于:2001-05-21 09:42
[QUOTE]原本由 dgxu 发表
[B]但是还是不能实现超时退出呀,我现在是这种情况: firmware里没有写处理out包的程序,但是我的应用程序要求 读1024个字节,这样驱动程序里调用底层驱动总是返回 STATUS_PENDING ,这个irp的完成例程也就没法执行,应用程序 也停在那儿,不知道怎么让它退出来 [/B][/QUOTE] 这跟out包有什么关系?因该是in包啊! |
|
|
7楼#
发布于:2001-05-18 21:44
但是还是不能实现超时退出呀,我现在是这种情况:
firmware里没有写处理out包的程序,但是我的应用程序要求 读1024个字节,这样驱动程序里调用底层驱动总是返回 STATUS_PENDING ,这个irp的完成例程也就没法执行,应用程序 也停在那儿,不知道怎么让它退出来 |
|
8楼#
发布于:2001-05-18 18:07
The completion routine will be called when the lower driver completes the irp.
|
|
|
9楼#
发布于:2001-05-18 18:06
[QUOTE]原本由 dgxu 发表
[B]If IoCallDriver() routine return STATUS_PENDING, can the CompletionRoutine be excuted ? What shall I do in the CompletionRoutine? [/B][/QUOTE] No. Read the data from the buffer. |
|
|
10楼#
发布于:2001-05-18 17:14
If IoCallDriver() routine return STATUS_PENDING, can the CompletionRoutine be excuted ?
What shall I do in the CompletionRoutine? |
|
11楼#
发布于:2001-05-18 16:30
当你使用IoCallDriver来SubmitUrb之前,先用IoSetCompletionRoutine来设置一个完成例程。
|
|
|
12楼#
发布于:2001-05-18 15:17
不太明白!
|
|
|
13楼#
发布于:2001-05-18 13:07
SubmitUrb不是可以设置CompletionRoutine吗?你在那里拿数据。
|
|
|
14楼#
发布于:2001-05-18 11:43
KeWaitForSingleObject()函数的最后一个参数是超时时间,我是这样用的:
LARGE_INTEGER TimeOut ; TimeOut.QuadPart = - 1000000 ; ........ status = KeWaitForSingleObject( &event, Suspended, KernelMode, FALSE, &TimeOut); 驱动程序没有傻等,一会儿就退出来了,可是在IoCompleteRequest()时出现soft_ice异常: Break due to page Fault ( 0Eh ) . Fault = 0000 MSR LastExceptionFromIP = FF00A391 MSR LastExceptionToIP = FF00A3AE 然后我退出soft_ice(打faults off命令),就出现蓝屏,说 A fatal exception 0E has occurred at 0028:FF00A3BE........ 不知道是怎么回事?那位大虾能告诉我? |
|