Ice_Bin
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2004-01-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1763回复:10

IoSetCompleteRoutine的问题!急!30分

楼主#
更多 发布于:2002-12-08 17:23



偶做一个过滤驱动,现截取到一个读的irp,然后
*nextIS = *currentIS;//copy to nextstack
IoSetCompletionRoutine(Irp, IceReadComplete, 0, TRUE,TRUE,TRUE) ;
IoCallDriver();



NTSTATUS
IceReadFileComplete(
    PDEVICE_OBJECT DeviceObject,
    PIRP Irp,
    PVOID Context
    )
{
.
        .
        .

    if(Irp->PendingReturned)
    {
IoMarkIrpPending(Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
    }
      
       .
       .
       //do my job //no problem
   Irp->IoStatus.Status = STATUS_SUCCESS;
   Irp->IoStatus.Information = length;
   IoCompleteRequest(Irp, IO_NO_INCREMENT);
   return STATUS_SUCCESS;

}

这样每次return 之后电脑都自动重起,用softice跟踪显示错误 error=44 MULTPLE_IRP_COMPLETE_REQUESTS。

 if(Irp->PendingReturned)
    {
IoMarkIrpPending(Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
    }
有没有都一样

怎么办?好郁闷啊!n天了!
 :( :( :( :(

最新喜欢:

jinghuirenjinghu...
好好学习 天天向上
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-08 18:28
*nextIS = *currentIS;//copy to nextstack

直接这样好象有问题。 :o
[color=red]大头鬼! :P[/color]
Ice_Bin
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2004-01-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-08 19:38
不是这个问题,我能进入IceReadFileComplete(),而且好像filemon也是这样的
好好学习 天天向上
stoneyr
驱动牛犊
驱动牛犊
  • 注册日期2002-01-13
  • 最后登录2007-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-08 20:00
如果我没有记错的话,应该是这样的
if(Irp->PendingReturned)
{
IoMarkIrpPending(Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
}
如果返回了STATUS_MORE_PROCESSING_REQUIRED就不用
IoMarkIrpPending(Irp);
而如果用了
IoMarkIrpPending(Irp);
则应该返回
STATUS_PENDING

stoneyr
驱动牛犊
驱动牛犊
  • 注册日期2002-01-13
  • 最后登录2007-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-08 20:03
A routine that calls IoMarkIrpPending must return STATUS_PENDING.

Note, however, that a driver that passes down the IRP and then waits on an event should not mark the IRP pending. Instead, its IoCompletion routine should signal the event and return STATUS_MORE_PROCESSING_REQUIRED.
CyberTower
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2002-12-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-09 10:00
IoCompleteRequest(Irp, IO_NO_INCREMENT); 去掉就行了
Ice_Bin
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2004-01-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-09 12:33
如果我没有记错的话,应该是这样的
if(Irp->PendingReturned)
{
IoMarkIrpPending(Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
}
如果返回了STATUS_MORE_PROCESSING_REQUIRED就不用
IoMarkIrpPending(Irp);
而如果用了
IoMarkIrpPending(Irp);
则应该返回
STATUS_PENDING

 


这个应该是错了,但程序根本就没有进到if{}里面,我把那个去掉也一样
好好学习 天天向上
Ice_Bin
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2004-01-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-09 12:37
IoCompleteRequest(Irp, IO_NO_INCREMENT); 去掉就行了
 


我是截取了上层应用程序的irp,如果不IoCompleteRequest()怎么能返回到应用程序,这样肯定是不行的, 而且我也试过,
不过还是多谢大家对我的问题的关注!

thanks!
好好学习 天天向上
bbear
驱动小牛
驱动小牛
  • 注册日期2002-08-20
  • 最后登录2009-04-16
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-09 13:15


拿掉  *nextIS = *currentIS;//copy to nextstack
IoSetCompletionRoutine(Irp, IceReadComplete, 0, TRUE,TRUE,TRUE) ;
加入 IoSkipCurrentIrpStackLocation(Irp);
IoCallDriver(org driver? right?);




Ice_Bin
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2004-01-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-09 14:56
IoCompleteRequest(Irp, IO_NO_INCREMENT); 去掉就行了
 


今天仔细看了看,art baker的书,主要的毛病就在这里,拿去IoCompleteRequest(Irp, IO_NO_INCREMENT); 然后再修改一下自己的程序,果然成功了,不过就是不知道为什么我原来这样就不行。

反正高定了,放分
 :D :D :D :D :D :D :D
好好学习 天天向上
ppl
ppl
驱动小牛
驱动小牛
  • 注册日期2001-06-13
  • 最后登录2006-05-21
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-12-09 18:29
[quote]IoCompleteRequest(Irp, IO_NO_INCREMENT); 去掉就行了
 


今天仔细看了看,art baker的书,主要的毛病就在这里,拿去IoCompleteRequest(Irp, IO_NO_INCREMENT); 然后再修改一下自己的程序,果然成功了,不过就是不知道为什么我原来这样就不行。

反正高定了,放分
 :D :D :D :D :D :D :D [/quote]

这个还不简单,
错误代码是MULTPLE_IRP_COMPLETE_REQUESTS
也就是你在完成例程不应该调用Iocompleterequest.
游客

返回顶部