本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/51301922
在之前的博文中,我们对于IRP,都是同步完成的,但是 Windows 对异步操作很友好,我们来看看如何异步完成 IRP 。
在应用程序中异步访问设备
在开始之前,我认为有必要提一句异步访问设备。在之前的博文中,与驱动通信的代码都是采用同步访问设备的,其实所谓同步访问,是 Win32 子系统封装了“等待”这一过程。 Win32API 会在内部创建事件,并在向设备发送 I/O 请求后直接等待事件被完成,一旦驱动程序完成 I/O ,那么就会激活事件,从而使 Win32API 中的等待状态结束,线程恢复运行。(关于“事件”对象,见上一篇博文“内核中开启多线程和同步对象”)
其实,这个等待操作我们可以自己来做,就像这样:
#include "stdafx.h"
#include<Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
//如果 CreateFile 的第 6 个参数 dwFlagsAndAttributes 被指定为 FILE_FLAG_OVERLAPPED,
HANDLE handle = CreateFile(TEXT("\\\\.\\D:\\1.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL, NULL);
if (handle == INVALID_HANDLE_VALUE){
MessageBoxA(0, "打开文件/设备失败", "错误", 0);
return 0;
}
unsigned char buffer[50] = { 0 };
OVERLAPPED over = { 0 };
HANDLE Event = CreateEvent(NULL, FALSE, FALSE, NULL);
over.hEvent = Event;
ReadFile(handle, buffer, 49, NULL, &over);
//Do somethings
WaitForSingleObject(Event, INFINITE);
for (int i = 0; i < sizeof(buffer); i++)
printf("0x%X ", buffer[i]);
CloseHandle(handle);
getchar();
return 0;
}
当然,还有一种方法异步访问设备,即使用ReadFileEx/WriteFileEx,这是通过APC来实现异步访问的,这里不展开了。
为什么要说异步访问设备呢,这是为了避免大家和