第五篇 如何调用驱动接口,完成互操作

2023-10-29

1.  如何调用驱动功能

1    编写调用驱动的应用程序

1.1 定义驱动设备接口,以及调用接口的控制码

例如:

DEFINE_GUID(GUID_DEVINTERFACE_SampleDriver,\

       0xc459a9ec, 0xb463, 0x4838, 0x9a, 0xd5,0xe0, 0x4a, 0x9a, 0xa2, 0xc4, 0xbe);

 

#define CharSample_IOCTL_800 CTL_CODE(FILE_DEVICE_UNKNOWN,0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)

 

其中GUID_DEVINTERFACE_SampleDriver,就是创建设备时,定义的设备接口。CharSample_IOCTL_800就是定义设备控制事件队列的

1.2 通过设备接口查询设备路径

PCHAR

GetDevicePath(

    IN LPGUID InterfaceGuid

    )

{

    HDEVINFO HardwareDeviceInfo;

    SP_DEVICE_INTERFACE_DATADeviceInterfaceData;

    PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData= NULL;

    ULONG Length, RequiredLength = 0;

    BOOL bResult;

 

    HardwareDeviceInfo = SetupDiGetClassDevs(

                             InterfaceGuid,

                             NULL,

                             NULL,

                             (DIGCF_PRESENT |DIGCF_DEVICEINTERFACE));

 

    if (HardwareDeviceInfo ==INVALID_HANDLE_VALUE) {

        printf("SetupDiGetClassDevsfailed!\n");

        exit(1);

    }

 

    DeviceInterfaceData.cbSize =sizeof(SP_DEVICE_INTERFACE_DATA);

 

    bResult =SetupDiEnumDeviceInterfaces(HardwareDeviceInfo,

                                             0,

                                             InterfaceGuid,

                                             0,

                                              &DeviceInterfaceData);

 

    if (bResult == FALSE) {

/*

        LPVOID lpMsgBuf;

 

        if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |

                         FORMAT_MESSAGE_FROM_SYSTEM |

                         FORMAT_MESSAGE_IGNORE_INSERTS,

                          NULL,

                          GetLastError(),

                         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

                          (LPSTR)&lpMsgBuf,

                          0,

                          NULL

                          )) {

 

            printf("Error: %s",(LPSTR)lpMsgBuf);

            LocalFree(lpMsgBuf);

        }

*/

       printf("SetupDiEnumDeviceInterfaces failed.\n");

 

       SetupDiDestroyDeviceInfoList(HardwareDeviceInfo);

        exit(1);

    }

 

    SetupDiGetDeviceInterfaceDetail(

        HardwareDeviceInfo,

        &DeviceInterfaceData,

        NULL,

        0,

        &RequiredLength,

        NULL

        );

 

    DeviceInterfaceDetailData =(PSP_DEVICE_INTERFACE_DETAIL_DATA) LocalAlloc(LMEM_FIXED, RequiredLength);

 

    if (DeviceInterfaceDetailData == NULL) {

       SetupDiDestroyDeviceInfoList(HardwareDeviceInfo);

        printf("Failed to allocatememory.\n");

        exit(1);

    }

 

    DeviceInterfaceDetailData->cbSize =sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

 

    Length = RequiredLength;

 

    bResult = SetupDiGetDeviceInterfaceDetail(

                  HardwareDeviceInfo,

                  &DeviceInterfaceData,

                  DeviceInterfaceDetailData,

                  Length,

                  &RequiredLength,

                  NULL);

 

    if (bResult == FALSE) {

/*

        LPVOID lpMsgBuf;

 

        if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |

                     FORMAT_MESSAGE_FROM_SYSTEM |

                      FORMAT_MESSAGE_IGNORE_INSERTS,

                      NULL,

                      GetLastError(),

                      MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),

                      (LPSTR) &lpMsgBuf,

                      0,

                      NULL

                      )) {

 

            MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK);

            LocalFree(lpMsgBuf);

        }

*/

        printf("Error inSetupDiGetDeviceInterfaceDetail\n");

 

        SetupDiDestroyDeviceInfoList(HardwareDeviceInfo);

        LocalFree(DeviceInterfaceDetailData);

        exit(1);

    }

 

    returnDeviceInterfaceDetailData->DevicePath;

 

}

 

