4213|10

3

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

Irp转发的的问题 [复制链接]

下面这段代码有两种可能:
1.IoCallDriver 立刻返回,因为底层驱动正忙,StartIO把IRP放进队列,
然后KeWaitForSingleObject 直到IRP完成,这个时候一切正常。
2.底层驱动空闲,那么IoCallDriver的时候,底层驱动的StartIO立刻完成IRP,但是Dispatch routine无论如何都返回STATUS_PENDING,
然后KeWaitForSingleObject 就会锁死永远不返回,请问这个时候如果解决?

谢谢!

        KEVENT event;
        PIRP irp;
        IO_STATUS_BLOCK ioStatus;
        NTSTATUS status;
       
        KeInitializeEvent(&event,NotificationEvent,FALSE); //初始化 EVENT

        irp = IoBuildDeviceIoControlRequest(...); //创建IRP
        if(NULL == irp)
        {
                return STATUS_INSUFFICIENT_RESOURCES;
        }
        status = IoCallDriver(TopOfDeviceStack,irp); //
        if(ioStatus.Status == STATUS_PENDING)
        {
                status = KeWaitForSingleObject(
                                        &event,
                                        Executive,
                                        KernelMode,
                                        TRUE,
                                        NULL);//Forever wait
                status = ioStatus.Status;
        }
        else
        {
                KdPrint((" Finish without pending"));
        }
        return status;


这是我的底层驱动的 Dispatch:
        NTSTATUS status = STATUS_SUCCESS;
        PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
        IoMarkIrpPending(pIrp);
        IoStartPacket( fdo, pIrp, 0, FiberSerialCancelIrp);
        return STATUS_PENDING;

最新回复

在MSDN中这样写道: KeWaitForSingleObject must be running at IRQL   详情 回复 发表于 2009-5-13 11:59
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
关注中
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
= DISPATCH_LEVEL时,Timeout必须是0。
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

4
 
检查一下是否IRQL的问题
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
帮顶吧
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
Callers of KeWaitForSingleObject must be running at IRQL <= DISPATCH_LEVEL. However, if Timeout <> 0, the caller must be running at IRQL  <= APC_LEVEL and in a nonarbitrary thread context.

如果在IRQL=DISPATCH_LEVEL级别,程序不能等待。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 
不是 <= DISPATCH_LEVEL么,那么也应该可以阿。。。。。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
Thanks! I will try it today!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
uping
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

10
 
关注中,本人也在学驱动开发~~~
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
在MSDN中这样写道:
KeWaitForSingleObject must be running at IRQL <= DISPATCH_LEVEL.
Usually, the caller must be running at IRQL = PASSIVE_LEVEL and in a nonarbitrary thread context.
A call while running at IRQL = DISPATCH_LEVEL is valid if and only if the caller specifies a Timeout of zero.
That is, a driver must not wait for a nonzero interval at IRQL = DISPATCH_LEVEL.

还有,好像一般情况下, Alertable 通常被设置成 FALSE ,设为 TRUE 时,好像会提前返回一个状态 STATUS_USER_APC 或者 STATUS_ALERTED
个人想法,不知道对不对哈:)
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表