Windows应用程序与WDM通信的一般过程是:
①应用程序先用CreateFile函数打开设备,
②然后用ReadFile从WDM中读取数据,用WriteFile函数向WDM写数据,用DeviceIoControl函数向WDM发送自定义的控制信息,
③最后用CloseHandle函数关闭设备。对于异步IO请求还可以用CancelIo函数取消。
这些函数调用使得IO管理器产生相应的IRP发送给驱动程序
用户空间函数 | 主功能号 | 参数结构 |
CreateFile |
IRP_MJ_CREATE |
Create |
ReadFile | IRP_MJ_READ | Read |
WriteFile | IRP_MJ_WRITE | WRITE |
DeviceIoControl | IRP_MJ_DEVICE_CONTROL | DeviceIoControl |
CloseHandle | IRP_MJ_CLOSE/CLEANUP | Close |
DeviceIoControl( Handle, // 设备句柄
Code, // 32bit的自定义的控制码
InputData, InputLength, // 输入数据缓冲区地址、长度
OutputData, OutputLength, // 输出数据缓冲区地址、长度
&Feedback, // 反馈数据
&Overlapped);
对于code参数,它的定义是这样的:(M为传输方式)
注: ①如果使用METHOD_BUFFERED方式, 输入、输出缓冲区都用AssociatedIrp. SystemBuffer指定;
②如果用METHOD_IN_DIRECT方式,则输入用MdlAddress指定,输出用AssociatedIrp. SystemBuffer指定;
③如果用METHOD_OUT_DIRECT方式,则输入用AssociatedIrp. SystemBuffer指定,输出用MdlAddress指定。
④如果用METHOD_NEITHER方式,则输入用Type3InputBuffer指定,输出用UserBuffer指定。