在Windows下,应用程序和驱动程序通信的过程是:
应用程序通过CreatFile函数打开设备
然后可以使用DeviceControl完成和KMDF的双向通信
使用ReadFile完成从KMDF读数据
使用WriteFile完成写数据给KMDF
应用程序退出时,使用CloseHandle关闭设备
1.打开设备
应用程序打开设备可以通过两种方式进行:使用GUID接口或者符号链接名。应用程序获得该设备的句柄后就可以完成和驱动通信。打开设备函数为CreateFile调用。
1.GUID接口
GetDevicePath(IN LPGUID InterfaceGuid)
2.符号链接名方式
KMDF驱动程序创建符号链接名的函数是WdfDeviceCreateSymbolicLink();
2.关闭设备
退出应用程序之前,调用CloseHandle函数关闭设备,系统调用EvtFileClose例程。
3.DeviceIoControl例程
如果CreateFile函数调用成功,应用程序就可以使用DeviceIoControl例程完成和KMDF之间的通信
DeviceIoControl函数原型如下:
BOOL DeviceIoControl(
HANDLE hDevice, //CreateFlle返回的设备句柄
DWORD dwIoControlCode, //应用程序调用驱动的控制命令
LPVOID lpInBuffer, //应用程序传给驱动的缓存地址
DWORD nInBufferSize, //应用传给驱动的字节长度
LPVOID lpOutBuffer, //存放驱动返回数据的缓存地址
DWORD nOutBufferSize, //驱动返回数据的字节数
LPDWORD lpBytesReturned, //
LPOVERLAPPED lpOverLapped
);
dwIoControlCode参数是应用程序调用驱动的控制命令
4.ReadFile和WriteFile
BOOL ReadFile(
HANDLE Hfile, //CreateFile返回句柄
LPVOID lpInBuffer, //驱动返回数据缓冲区地址
DWORD nNumberOfBytesToRead, //返回字节数
LPDWORD lpNumberOfBytesRead, //
LPOVERLAPPED lpOverLapped
)
BOOL WriteFile(
HANDLE Hfile, //CreateFile返回句柄
LPCVOID lpInBuffer, //应用传给驱动数据缓冲区地址
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverLapped
);
未完待续