pandaforum
驱动小牛
驱动小牛
  • 注册日期2007-02-13
  • 最后登录2011-09-06
  • 粉丝0
  • 关注0
  • 积分728分
  • 威望282点
  • 贡献值1点
  • 好评度66点
  • 原创分0分
  • 专家分0分
阅读:1366回复:5

在AddDevice中构造IRP读取U盘0扇区的问题

楼主#
更多 发布于:2008-06-19 15:42
问题背景:修改diskperf,开发U盘过滤驱动,想在AddDevice中构造IRP,功能号为IRP_MJ_READ,然后发送此IRP包,读取U盘的0扇区.
问题现象:1.没有蓝屏,但是也得不到想要的结果.读到的数据长度为0(IO_STATUS_BLOCK中information为0).
                    2.如果在readwrite中发送此IRP包,则可以得到想要的数据.
问题:为甚么会出现这样的现象?
代码:
     /*
    Buffer : 存放读取数据的缓冲区.
    Length : 需要读取的长度.(单位?)
*/
NTSTATUS TyReadSectorZero(PDEVICE_OBJECT DeviceObject, PVOID Buffer,ULONG Length)
{
    KEVENT event;
    NTSTATUS ntstatus = STATUS_SUCCESS;
    //初始化事件
    KeInitializeEvent(&event, NotificationEvent, FALSE);

    //取得中断级别,判断是否可用IoBuildSynchronousFsdRequest
    if(KeGetCurrentIrql() <= APC_LEVEL)
    {
        PIRP pReadIrp;
        LARGE_INTEGER lioffset = {0};
        IO_STATUS_BLOCK ioblock = {0};

        //调用IoBuildSynchronousFsdRequest构造IRP包,返回值即为指向IRP的指针.
        pReadIrp = IoBuildSynchronousFsdRequest(IRP_MJ_READ, DeviceObject, Buffer, Length, &lioffset, &event, &ioblock);
        //构造IRP包失败
        if(0 == pReadIrp)
        {
            KdPrint(("IoBuildSynchronousFsdRequest fail! \n"));
            goto _end;
        }

        //发送IRP
        ntstatus = IoCallDriver(DeviceObject, pReadIrp);
        
        //等待事件
        if(STATUS_PENDING == ntstatus)
        {
            KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, 0);
        }

       if(ioblock.Information == 0)
        {
            KdPrint(("ioblock.Information == 0 \n"));
            goto _end;
        }

        KdPrint(("ioblock.Information == 0x%x \n", ioblock.Information));
        
        //函数返回
    }

_end:
    return ntstatus;
}

        大家帮忙看看 多谢!
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
沙发#
发布于:2008-06-19 16:11
用户被禁言,该主题自动屏蔽!
pandaforum
驱动小牛
驱动小牛
  • 注册日期2007-02-13
  • 最后登录2011-09-06
  • 粉丝0
  • 关注0
  • 积分728分
  • 威望282点
  • 贡献值1点
  • 好评度66点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-06-19 16:23
哦 你的意思是AddDevice之后才能读?
pandaforum
驱动小牛
驱动小牛
  • 注册日期2007-02-13
  • 最后登录2011-09-06
  • 粉丝0
  • 关注0
  • 积分728分
  • 威望282点
  • 贡献值1点
  • 好评度66点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-06-19 16:32
但是我在AddDevice的最后,清除DO_DEVICE_INITIALIZING标志之后,再读0扇区,还是相同的问题.请大侠指教.多谢了
babanake
驱动牛犊
驱动牛犊
  • 注册日期2008-06-04
  • 最后登录2012-10-08
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望196点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-06-21 12:32
堆栈 没构造完成,资源还没有分配,肯定不成功的
很好 驱动
pandaforum
驱动小牛
驱动小牛
  • 注册日期2007-02-13
  • 最后登录2011-09-06
  • 粉丝0
  • 关注0
  • 积分728分
  • 威望282点
  • 贡献值1点
  • 好评度66点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-06-21 14:30
也就是说 必须要AddDevice返回之后,才能发IRP?
游客

返回顶部