阅读:1655回复:8
我实在想不出是什么问题,肯请各位指教!
我写了一个Win2000串口抓包的驱动程序,当抓取读数据时,一般的应用程序都没有错误,有一些应用程序,往往在我调用IoCallDriver()后,返回STATUS_PENDING,然后,我用IoSetCompletionRoutine()设置一个事件,并且等到读IRP执行完毕,....可是,在等待的时候,当程序执行到KeWaitForSingleObject就出了问题,问题现象是:好像死等一样,softice屏幕变乱,并且softice也好像不再以独占方式占有屏幕(也就是说:其他的应用程序可以执行了),怎么也想不出来是什么问题,请指教,代码片断请看附件!
|
|
沙发#
发布于:2002-01-31 10:42
Baby, I think you should read this article:
http://www.osr.com/ntinsider/2001/pending/pending.htm |
|
|
板凳#
发布于:2002-01-31 19:50
softice不再以独占方式占有屏幕可能是因为你在运行到
KeWaitForSingleObject的时候使用的是F10,这个好象是softice的问题建议你在调用这个函数之后设置一个断点 |
|
地板#
发布于:2002-01-31 21:59
多谢以上两位朋友的答复,可是,问题仍然存在,我的程序从串口截获到IRP_MJ_READ后(IRP的产生过程:先往串口设备上发送一个命令数据包,然后设备通过串口,返回一个事件数据包),等到该IRP执行完成后,才能从IRP栈中取得数据,因此我设了一个完成例程,在完成例程里触发事件,在IoCallDriver()后等待事件信号,可就是等不着,并且SOFTICE的调试输出窗口里显示:
Pass through IRP failed 85d3c200:Protmon:Monitor Function IOCTL_SERIAL_GET_BAUD_RATE .... 等等类似的有关串口设置失败的信息。 另外,在NTDDK安装目录里有一些例子,例如BulkUSB的例子,看起来对一些STATUS_PENDING的IRP的处理用法和我的差不多,不知道为什么。 |
|
地下室#
发布于:2002-01-31 22:24
差不多不等于一样。你写的东东我不懂。
但你可以再仔细看看你的函数,与例子有什么不同!我以前遇到过一个函数调用的问题,找了半天结果是我的回调函数返回的结果不对..... |
|
|
5楼#
发布于:2002-01-31 22:58
多谢各位的热心帮助,我又找到了另一种方法!
这个Bug困扰了我两天了! 以后有时间的话,我想写一些这方面的东西,以便大家共享!! |
|
6楼#
发布于:2002-02-01 09:51
好啊!不过我觉得还是要把原来的这个问题弄清楚
|
|
7楼#
发布于:2002-02-01 10:15
我看了一下你的程序,我认为原因在此,先看你的程序:
int lTimeOut = 1000; NTSTATUS waitStatus = KeWaitForSingleObject(&eventIRPFinished,Suspended,KernelMode,FALSE,(PLARGE_INTEGER)&lTimeOut); 注意你的 lTimeOut 变量, int * 到 PLARGE_INTEGER 转换没这么简单。我认为你应该这样作: LARGE_INTEGER largeTimeOut= RtlConvertLongToLargeInteger(1000 ); NTSTATUS waitStatus = KeWaitForSingleObject(&eventIRPFinished,Suspended,KernelMode,FALSE,&largeTimeOut); 或干脆置为NULL试试 |
|
8楼#
发布于:2002-02-01 10:22
多谢各位指点!
我原先就是使用的NULL作为Timeout参数的,因为不好使,所以才改成一个值的,本意是想到超时后让改函数返回的,可是,没成功。等以后有时间再研究这个地方! |
|