happylife365
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2013-08-17
  • 粉丝1
  • 关注0
  • 积分80分
  • 威望394点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1817回复:3

重新构建Irp去磁盘读数据块在驱动的读回调里面停住了, 请有经验的大侠指点

楼主#
更多 发布于:2013-01-09 16:49
我写了一个从磁盘读取数据的函数, 这个函数在DeviceIoControl里面读取磁盘数据没问题, 但是在Read回调里面读的时候就会hung, 不知道怎么回事? 我在网上看有人遇到类似的问题, 但是好像没有解决...

程序会hung在KeWaitForSingleObject 那里, 偶尔能成功那么一回, 但是多读几次必然hung
我看了read 回调的irql是 APC_LEVEL 级别的.

请大侠们指点一下, 先谢了.


下面是代码

NTSTATUS
RawReadDisk(
            IN PDEVICE_OBJECT   DeviceObject,
            OUT CHAR *pBuffer,
            IN ULONGLONG Offset,
            IN ULONG ToReadLen,
            OUT ULONG* pReadedLen
            )
{
    KEVENT                  Event;
    NTSTATUS                status;
    PIRP                    irp;
    IO_STATUS_BLOCK         ioStatusBlock;
    PIO_STACK_LOCATION      irpStack;
    PDEVICE_RELATIONS       deviceRelations;

    LARGE_INTEGER StartOffset;

    StartOffset.QuadPart = Offset;

    
    KeInitializeEvent( &Event, NotificationEvent, FALSE );

    irp = IoBuildSynchronousFsdRequest( IRP_MJ_READ,
        DeviceObject,
        pBuffer,
        ToReadLen,
        &StartOffset,
        &Event,
        &ioStatusBlock );

    if (irp == NULL) {
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto End;
    }


    irp->IoStatus.Status = STATUS_SUCCESS ;


    status = IoCallDriver( DeviceObject, irp );

    if (status == STATUS_PENDING) {

        KeWaitForSingleObject( &Event, Executive, KernelMode, FALSE, NULL );
        status = ioStatusBlock.Status;
    }

    *pReadedLen = ioStatusBlock.Information;

    
End:
    return status;

}
快快乐乐过日子,潇潇洒洒闯人生。
co63oc
驱动牛犊
驱动牛犊
  • 注册日期2011-09-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望291点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2013-01-10 10:09
IRP_MJ_CREATE时会创建FileObject, 直接读写还没有创建FileObject
happylife365
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2013-08-17
  • 粉丝1
  • 关注0
  • 积分80分
  • 威望394点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2013-01-10 15:44
回 co63oc 的帖子
co63oc:IRP_MJ_CREATE时会创建FileObject, 直接读写还没有创建FileObject (2013-01-10 10:09)

谢谢回复. 在这里能有一个回复不容易.

这个问题已经解决了.
原来这个是irql的问题, deviceiocontrol一般是PASSIVE_LEVEL
而读写回调一般都是APC_LEVEL.
irql级别高了, 导致irp 在队列里面受阻, 无法下发
因此我这个问题在deviceioctrol里面没问题, 但是读写回调就hung了
解决办法就是判断当前irql, 如果比passive高, 就调低到passive,完了再恢复回去.

我看国内好几个帖子都遇到这个问题而没法解决, 希望我这个帖子对别人能有点用处
快快乐乐过日子,潇潇洒洒闯人生。
happylife365
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2013-08-17
  • 粉丝1
  • 关注0
  • 积分80分
  • 威望394点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2013-01-10 15:45
这个问题我是在微软的论坛上得到回复的
快快乐乐过日子,潇潇洒洒闯人生。
游客

返回顶部