驱动开发:通过Async反向与内核通信( 三 )

驱动层说完了,接下来是应用层,对于应用层来说,需要使用CreateEvent打开通知事件,或者叫做事件对象,然后当有通知时,则直接使用ReadFile读取对应的缓冲区,当所有读取全部结束WaitForMultipleObjects等待结束即输出结果 。
#include <stdio.h>#include <Windows.h>int main(int argc, char *argv[]){ HANDLE hFile; char Buffer[3][32] = { 0 }; DWORD dwRet[3] = { 0 }; OVERLAPPED ol[3] = { 0 }; HANDLE hEvent[3] = { 0 }; // By:LyShark hFile = CreateFileA("\\\\.\\LySharkAsync", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL); if (INVALID_HANDLE_VALUE == hFile)return  0; // event用来通知请求完成 hEvent[0] = CreateEvent(NULL, TRUE, FALSE, NULL); ol[0].hEvent = hEvent[0]; hEvent[1] = CreateEvent(NULL, TRUE, FALSE, NULL); ol[1].hEvent = hEvent[1]; hEvent[2] = CreateEvent(NULL, TRUE, FALSE, NULL); ol[2].hEvent = hEvent[2]; // 读取事件内容到缓存 ReadFile(hFile, Buffer[0], 13, &dwRet[0], &ol[0]); ReadFile(hFile, Buffer[1], 13, &dwRet[1], &ol[1]); ReadFile(hFile, Buffer[2], 13, &dwRet[2], &ol[2]); // 等待三个事件执行完毕 WaitForMultipleObjects(3, hEvent, TRUE, INFINITE); // 输出结果 printf("缓存LyShark A: %s \n", Buffer[0]); printf("缓存LyShark B: %s \n", Buffer[1]); printf("缓存LyShark C: %s \n", Buffer[2]); CloseHandle(hFile); return  0;}这段代码最终运行效果如下:

驱动开发:通过Async反向与内核通信

文章插图

推荐阅读