能力值:
( LV2,RANK:10 )
|
-
-
2 楼
pDevObj->Flags |= DO_BUFFERED_IO;
|=是一个OR操作,要先清除初始值DO_DEVICE_INITIALIZING
改之为:
IoCreateDevice(DriverObject,0,&deviceName,FILE_DEVICE_DISK,FILE_DEVICE_SECURE_OPEN,FALSE,&pDevObj);
pDevObj->Flags &= ~DO_DEVICE_INITIALIZING;
pDevObj->Flags |= DO_BUFFERED_IO;
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我的是有pDevObj->Flags &= ~DO_DEVICE_INITIALIZING;这一句,不过是在pDevObj->Flags |= DO_BUFFERED_IO; 之后的。
我的是这样的:
IoCreateDevice(DriverObject,0,&deviceName,FILE_DEVICE_DISK,FILE_DEVICE_SECURE_OPEN,FALSE,&pDevObj);
pDevObj->Flags |= DO_BUFFERED_IO;
......
......
pDevObj->Flags &= ~DO_DEVICE_INITIALIZING;
这样的,这个操作的先后顺序不用,结果难道会不同吗?我觉得先后顺序不影响吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
而且我跟踪了进入我的驱动分发例程的irp_mj_read和irp_mj_write,发现有些irp是mdl有效,有些是AssociatedIrp.SystemBuffer有效,不知道怎么回事,结果我只好在分发例程中判断,mdl有效就用mdl,AssociatedIrp.SystemBuffer有效就用AssociatedIrp.SystemBuffer.很奇怪啊,buffered_io和direct_io居然是不确定的。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
这个如果是顶层驱动,是要特别处理的
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
嗯,是顶层驱动,要如何处理呀?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
你的代码没贴完整,无法多说
用下边的代码跟一下,就能知道到底采用那种方式了
// 下面得到 Device 与用户程序交换数据的 Buffer
//
if (DeviceObject->Flags & DO_BUFFERED_IO)
{
KdPrint(("[DeviceObject->Flags = DO_BUFFERED_IO]\n"));
//
// 当属于 BUFFERED_IO 类型时:
// 使用 Irp->AssociatedIrp.SystemBuffer 作为传输数据的 buffer
//
Buffer = Irp->AssociatedIrp.SystemBuffer;
}
else if (DeviceObject->Flags & DO_DIRECT_IO)
{
KdPrint(("[DeviceObject->Flags = DO_DIRECT_IO]\n"));
//
// 当属于 DIRECT_IO 方法时:
// 使用 Irp 提供的 MdlAddress 描述的内存作传输数据的 buffer
//
Buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, LowPagePriority);
if (Buffer == NULL)
{
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
Irp->IoStatus.Information = Len;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
}
}
else
{
KdPrint(("[DeviceObject->Flags = Neither]\n"));
//
// 当属于 NEITHER_IO 方式(既非 BUFFERED_IO 也非 DIRECT_IO 方式)时:
// 使用 Irp->UserBuffer 作为数据传送的 buffer
//
Buffer = Irp->UserBuffer;
Neither = TRUE;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
嗯,我的代码就是一个简单的测试虚拟磁盘的驱动,就是读d:\s.img映射成一个虚拟磁盘。你上面的代码我自己在测试程序里面写入了类似的,检测结果是通过dbgprint输出,输出结果是有些irp_read是mdl方式,有些是systembuffer方式。我听你说顶层驱动要特别处理,那么顶层应该怎样处理,才能使得系统发送过来的irp都统一为 mdl方式或者统一为buffer方式呢?不要系统一会儿发过来是mdl方式,一会儿是buffer方式,这究竟是怎么了啊?这个系统是按什么规则发过来的 irp啊?如果是顶层驱动需要处理,该如何通知系统发过来的irp固定为 mdl或者固定为buffer方式呢?
|
能力值:
( LV1,RANK:0 )
|
-
-
9 楼
确认下DeviceIoControl的第二个参数,发送的消息类型是否定义有误。应用层和驱动层是否定义一致。缓存IO的话是METHOD_BUFFERED,定义类似这样#define IOCTL_REQUEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x727, METHOD_BUFFERED, FILE_ANY_ACCESS)
最后于 2021-8-5 16:46
被_djc_编辑
,原因:
|
|
|