阅读:2819回复:9
Irp的MdlAddress为0,怎么办?
我的驱动中用的缓冲方式为DIRECT_IO的方式,应用程序中已经CreateFile成功,返回了正确的Handle.但是当我在用ReadFile函数的时候,进入到了驱动里的Read例程,发现Irp->MdlAddress的值为0,这样一执行MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);就蓝屏。我不知道应用程序发送的IRP过来的Irp->MdlAddress为什么会是0啊?
|
|
沙发#
发布于:2007-09-17 08:53
大家碰到过这种情况的帮帮忙啊,我是初学者。我的读是这样用的ReadFile(handle_,
inputData, sizeBuffer, &length, NULL),我看了下传进去IRP的用户缓冲区的地址和应用程序中inputData的地址是一致的。但就是Irp->MdlAddress是0,肯定就不对吧? |
|
板凳#
发布于:2007-10-09 15:00
肯定没有置对DIRECT_IO
|
|
地板#
发布于:2007-10-12 18:59
fdo->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;
fdo->Flags &= ~DO_DEVICE_INITIALIZING; |
|
|
地下室#
发布于:2007-10-13 23:32
你的IoCreateDevice使用了几个,是否确定你调用的驱动是设置了DO_DIRECT_IO的那个
|
|
5楼#
发布于:2007-10-13 23:39
另外最好DBGPRINT以下看你的这个代码 fdo->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE,在驱动调起后是否运行到了
|
|
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这一句,不知道是不是这个原因,我再看看。 |
|
7楼#
发布于:2007-10-16 16:07
IoCreateDevice应该只使用了一个吧,就是创建设备对象吧?CreateDeviceObject(DriverObject, PhysicalDeviceObject, &deviceObject);
我用softice调试的时候,比如有时候明明知道IRP包或者驱动里面有些数据错了,这样一继续运行肯定系统就蓝屏,但不知道能不能在发现有错误时退出softice不继续运行这个驱动了,这样就不用重启电脑,直接F5不行啊,不知道大哥们怎么调试的?还有分数问题,我就70分,还不知道问了问题怎么给分大家,等我找找看,先只好说谢谢啦。 |
|
8楼#
发布于:2007-10-17 12:44
softice好像有irp命令,发现有错,大概可以在softice里提前完成就是了
|
|
|
9楼#
发布于:2007-10-25 16:23
好的。谢谢
|
|