驱动开发:应用DeviceIoContro模板精讲

打印 上一主题 下一主题

主题 1962|帖子 1962|积分 5886

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在笔者上一篇文章《驱动开发:应用DeviceIoContro开发模板》简单为大家介绍了如何使用DeviceIoContro模板快速创建一个驱动开发通信案例,但是该案例过于简单也无法独立加载运行,本章将继续延申这个知识点,通过封装一套标准通用模板来实现驱动通信中的常用传递方式,这其中包括了如何传递字符串,传递整数,传递数组,传递结构体等方法。可以说如果你能掌握本章模板精讲的内容基本上市面上的功能都可以使用本方法进行通信。
首先定义驱动功能号和名字,提供接口给应用程序调用。
  1. #define IOCTL_IO_Msg            CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
  2. #define IOCTL_IO_TEST           CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
  3. #define IOCTL_IO_Array          CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
  4. #define IOCTL_IO_STRUCT         CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
  5. #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
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

北冰洋以北

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表