码迷,mamicode.com
首页 > Windows程序 > 详细

《Windows驱动开发技术详解》之IRP的同步

时间:2016-06-01 10:21:58      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:

  • 应用程序对设备的同步异步操作:

大部分IRP都是由应用程序的Win32 API函数发起的。这些Win32 API本身就支持同步和异步操作。例如,ReadFile、WriteFile和DeviceIoControl等,它们都有异步和同步两种操作方式。DeviceIoControl的同步操作如图所示:

技术分享

同步操作时,DeviceIoControl的内部会调用WaitForSingleObject函数去等待一个事件。这个事件直到IRP结束才会触发。如果通过反汇编IoCompleteRequest内核函数,就会发现在IoCompleteRequest内部设置了该事件。DeviceIoControl会暂时进入睡眠状态,直到IRP结束

而对于异步操作,其处理过程如图所示:

技术分享

在异步操作的情况下,当DeviceIoControl被调用时,其内部会产生IRP,并将该IRP传递给驱动内部的派遣函数。但此时 DeviceIoControl不会等待该IRP结束,而是直接返回。当IRP经过一段时间被结束时,操作系统会出发一个IRP相关事件。这个事件可以通知应用程序IRP请求被执行完毕

同步操作设备

CreateFile的函数声明如下:

1 HANDLE WINAPI CreateFile(
2   _In_     LPCTSTR               lpFileName,
3   _In_     DWORD                 dwDesiredAccess,
4   _In_     DWORD                 dwShareMode,
5   _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
6   _In_     DWORD                 dwCreationDisposition,
7   _In_     DWORD                 dwFlagsAndAttributes,
8   _In_opt_ HANDLE                hTemplateFile
9 );

CreateFile中的第六个参数dwFlagsAndAttributes是同步异步操作的关键。如果这个参数中没有设置FILE_FLAG_OVERLAPPED,则以后对该设备的操作都是同步操作,否则所有操作为异步操作

异步操作设备方式一

先来看一下OVERLAPPED的结构:

技术分享

其中最后一个参数hEvent,这个事件用于该操作完成之后通知应用程序。

 

《Windows驱动开发技术详解》之IRP的同步

标签:

原文地址:http://www.cnblogs.com/predator-wang/p/5548670.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!