- 应用程序对设备的同步异步操作:
大部分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,这个事件用于该操作完成之后通知应用程序。
时间: 2024-10-23 06:15:40