驱动和应用层的三种通信方式.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
标题:【原创】【成果3.5】驱动和应用层的三种通信方式作者:sislcb时间:2008-01-04,11:57链接: /showthread.php?t=57666驱动程序和客户应用程序经常需要进行数据交换,但我们知道驱动程序和客户应用程序可能不在同一个地址空间,因此操作系统必须解决两者之间的数据交换。驱动层和应用层通信,主要是靠DeviceIoControl函数,下面是该函数的原型:BOOLDeviceIoControl(HANDLEhDevice,//设备句柄DWORDdwIoControlCode,//IOCTL请求操作代码LPVOIDlpInBuffer,//输入缓冲区地址DWORDnInBufferSize,//输入缓冲区大小LPVOIDlpOutBuffer,//输出缓冲区地址DWORDnOutBufferSize,//输出缓冲区大小LPDWORDlpBytesReturned,//存放返回字节数的指针LPOVERLAPPEDlpOverlapped//用于同步操作的Overlapped结构体指针);dwIoControlCode要进行操作的控制码。驱动程序可以通过CTL_CODE宏来组合定义一个控制码,并在IRP_MJ_DEVICE_CONTROL的实现中进行控制码的操作。在驱动层,irpStack->Parameters.DeviceIoControl.IoControlCode表示了这个控制码。 IOCTL请求有四种缓冲策略,下面一一介绍。 1、输入输出缓冲I/O(METHOD_BUFFERED)2、直接输入缓冲输出I/O(METHOD_IN_DIRECT)3、缓冲输入直接输出I/O(METHOD_OUT_DIRECT)4、上面三种方法都不是(METHOD_NEITHER)为了对这些类型更详细的描述,请看msdn上的解释,我抄录如下: "缓冲”方法(METHOD_BUFFERED)备注:在下面的讨论中,〃输入〃表示数据从用户模式的应用程序到驱动程序,〃输出〃表示数据从驱动程序到应用程序。 对于读取请求,I/O管理器分配一个与用户模式的缓冲区大小相同的系统缓冲区。IRP中的SystemBuffer字段包含系统地址。UserBuffer字段包含初始的用户缓冲区地址。当完成请求时,I/O管理器将驱动程序已经提供的数据从系统缓冲区复制到用户缓冲区。对于写入请求,会分配一个系统缓冲区并将SystemBuffer设置为地址。用户缓冲区的内容会被复制到系统缓冲区,但是不设置UserBuffer。对于IOCTL请求,会分配一个容量大小足以包含输入缓冲区或输出缓冲区的系统缓冲区,并将SystemBuffer设置为分配的缓冲区地址。输入缓冲区中的数据复制到系统缓冲区。UserBuffer字段设置为用户模式输出缓冲区地址。内核模式驱动程序应当只使用系统缓冲区,且不应使用UserBuffer中存储的地址。 对于IOCTL,驱动程序应当从系统缓冲区获取输入并将输出写入到系统缓冲区。当完成请求时,I/O系统将输出数据从系统缓冲区复制到用户缓冲区。 ”直接"方法(METHOD_IN/OUT_DIRECT)对于读取和写入请求,用户模式缓冲区会被锁定,并且会创建一个内存描述符列表(MDL)。MDL地址会存储在IRP的MdlAddress字段中。SystemBuffer和UserBuffer均没有任何含义。但是,驱动程序不应当更改这些字段的值。 对于IOCTL请求,如果在METHOD_IN_DIRECT和METHOD_OUT_DIRECT中同时有一个输出缓冲区,则分配一个系统缓冲区(SystemBuffer又有了地址)并将输入数据复制到其中。如果有一个输出缓冲区,且它被锁定,则会创建MDL并设置MdlAddress。UserBuffer字段没有任何含义。 ”两者都不”方法(METHOD_NEITHER)对于读取和写入请求,UserBuffer字段被设置为指向初始的用户缓冲区。不执行任何其他操作。SystemAddress和MdlAddress没有任何含义。对于IOCTL请求,I/O管理器将UserBuffer设置为初始的用户输出缓冲区,而且,它将当前I/O栈位置的Parameters.DeviceIoControl.Type3InputBuffer设置为用户输入缓冲区。利用该I/O方法,由驱动程序来确定如何处理缓冲区:分配系统缓冲区或创建MDL。 通常,驱动程序在访问用户数据时不应当将UserBuffer字段用作地址,即使当用户缓冲区被锁定时也是如此。这是由于在调用驱动程序时,在系统中可能看不到调用用户的地址空间。(对于该规则的一个例外是,在最高层驱动程序将IRP向下传递到较低层的驱动程序之前,它可能需要使用UserBuffer来复制数据。)

您可能关注的文档

文档评论(0)

gaozhigang + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档

相关课程推荐