马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在笔者上一篇文章《驱动开发:应用DeviceIoContro开发模板》简单为大家介绍了如何使用DeviceIoContro模板快速创建一个驱动开发通信案例,但是该案例过于简单也无法独立加载运行,本章将继续延申这个知识点,通过封装一套标准通用模板来实现驱动通信中的常用传递方式,这其中包括了如何传递字符串,传递整数,传递数组,传递结构体等方法。可以说如果你能掌握本章模板精讲的内容基本上市面上的功能都可以使用本方法进行通信。
首先定义驱动功能号和名字,提供接口给应用程序调用。- #define IOCTL_IO_Msg CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
- #define IOCTL_IO_TEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
- #define IOCTL_IO_Array CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
- #define IOCTL_IO_STRUCT CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
- #define IOCTL_IO_String CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS)
复制代码 IOCTL_IO_TEST 传递整数: 派遣例程用于传递整数类型,首先客户端通过DriveControl.IoControl将数据通过变量input传入到内核中,并等待返回,如果返回了结果则outpot里存储的就是返回结果,ref_len则是返回长度。
看看客户端如何接收这个数据的传递。
[code]// 传入x参数,返回到y中,返回长度为zDWORD input = 100, output = 0, ref_len = 0;DriveControl.IoControl(IOCTL_IO_TEST, &input, sizeof(input), &output, sizeof(output), &ref_len);std::cout = 0; i--) { if (szCurFile == '\\') { szCurFile[i + 1] = '\0'; break; } }}// 定义传递结构体typedef struct{ int uuid; char szUname[1024];}MyData;int main(int argc, char *argv[]){ cDrvCtrl DriveControl; // 设置驱动名称 char szSysFile[MAX_PATH] = { 0 }; char szSvcLnkName[] = "WinDDK";; GetAppPath(szSysFile); strcat(szSysFile, "WinDDK.sys"); // 安装并启动驱动 DriveControl.Install(szSysFile, szSvcLnkName, szSvcLnkName); DriveControl.Start(); // 打开驱动的符号链接 DriveControl.Open("\\\\.\\WinDDK"); // 无参数输出 DriveControl.IoControl(IOCTL_IO_Msg, 0, 0, 0, 0, 0); // 传入x参数,返回到y中,返回长度为z DWORD input = 100, output = 0, ref_len = 0; DriveControl.IoControl(IOCTL_IO_TEST, &input, sizeof(input), &output, sizeof(output), &ref_len); std::cout |