阅读:1484回复:1
使用METHOD_IN_DIRECT的问题
我用IOCTL定义了一个METHOD_IN_DIRECT类型的IOCTL code,但是在IRP_MJ_DEVICE_CONTROL的分发函数里得到的Irp->MdlAddress确是空的,不知道有谁使用过METHOD_IN_DIRECT,METHOD_OUT_DIRECT方法的能否给点代码看看?
|
|
沙发#
发布于:2002-08-22 14:05
驱动程序中,METHOD_IN_DIRECT和METHOD_OUT_DIRECT模式都以相同方式处理。仅有的不同是它们访问用户模式缓冲区时所需的访问权限;METHOD_IN_DIRECT需要读权限;METHOD_OUT_DIRECT既需要读权限又需要写权限。使用这两种模式时,I/O管理器会为输入数据提供一个内核模式拷贝缓冲区(AssociatedIrp.SystemBuffer),为输出数据缓冲区提供一个MDL。
MdlAddress(PMDL)域指向一个内存描述符表(MDL),该表描述了一个与该请求关联的用户模式缓冲区。如果顶级设备对象的Flags域为DO_DIRECT_IO,则I/O管理器为IRP_MJ_READ或IRP_MJ_WRITE请求创建这个MDL。如果一个IRP_MJ_DEVICE_CONTROL请求的控制代码指定METHOD_IN_DIRECT或METHOD_OUT_DIRECT操作方式,则I/O管理器为该请求使用的输出缓冲区创建一个MDL。MDL本身用于描述用户模式虚拟缓冲区,但它同时也含有该缓冲区锁定内存页的物理地址。为了访问用户模式缓冲区,驱动程序必须做一点额外工作。 这里有一个处理METHOD_XXX_DIRECT请求的简单例子: case IOCTL_GET_VERSION_DIRECT: { if (cbout < sizeof(ULONG)) { status = STATUS_INVALID_BUFFER_SIZE; break; } PULONG pversion = (PULONG) MmGetSystemAddressForMdl(Irp->MdlAddress); *pversion = 0x0004000B; info = sizeof(ULONG); break; } |
|
|