首页
社区
课程
招聘
[求助]驱动完成例程返回STATUS_PENDING问题
发表于: 2013-5-17 16:31 8310

[求助]驱动完成例程返回STATUS_PENDING问题

2013-5-17 16:31
8310
为什么驱动完成例程中如果检测到Irp->PendingReturned就要IoMarkIrpPending来挂起IRP呢?如果已经进入了完成例程,表示下层驱动已经IoCompleteRequest了,此时还有必要在上层挂起IRP吗?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 40
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好像STATUS_PENDING 和SL_PENDING_RETURNED 必须同时被设置。

其实下层的驱动在回溯的时候也设置了这个域,但是由于Next有完成函数,所以要手动设置
2013-7-15 22:31
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
要注意了解IoMarkIrpPending的本质,以下是WDK的代码
FORCEINLINE
VOID
IoMarkIrpPending(
    __inout PIRP Irp
)
{
    IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
}


    IoMarkIrpPending其实你也可以认为是IoMarkIrpPendingReturn,意思是把一个IRP标记为PENDING_RETURNED,所以完成例程里的IoMarkIrpPending并非挂起IRP,而是想向上传递SL_PENGDING_RETURNED标记。
   IRP完成的时候,需要在IRP原始发起线程里做一些事情,此时IO管理器会判断IRP->flag,和IrpSp->Control,FLAG就不说了,如果此时Control有SL_PENDING_RETURNED,那么他会插入一个APC到发起线程里,如果没有这个标记,他就以为当前线程就是发起线程,就不插入APC了,所以你的完成例程必须要按规定传递PENDING_RETURNED标记,否则系统可能会误判的。
2013-7-15 23:34
1
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢,明白了,之前在忙其他的事,所以好久没上论坛了!
2013-8-5 12:59
0
雪    币: 1492
活跃值: (3227)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
ITSailor 要注意了解IoMarkIrpPending的本质,以下是WDK的代码 FORCEINLINE VOID IoMarkIrpPending( __inout PIRP Irp ) ...
受教了,当时读到这段感觉特别别扭,但是不明白问题出在哪里。
2023-6-5 22:28
0
游客
登录 | 注册 方可回帖
返回
//