阅读:1595回复:7
能否控制MajorIoControlCode?
我的程序由于结构上的问题,在移除设备时并不是收到IRP_MN_SUPRISE_REMOVAL来删除设备的,而是根据一个完成例程中的Irp状态来判断,如果为STATUS_DEVICE_DATA_ERROR则认为是移除了设备。虽然这种处理过程不是很标准,但现在需要赶快处理问题,因此结构上的改变已经不可能了!
所以我需要控制移除设备后的执行顺序,在满足一定条件的情况下按照我的要求去执行,可以吗?如何去实现呢? 简单的说就是,原来删除设备后的MajorIoControlCode顺序是:Power->Get_STATE,现在我需要不去执行后面的GET_STATE,执行我自己指定的状态。 不知我说的是否明白,哪位仁兄有办法请明示!谢谢! |
|
|
沙发#
发布于:2002-03-08 18:21
帮帮忙呀各位!
|
|
|
板凳#
发布于:2002-03-11 10:19
irp是由系统发出的吗?
你可以建立自己的device queue,来记录各个irp。当设备不存在的时候,cancel掉所有的irp。但,如果是系统发出的irp,很难说是否在你处理的当前环境下,是否可以安全的cancel掉。 |
|
|
地板#
发布于:2002-03-11 11:33
这个Irp是系统发的,在下发时设置了Cancel Routine,当删除设备时也可以自动执行这段程序把这个IrpCancel掉,但我的错误信息是出在Cancel Routine之前,也就是使用SubmitUrb设置完成例程后,移走设备这个完成例程仍然要执行,发送数据到已经不存在的设备,所以在系统日志里有个“拒绝访问”的错误信息。
我在DefaultPNP过程里添加了判断IRP_MN_SUPRISE_REMOVAL的部分,但不能被DefaultPNP接到,总是在那个完成例程里. 现在要么能够提前接到IRP_MN_SUPRISE_REMOVAL来提前取消那个完成例程,要么在完成例程里强制转到Remove,不要按照正常情况下的处理顺序了,不知有没有解决办法? |
|
|
地下室#
发布于:2002-03-12 13:35
你是说在SubmitUrb的完成历程里面出错?你做了什么?
|
|
|
5楼#
发布于:2002-03-12 14:08
我在那个完成例程的开始部分设置了一个判断,如果Irp为IRP_DEVICE_DATA_ERROR,说明设备已经移走了,直接返回,但错误依旧,所以我觉得是那个SubmitUrb在提交那个urb时出的错,我的推断不知对不对?
|
|
|
6楼#
发布于:2002-03-13 12:44
没有道理!
|
|
|
7楼#
发布于:2002-03-14 08:50
但目前根本接不到意外删除设备的消息呀?
|
|
|