目的
在Windows系统中,驱动程序想要正常工作,往往离不开和用户态进程间的交互。因此,驱动和用户态进程的通信就成为了必不可少的手段。
方式
1. 进程间通信
由于Windows 操作系统中,内核线程运行于某个进程的地址空间中。因此,内核线程和用户进程的通信可以通过进程间通信的方式实现,例如文件映射、共享内存、管道等方式。这里就不一一展开了。
2. I/O请求
通过实现IRP_MJ_READ
、IRP_MJ_WRITE
的请求,用户态进程直接通过设备读写的方式与驱动程序通信。
// 应用层读写事件
HANDLE hDevice = ::CreateFile(DRIVER_NAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (FALSE == ReadFile(hDevice, buffer, sizeof(buffer), &dwOutput, NULL)) {
if (GetLastError() == ERROR_IO_PENDING) {
WaitForSingleObject(hDevice, INFINITE);
}
}
WriteFile(hDevice, buffer, sizeof(buffer), &dwOutput, NULL);
CloseHandle(hDevice);
驱动程序在接收到IRP
时,根据具体需求选择直接返回数据;或者通过IoMarkIrpPending
设置挂起状态,异步处理请求。
// 异步IRP处理
VOID ThreadProc(PV