1.3 打开设备

CreateFile这里的路径需要填写设备路径,可以通过上面的函数查到,也可以自己直接指定。

1.4 DeviceIoControl控制设备

       // Call device IO Control interface(CharSample_IOCTL_800) in driver

       if (!DeviceIoControl(hDevice,

                                                      CharSample_IOCTL_800,

                                                      bufInput,

                                                      1,

                                                      bufOutput,

                                                      2,

                                                      &nOutput,

                                                      NULL)

         )

       {

                printf("ERROR:DeviceIoControl returns %0x.", GetLastError());

        goto exit;

       }

 

 

说明下:  这里的CharSample_IOCTL_800就是在设备事件队列中定义的驱动IO控制功能

 

1.5 CloseHandle(hDevice)

       最后关闭设备就可以了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第五篇 如何调用驱动接口,完成互操作 的相关文章

  • 应用层通过/sys/class/gpio文件操作gpio口

    1 内核gpio子系统介绍 应用层通过sysfs操作gpio的前提是内核中已经向gpio子系统注册了gpio资源 并且在 sys class 目录下可以看到gpio类 详细情况参考博客 2 6 35内核的gpio子系统详解 2 sys cl
  • OpenGL驱动质量的事实现状(精简翻译版)

    原文 http richg42 blogspot com 2014 05 the truth on opengl driver quality html 一 厂商A 为大多数开发者所使用 功能最全 测试得最好 几乎是事实上的标准驱动 其驱动
  • DDK(Driver Developer Kit)和WDK(Windows Driver Kit)的区别

    首先 先从基础的东西说起 开发WINDOWS下的驱动程序 需要一个专门的开发包 如 开发JAVA程序 我们可能需要一个JDK 开发WINDOWS应用程序 我们需要WINDOWS的SDK 现在开发WINDOWS下的驱动程序 我们需要一个DDK
  • Rockchip CAN FD 开发文档

    Rockchip CAN FD 开发文档 前言 概述 产品版本 芯片名称 内核版本 RK356X 4 19 5 10 RK3588 5 10 目录 文章目录 Rockchip CAN FD 开发文档 toc CAN FD 驱动 驱动文件 D
  • 嵌入式内核及驱动开发中级(上)

    目录 第一部分 一 设备分类 设备申请和注销 一 Linux内核对设备的分类 二 设备号 内核中同类设备的区分 三 申请和注销设备号 二 Code exerccise 三 知识补充 第二部分 一 函数指针复习 一 函数指针复习 1 1 内存
  • 驱动怎么学

    1 什么是驱动 1 1理解驱动的概念 1 驱动一词的字面意思 驱动就是让一个东西动起来 给一个东西动力 让它动起来 2 物理上的驱动 比如 一个球放在那儿没动 你踢了一下它 给了它一个力 给了力之后它就能动 就说明你驱动了它 这就是物理学上
  • windows driver双机调试环境搭建,用windbg或者debug view查看内核调试输出

    本地环境 本地开发环境 win 10 visual studio installer 2022版 visual studio 2022 VMware player 目的 本地环境作为开发环境 VM作为测试和调试环境 用debug view查
  • Linux SPI 驱动实验

    目录 Linux 下SPI 驱动框架简介 SPI 主机驱动 SPI 设备驱动 SPI 设备和驱动匹配过程 I MX6U SPI 主机驱动分析 SPI 设备驱动编写流程 SPI 设备信息描述 SPI 设备数据收发处理流程 硬件原理图分析 试验
  • Linux设备驱动-procfs

    在Linux中 procfs是进程文件系统 file system 的缩写 包含一个伪文件系统 启动时动态生成的文件系统 可用于内核层和用户层交互信息 这个文件系统通常被挂载到 proc 目录 由于 proc 不是一个真正的文件系统 它也就
  • Linux INPUT 子系统实验

    目录 input 子系统 input 子系统简 input 驱动编写流程 input event 结构体 硬件原理图分析 实验程序编写 修改设备树文件 按键input 驱动程序编写 编写测试APP 运行测试 编译驱动程序和测试APP 运行测
  • 使用请求队列实验

    关于块设备架构就讲解这些 接下来我们使用开发板上的 RAM 模拟一段块设备 也就是ramdisk 然后编写块设备驱动 首先是传统的使用请求队列的时候 也就是针对机械硬盘的时候如何编写驱动 先分段分析一下驱动代码 1 重要的数据结构及宏定义
  • 3.gendisk结构体

    在Linux内核中 使用gendisk 通用磁盘 结构体来表示一个独立的磁盘设备 或分区 1 gendisk结构体 major first minor和minors共同表征了磁盘的主 次设备号 同一个磁盘的各个分区共享一个主设备号 而此设备
  • Linux 帧缓冲子系统详解:LCD介绍、framebuffer驱动框架、LCD驱动源码分析

    1 LCD显示屏基础知识介绍 请看博客 嵌入式开发 S5PV210 LCD显示器 2 内核帧缓冲子系统 2 1 功能介绍 1 帧缓冲 framebuffer 是 Linux 为显示设备提供的一个接口 它把显示设备描述成一个缓冲 区 允许应用
  • platform 设备驱动实验

    目录 Linux 驱动的分离与分层 驱动的分隔与分离 驱动的分层 platform 平台驱动模型简介 platform 总线 platform 驱动 platform 设备 硬件原理图分析 试验程序编写 platform 设备与驱动程序编写
  • Linux I2C 驱动实验

    一 I2C 驱动 本章同样以 I MX6U ALPHA 开发板上的 AP3216C 这个三合一环境光传感器为例 通过 AP3216C 讲解一下如何编写 Linux 下的 I2C 设备驱动程序 Linux 的驱动分离与分层的思想 因此 Lin
  • 杂项设备(misc device)和字符设备(char device)区别

    杂项设备 misc device 杂项设备也是在嵌入式系统中用得比较多的一种设备驱动 在 Linux 内核的include linux目录下有Miscdevice h文件 要把自己定义的misc device从设备定义在这里 其实是因为这些
  • Linux MISC 驱动实验

    我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动 MISC 驱动其实就是最简单的字符设备驱动 通常嵌套在 platform 总线驱动中 实现复杂的驱动 一 MISC 设备驱动简介 所有的 MISC 设备驱动的主设备号都为 1
  • windows内核驱动开发(WDK环境搭建)

    去官网下载WDK安装包和Visual Studio 下载 Windows 驱动程序工具包 WDK Windows drivers Microsoft Docs 首先安装Visual Studio 这个就不用我介绍了怎么安装了 下面直接下载步
  • 深入分析linux内核的内存分配函数devm_kzalloc

    在分析驱动代码的时候 经常会遇到使用devm kzalloc 为一个设备分配一片内存的情况 devm kzalloc 是内核用来分配内存的函数 同样可以分配内存的内核函数还有devm kmalloc kzalloc kmalloc 它们之间
  • linux ARM64 处理器内存屏障

    一 内存类型 ARMv8架构将系统中所有的内存 按照它们的特性 划分成两种 即普通内存和设备内存 并且它们是互斥的 也就是说系统中的某段内存要么是普通内存 要么是设备内存 不能都是 1 普通内存 Normal Memory 普通内存的特性是

