驱动程序是为设备的硬件层编程服务的,需要提供和应用程序进行通信的能力,达到应用程序控制设备的目的。
驱动程序和客户应用程序经常需要进行数据交换,驱动程序和客户应用程序不在同一个地址空间,操作系统必须解决两者之间的数据交换。
一、应用程序实现与WDM通信的过程:
1、应用程序用CreateFile函数打开设备
2、应用程序用DeviceIoControl和WDM进行通信,包括从WDM读数据 和写数据给WDM两种情况,或者ReadFile从WDM中读数据或用WriteFile写数据给WDM,这三个函数都属于Win32 API
3、当应用程序退出时,用CloseHandle关闭设备
代码参考:http://www.vckbase.com/index.php/wv/1003
二、驱动程序与应用程序的通信:
当驱动程序捕捉到特点事件(如中断)发生时,应当可以与应用程序进行通信。
三、DeviceIoControl与驱动交互:
DeviceIoControl内部会使操作系统创建一个IRP_MJ_DEVICE_CONTROL类型的IRP,操作系统会将这个IRP转发到派遣函数中,程序员可以用DeviceIoControl定义除读写之外的其他操作,让应用程序和驱动程序进行通讯。
BOOL DeviceIoControl (HANDLE hDevice, //已经打开的设备的句柄 DWORD dwIoControlCode, //I/O控制码(IOCTL值) LPVOID lpInBuffer, // 输入缓冲区地址 DWORD nInBufferSize, // 输入缓冲区大小 LPVOID lpOutBuffer, // 输出缓冲区地址 DWORD nOutBufferSize, // 输出缓冲区大小 LPDWORD lpBytesReturned, // 存放返回字节数的指针 ,对应派遣函数中的IRP结构中的pIrp->IoStatus.Iniformation LPOVERLAPPED lpOverlapped // 用于同步操作的Overlapped结构体指针 ); //宏: CTL_CODE(DeviceType,//与IoCreateDevice创建的设备对象类型相匹配 Function,//驱动程序定义的IOCTL码 Method,//操作模式 Access)//访问权限
参考代码:http://blog.csdn.net/shanndyw/article/details/5353460