jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1528回复:7

关于读写驱动的问题:

楼主#
更多 发布于:2002-04-23 08:31
我写了一个驱动,对读操作的处理是把安装自己的CANCEL例程,然后IRP用IoMarkIrpPending(),并记入自己的队列,最后返回STATUS_PENDING,问题就是我的应用在该读操作的等待情况下,把应用关闭,但是应用不能关闭,打开进程管理器显示为Winoldp没有响应(我的CANCEL例程已经调用返回,我的例程中把该IRP从队列中删除,并检测其IRP的CANCEL标志,如果假,把它以STATUS_CANCELLED结果完成)。但是在应用程序把CREATEFILE中的驱动名改成COM1,在同样情况下,能关闭程序,我反复测试,是同样的结果,我个人认为应该是驱动的READ DISPATCH的处理问题,但是我还是没有找到答案。请问高手这是怎么回事?

Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-23 09:32
你要关闭应用所要取消的不仅仅是这一个IRP吧
Go,go ahead
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-23 10:51
因为我只有这一个IRP,应用中只调用了一次READFILE,其他操作什么也没有~~
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-23 15:55
我不知道你是怎么确认你的cancel例程已经被调用了的
不知道你的主程序关闭是有没有关闭设备的句柄
因为当文件句柄被关闭时
驱动先收到的是IRP_MJ_CLEANUP,在该IRP的处理例程里驱动
清除自己队列中的未决IRP
即使这些IRP有取消例程,这些例程也不会被调用

[编辑 -  4/23/02 作者: Iamme]
Go,go ahead
ppl
ppl
驱动小牛
驱动小牛
  • 注册日期2001-06-13
  • 最后登录2006-05-21
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-23 17:58
我写了一个驱动,对读操作的处理是把安装自己的CANCEL例程,然后IRP用IoMarkIrpPending(),并记入自己的队列,最后返回STATUS_PENDING,问题就是我的应用在该读操作的等待情况下,把应用关闭,但是应用不能关闭,打开进程管理器显示为Winoldp没有响应(我的CANCEL例程已经调用返回,我的例程中把该IRP从队列中删除,并检测其IRP的CANCEL标志,如果假,把它以STATUS_CANCELLED结果完成)。
                  ~~~~~~ 好像是这里出了问题
但是在应用程序把CREATEFILE中的驱动名改成COM1,在同样情况下,能关闭程序,我反复测试,是同样的结果,我个人认为应该是驱动的READ DISPATCH的处理问题,但是我还是没有找到答案。请问高手这是怎么回事?



jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-24 08:11
我的确认是方法是用DbgPrint函数输出信息,而且我也简单处理(直接在Read例程中完成改IRP,并且没有设置Complete和Cancel例程也没有什么PENDING操作,结果一样),至于在应用程序中非正常方式关闭程序时,系统会查找程序进程的句柄表,从而实现程序对该设备的关闭操作,问题是今次这个程序怎么好象有点问题。
而且在CLOSE时的确应该调用CLEANUP例程,问题是它在CANCEL后并没有调用,而且在应用程序也在那里卡死了~~
谁遇到过这样的问题?可以给我说说吗?
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-04-24 10:19
用户被禁言,该主题自动屏蔽!
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-24 10:59
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return STATUS_SUCCESS;
----------------------------------------------------------
在read例程中做以上的简单处理,不就是把irp结束掉吗?为什么还会出现应用程序被卡死?
游客

返回顶部