yang_zi_jiang
驱动牛犊
驱动牛犊
  • 注册日期2007-06-24
  • 最后登录2009-05-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望30点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
阅读:2718回复:9

Irp的MdlAddress为0,怎么办?

楼主#
更多 发布于:2007-09-14 15:59
我的驱动中用的缓冲方式为DIRECT_IO的方式,应用程序中已经CreateFile成功,返回了正确的Handle.但是当我在用ReadFile函数的时候,进入到了驱动里的Read例程,发现Irp->MdlAddress的值为0,这样一执行MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);就蓝屏。我不知道应用程序发送的IRP过来的Irp->MdlAddress为什么会是0啊?
yang_zi_jiang
驱动牛犊
驱动牛犊
  • 注册日期2007-06-24
  • 最后登录2009-05-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望30点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-09-17 08:53
大家碰到过这种情况的帮帮忙啊,我是初学者。我的读是这样用的ReadFile(handle_,  
    inputData,     sizeBuffer,     &length,   NULL),我看了下传进去IRP的用户缓冲区的地址和应用程序中inputData的地址是一致的。但就是Irp->MdlAddress是0,肯定就不对吧?
icesword
驱动牛犊
驱动牛犊
  • 注册日期2002-06-03
  • 最后登录2009-10-10
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望52点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-10-09 15:00
肯定没有置对DIRECT_IO
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-10-12 18:59
    fdo->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;
    fdo->Flags &= ~DO_DEVICE_INITIALIZING;
张帆的内核学习论坛 http://bbs.kerneldev.com
icesword
驱动牛犊
驱动牛犊
  • 注册日期2002-06-03
  • 最后登录2009-10-10
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望52点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-10-13 23:32
你的IoCreateDevice使用了几个,是否确定你调用的驱动是设置了DO_DIRECT_IO的那个
icesword
驱动牛犊
驱动牛犊
  • 注册日期2002-06-03
  • 最后登录2009-10-10
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望52点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-10-13 23:39
另外最好DBGPRINT以下看你的这个代码 fdo->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE,在驱动调起后是否运行到了
yang_zi_jiang
驱动牛犊
驱动牛犊
  • 注册日期2007-06-24
  • 最后登录2009-05-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望30点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-10-16 15:54
这两天再忙其他的,好些天没来看了,终于有人回复了。谢谢楼上的两位大哥。
这是我的代码
        deviceExtension = deviceObject->DeviceExtension;
        deviceObject->Flags |= DO_DIRECT_IO;
        deviceObject->Flags |= DO_POWER_PAGABLE;
代码肯定是执行到了,我用softice能单步运行到这里。没有写fdo->Flags &= ~DO_DEVICE_INITIALIZING这一句,不知道是不是这个原因,我再看看。
yang_zi_jiang
驱动牛犊
驱动牛犊
  • 注册日期2007-06-24
  • 最后登录2009-05-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望30点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-10-16 16:07
IoCreateDevice应该只使用了一个吧,就是创建设备对象吧?CreateDeviceObject(DriverObject, PhysicalDeviceObject, &deviceObject);
我用softice调试的时候,比如有时候明明知道IRP包或者驱动里面有些数据错了,这样一继续运行肯定系统就蓝屏,但不知道能不能在发现有错误时退出softice不继续运行这个驱动了,这样就不用重启电脑,直接F5不行啊,不知道大哥们怎么调试的?还有分数问题,我就70分,还不知道问了问题怎么给分大家,等我找找看,先只好说谢谢啦。
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-10-17 12:44
softice好像有irp命令,发现有错,大概可以在softice里提前完成就是了
张帆的内核学习论坛 http://bbs.kerneldev.com
yang_zi_jiang
驱动牛犊
驱动牛犊
  • 注册日期2007-06-24
  • 最后登录2009-05-26
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望30点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-10-25 16:23
好的。谢谢
游客

返回顶部