sunnnn
驱动牛犊
驱动牛犊
  • 注册日期2002-01-30
  • 最后登录2009-03-20
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1655回复:8

我实在想不出是什么问题,肯请各位指教!

楼主#
更多 发布于:2002-01-31 10:06
我写了一个Win2000串口抓包的驱动程序,当抓取读数据时,一般的应用程序都没有错误,有一些应用程序,往往在我调用IoCallDriver()后,返回STATUS_PENDING,然后,我用IoSetCompletionRoutine()设置一个事件,并且等到读IRP执行完毕,....可是,在等待的时候,当程序执行到KeWaitForSingleObject就出了问题,问题现象是:好像死等一样,softice屏幕变乱,并且softice也好像不再以独占方式占有屏幕(也就是说:其他的应用程序可以执行了),怎么也想不出来是什么问题,请指教,代码片断请看附件!

WindThruEars
驱动老牛
驱动老牛
  • 注册日期2002-11-17
  • 最后登录2004-07-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-01-31 10:42
Baby, I think you should read this article:

http://www.osr.com/ntinsider/2001/pending/pending.htm
我是假耳朵
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-01-31 19:50
softice不再以独占方式占有屏幕可能是因为你在运行到
KeWaitForSingleObject的时候使用的是F10,这个好象是softice的问题建议你在调用这个函数之后设置一个断点
sunnnn
驱动牛犊
驱动牛犊
  • 注册日期2002-01-30
  • 最后登录2009-03-20
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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的处理用法和我的差不多,不知道为什么。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地下室#
发布于:2002-01-31 22:24
差不多不等于一样。你写的东东我不懂。
但你可以再仔细看看你的函数,与例子有什么不同!我以前遇到过一个函数调用的问题,找了半天结果是我的回调函数返回的结果不对.....
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
sunnnn
驱动牛犊
驱动牛犊
  • 注册日期2002-01-30
  • 最后登录2009-03-20
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-01-31 22:58
多谢各位的热心帮助,我又找到了另一种方法!
这个Bug困扰了我两天了!

以后有时间的话,我想写一些这方面的东西,以便大家共享!!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-02-01 09:51
好啊!不过我觉得还是要把原来的这个问题弄清楚
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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试试
sunnnn
驱动牛犊
驱动牛犊
  • 注册日期2002-01-30
  • 最后登录2009-03-20
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-02-01 10:22
多谢各位指点!
我原先就是使用的NULL作为Timeout参数的,因为不好使,所以才改成一个值的,本意是想到超时后让改函数返回的,可是,没成功。等以后有时间再研究这个地方!
游客

返回顶部