驱动开发读写数据-公开课件(讲义).pptVIP

驱动开发读写数据-公开课件(讲义).ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
读写数据 sigang@mti.xidian.edu.cn 应用程序如何读写数据 应用程序发起一个读或写操作时,它会提供用户模式虚拟地址和长度,即应用程序向I/O管理器提供了一个数据缓冲区。 应用程序读写数据主要通过如下三个win 32API:ReadFile,WriteFile,DeviceIoControl DeviceIoControl BOOL DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped ); ReadFile BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ); WriteFile BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ); 驱动程序如何读写数据 内核模式驱动程序几乎从不使用用户模式虚拟地址访问内存,因为不能确定具体的线程上下文。 Windows 2000为驱动程序访问用户模式数据缓冲区提供了三种方法:buffered,direct,neither。 三种方法 buffered方式中,I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区。驱动程序将使用这个系统缓冲区工作。I/O管理器负责在系统缓冲区和用户模式缓冲区之间复制数据。 在direct方式中,I/O管理器锁定了包含用户模式缓冲区的物理内存页,并创建一个称为MDL(内存描述符表)的辅助数据结构来描述锁定页。驱动程序将使用MDL工作。 在neither方式中,I/O管理器仅简单地把用户模式的虚拟地址传递给驱动程序。这通常很少用到。 如何指定缓冲区的读写方式 和驱动程序数据读写相关的Win32 API分为两类,在不同的地方设置他们的缓冲区读写方式 ReadFile,WriteFile(在AddDevice例程中指定) DeviceIoControl(对每一个Control code分别指定) AddDevice中指定 PDEVICE_OBJECT fdo; IoCreateDevice(..., fdo); fdo-Flags |= DO_BUFFERED_IO; or fdo-Flags |= DO_DIRECT_IO; or fdo-Flags |= 0; // i.e., neither direct nor //buffered 特点 一旦指定,所有的其它过滤驱动程序都要使用这个数据缓冲方式 这个数据缓冲方式,即针对ReadFile又针对WriteFile,一旦指定某种方式,读写都要使用者这种方式。 无论使用哪种方式,对用户的接口,也就是ReadFile和WriteFile的使用都是一样的 DeviceIoControl如何指定 #define IOCTL_GET_VERSION_BUFFERED \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_GET_VERSION_DIRECT \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) #define IOCTL_GET_VERSION_NEITHER \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_NEITHER, FILE_ANY_ACCESS) DeviceIoControl result = DeviceIoControl(Handle, IOCTL_GET_VERSION_BUFFERED , InputData, In

文档评论(0)

小红帽 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档