阅读:1528回复:7
关于读写驱动的问题:
我写了一个驱动,对读操作的处理是把安装自己的CANCEL例程,然后IRP用IoMarkIrpPending(),并记入自己的队列,最后返回STATUS_PENDING,问题就是我的应用在该读操作的等待情况下,把应用关闭,但是应用不能关闭,打开进程管理器显示为Winoldp没有响应(我的CANCEL例程已经调用返回,我的例程中把该IRP从队列中删除,并检测其IRP的CANCEL标志,如果假,把它以STATUS_CANCELLED结果完成)。但是在应用程序把CREATEFILE中的驱动名改成COM1,在同样情况下,能关闭程序,我反复测试,是同样的结果,我个人认为应该是驱动的READ DISPATCH的处理问题,但是我还是没有找到答案。请问高手这是怎么回事?
|
|
沙发#
发布于:2002-04-23 09:32
你要关闭应用所要取消的不仅仅是这一个IRP吧
|
|
|
板凳#
发布于:2002-04-23 10:51
因为我只有这一个IRP,应用中只调用了一次READFILE,其他操作什么也没有~~
|
|
地板#
发布于:2002-04-23 15:55
我不知道你是怎么确认你的cancel例程已经被调用了的
不知道你的主程序关闭是有没有关闭设备的句柄 因为当文件句柄被关闭时 驱动先收到的是IRP_MJ_CLEANUP,在该IRP的处理例程里驱动 清除自己队列中的未决IRP 即使这些IRP有取消例程,这些例程也不会被调用 [编辑 - 4/23/02 作者: Iamme] |
|
|
地下室#
发布于:2002-04-23 17:58
我写了一个驱动,对读操作的处理是把安装自己的CANCEL例程,然后IRP用IoMarkIrpPending(),并记入自己的队列,最后返回STATUS_PENDING,问题就是我的应用在该读操作的等待情况下,把应用关闭,但是应用不能关闭,打开进程管理器显示为Winoldp没有响应(我的CANCEL例程已经调用返回,我的例程中把该IRP从队列中删除,并检测其IRP的CANCEL标志,如果假,把它以STATUS_CANCELLED结果完成)。
~~~~~~ 好像是这里出了问题 但是在应用程序把CREATEFILE中的驱动名改成COM1,在同样情况下,能关闭程序,我反复测试,是同样的结果,我个人认为应该是驱动的READ DISPATCH的处理问题,但是我还是没有找到答案。请问高手这是怎么回事? |
|
5楼#
发布于:2002-04-24 08:11
我的确认是方法是用DbgPrint函数输出信息,而且我也简单处理(直接在Read例程中完成改IRP,并且没有设置Complete和Cancel例程也没有什么PENDING操作,结果一样),至于在应用程序中非正常方式关闭程序时,系统会查找程序进程的句柄表,从而实现程序对该设备的关闭操作,问题是今次这个程序怎么好象有点问题。
而且在CLOSE时的确应该调用CLEANUP例程,问题是它在CANCEL后并没有调用,而且在应用程序也在那里卡死了~~ 谁遇到过这样的问题?可以给我说说吗? |
|
6楼#
发布于:2002-04-24 10:19
用户被禁言,该主题自动屏蔽! |
|
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结束掉吗?为什么还会出现应用程序被卡死? |
|