3223|4

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

usb驱动问题!!!dispatch_level在callusbdi下不可用!!急急急!! [复制链接]

callusbdi windows wdm设备驱动程序开发指南(chris cant) 在dispatch_level调用出现死等,但是在passive_level正常
书上也说只能在Passive_level调用,是什么原因呢,怎样才能在dispatch_level调用呢?
高手快来啊
NTSTATUS CallUSBDI(IN PDEVICE_EXTENSION dx,IN PVOID UrbEtc,
                                   IN ULONG IoControlCode,
                                   IN ULONG Arg2)
{
        IO_STATUS_BLOCK IoStatus;
        KEVENT event;
        PIRP Irp;
        PIO_STACK_LOCATION NextIrpStack;
        NTSTATUS status;
        KeInitializeEvent(&event,NotificationEvent,FALSE);

        Irp=IoBuildDeviceIoControlRequest(IoControlCode,
                dx->NextLowerDriver,
                NULL,
                0,
                NULL,
                0,
                TRUE,
                &event ,
                &IoStatus);
        NextIrpStack=IoGetNextIrpStackLocation(Irp);
        NextIrpStack->Parameters.Others.Argument1=UrbEtc;
        NextIrpStack->Parameters.Others.Argument2=(PVOID)Arg2;
        status=IoCallDriver(dx->NextLowerDriver,Irp);
        if(status==STATUS_PENDING)
        {
                DebugPrint(("CallUSBDI: wait for URB completion"));

                status=KeWaitForSingleObject(&event,Suspended,KernelMode,FALSE,NULL);
                status=IoStatus.Status;
        }
        DebugPrint(("CallUSBDI returned >x",status));
        return status;
}

最新回复

KeWaitForSingleObject只有在(Timeout != NULL && *Timeout == 0)时才能在DISPATCH_LEVEL下调用。  详情 回复 发表于 2008-9-10 17:51
点赞 关注

回复
举报

58

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没有高手啊,自己顶啊。。。
 
 

回复

42

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
专家在哪里啊,不够可以加分啊
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

4
 
I am not sure if you can call IoBuildDeviceIoControlRequest in DISPATCH_LEVEL. The functions is invoked in IRQL <= APC_LEVEL as wdk document describing, if current IRQL is higher than APC_LEVEL, the result may be unexpectable. I guess some dead lock happend in your case.
Actually, you can allocate your Irp using IoAllocatIrp and send it to bus in DISPATCH_LEVEL, but you should not wait in this level too because it is also not safe. Try to assign workitem for your job and invoke 'CallUSBDI' in the workitem process routine.
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

5
 
KeWaitForSingleObject只有在(Timeout != NULL && *Timeout == 0)时才能在DISPATCH_LEVEL下调用。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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