随机推荐

  • 剑指 Offer 16. 数值的整数次方 -- 快速幂

    0 题目描述 leetcode原题 剑指 Offer 16 数值的整数次方 1 快速幂解法 快速幂实际上是二分思想的一种应用 二分推导 x n x n
  • Windows下安装DVWA靶场

    Windows下利用phpstudy安装DVWA靶场 1 下载安装phpstudy以及DVWA Master php study下载官网https www xp cn DVWA资源已上传 在这里插入图片描述 https img blog c
  • SpringBoot整合shiro-spring-boot-starter

    1 项目启动时报错如下 Description The bean securityManager defined in class path resource org apache shiro spring config web autoc
  • Vue中el-input的相关校验使用场景

    1 输入框只能输入数字且第一位不能为小数点 以及只能输入小数点后两位
  • .NET Core微服务之路:利用DotNetty实现一个简单的通信过程

    上一篇我们已经全面的介绍过 基于gRPC服务发现与服务治理的方案 我们先复习一下RPC的调用过程 笔者会在这一节的几篇文章中反复的强调这个过程调用方案 看下图 根据上面图 服务化原理可以分为3步 服务端启动并且向注册中心发送服务信息 注册中
  • 人工智能、大数据、物联网、区块链,四大新科技PK,你更看好谁?

    最近行业中备受关注并且非常火热的产业有哪些呢 小编这边总结了一下 一共有4个 分别是人工智能 大数据 物联网和区块链 这四种新科技也一直是蓄势待发 未来将引领新一代的科技成长 也会带给人类很多更方便快捷的生活 说到这里 可能好多小伙伴对这些
  • Python使用Selenium打开百度并指定搜索

    from selenium import webdriver from selenium webdriver common keys import Keys from selenium webdriver common by import
  • (全网最详细攻略)【Crypto++】在Visual studio2022中运行Cryptopp

    文章目录 前言 一 Cryptopp是什么 1 Cryptopp CRYPTO 官方文档wiki 二 下载Cryptopp 2 Crypto 下载地址 3 下载PEM包 三 在VS2022中使用Cryptopp库 4 处理crypto 源文
  • mapboxgl 绘制3d polygon

  • “人机”既不是人也不是机

    人机 实际上是一个独特的实体 既不是传统意义上的人 也不是简单的机器 这个术语通常用来描述人与机器之间的协同关系 特指人类与人工智能技术的融合 人机 可以是指通过人工智能技术进行增强和扩展的人类能力 例如 人们可以使用智能手机 计算机和其他
  • 以太网概述

    各种网络的区别 以太网 是一种实现局域网通信的技术标准 是目前最广泛的局域网技术 以太网可以用在局域网 广域网 也可以用在互联网上 因为简单易用 现在网络有以太网化的趋势 局域网 是一个局部范围的计算计组 就是局部地区形成的一个区域网络 特
  • Kubernetes入门

    Kubernetes入门 一 Kubernetes是什么 首先 它是一个全新的基于容器技术的分布式架构领先方案 这个方案虽然还很新 但是它是谷歌十几年依赖大规模应用容器技术的经验积累和升华的一个重要成果 实现资源管理的自动化 以及跨多个数据
  • PyCharm配置解释器

    文章目录 一 Python解释器 Python Interpreter 是什么 二 添加解释器的步骤 1 单击 Settings 2 倒三角 点击 Show All 3 点击 4 点击 Existing environment 5 选中 p
  • java中的锁池和等待池

    在java中 每个对象都有两个池 锁 monitor 池和等待池 wait notifyAll notify 三个方法都是Object类中的方法 锁池 假设线程A已经拥有了某个对象 注意 不是类 的锁 而其它的线程想要调用这个对象的某个sy
  • qmake prl TEMPLATE=subdir之错误小记

    最近 在使用qmake prl和TEMPLATE subdir时犯了一个错误 记录之以便以后查看 项目结构 project pro main main pro lib lib pro project pro中写的是 TEMPLATE sub
  • 【MySQL】 MySQL 导出数据库

    1 概述 转载 MySQL 导出数据库 仅供自己学习 这篇文章有趣 我看的是A文章 然后A转载的是B 然后B转载的是C 然后C转载的是D 我这里直接转载了D 主要是确实好用 在没有工具的情况下 MySQL备份和还原 都是利用mysqldum
  • golang怎么让string转int64

    在 Go 语言中 可以使用内置函数 strconv ParseInt 将字符串转为 int64 类型 具体用法如下 s 123456 i err strconv ParseInt s 10 64 if err nil 可能字符串 s 不是合
  • 剑指Offer - 面试题12:矩阵中的路径

    题目 请设计一个函数 用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径 路径可以从矩阵中的任意一格开始 每一步可以在矩阵总向左 右 上 下移动一格 如果一条路径经过了矩阵的某一格 那么该路径不能再次进入该格子 如 在下面的3 4的
  • 增量式PID vs 位置式PID: 选择最佳的PID控制策略

    增量式PID和位置式PID是两种常见的PID控制器实现方法 它们之间的区别主要在于反馈信号的处理方式和输出计算方式 反馈信号处理方式 增量式PID 增量式PID控制器使用系统输出值与前一时刻的输出值之差作为反馈信号 它将当前的误差值与前一时
  • 第五篇 如何调用驱动接口,完成互操作

    1 如何调用驱动功能 1 编写调用驱动的应用程序 1 1 定义驱动设备接口 以及调用接口的控制码 例如 DEFINE GUID GUID DEVINTERFACE SampleDriver 0xc459a9ec 0xb463 0x4838