phychong
驱动牛犊
驱动牛犊
  • 注册日期2002-08-13
  • 最后登录2003-08-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1484回复:1

使用METHOD_IN_DIRECT的问题

楼主#
更多 发布于:2002-08-21 20:27
我用IOCTL定义了一个METHOD_IN_DIRECT类型的IOCTL code,但是在IRP_MJ_DEVICE_CONTROL的分发函数里得到的Irp->MdlAddress确是空的,不知道有谁使用过METHOD_IN_DIRECT,METHOD_OUT_DIRECT方法的能否给点代码看看?
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
沙发#
发布于: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;
}
 
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
游客

返回顶部