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

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(使用前将#替换为@)

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

  • DDK(Driver Developer Kit)和WDK(Windows Driver Kit)的区别

    首先 先从基础的东西说起 开发WINDOWS下的驱动程序 需要一个专门的开发包 如 开发JAVA程序 我们可能需要一个JDK 开发WINDOWS应用程序 我们需要WINDOWS的SDK 现在开发WINDOWS下的驱动程序 我们需要一个DDK
  • Linux驱动系列-PWM驱动

    转自 嵌入式系统研发 1 概述 本文主要讲述了Linux的PWM驱动框架 实现方法 驱动添加方法和调试方法 示例Linux内核版本 6 2 8 2 原理 PWM是Pulse Width Modulation的简称 中文译作脉冲宽度调制 作为
  • 嵌入式内核及驱动开发中级(上)

    目录 第一部分 一 设备分类 设备申请和注销 一 Linux内核对设备的分类 二 设备号 内核中同类设备的区分 三 申请和注销设备号 二 Code exerccise 三 知识补充 第二部分 一 函数指针复习 一 函数指针复习 1 1 内存
  • linux-arm电源管理

    一文搞懂ARM SoC功耗控制架构
  • 嵌入式Linux驱动开发(LCD屏幕专题)(四)

    单Buffer的缺点与改进方法 1 单Buffer的缺点 如果APP速度很慢 可以看到它在LCD上缓慢绘制图案 即使APP速度很高 LCD控制器不断从Framebuffer中读取数据来显示 而APP不断把数据写入Framebuffer 假设
  • 微星b560m mortar wifi 开机二检(开机灭了1秒后自动重启)

    微星b560m mortar wifi 开机二检 开机灭了1秒后自动重启 1 起因 为了照顾旧CPU 还想把内存扩容到64GB 就选择了DDR4的4条插槽的 B560M主板 都弄好之后 开机发现在按下电源键之后 通电自检后断电了大概2秒左右
  • Linux 块设备驱动实验

    一 块设备驱动要远比字符设备驱动复杂得多 不同类型的存储设备又对应不同的驱动子系统 本章我们重点学习一下块设备相关驱动概念 不涉及到具体的存储设备 1 什么是块设备 块设备是针对存储设备的 比如 SD 卡 EMMC NAND Flash N
  • Robot Framework 自动化测试详解

    一 Robot Framework 简介 1 界面自动化测试工具 界面自动化测试 即UI自动化测试 比较常见的工具有 QTP AutoIt Selenium等 像QTP经历了很多版本 最新的版本好像叫UFT了 对初学者来说 录制回放是相当容
  • Linux设备驱动-procfs

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

    问题 什么是寄存器 什么是存储器映射 什么是寄存器映射 STM32架构 程序存放在FLASH中 const的常量存放在FLASH中 变量 全局 静态变量 存放在SRAM中 System总线主要读取寄存器 AHB 高速 总线上挂着SDIO 复
  • Failed to execute /linuxrc. Attempting defaults... 解决方案

    今天想移植个根文件系统 使用的板子是友善之臂的S3C2440 这个很多书上都有介绍 难度倒也不是很大 按照手册一步步的来 移植完之后 烧写到flash里面 发现不能运行 怎么回事 检查了一遍 发现和教材上一样 难道教材有问题 在网上找了移植
  • 异步通知实验(信号)

    目录 异步通知 异步通知简介 驱动中的信号处理 应用程序对异步通知的处理 硬件原理图分析 实验程序编写 修改设备树文件 程序编写 编写测试APP 运行测试 编译驱动程序和测试APP 运行测试 在前面使用阻塞或者非阻塞的方式来读取驱动中按键值
  • 3.gendisk结构体

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

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

    按键 鼠标 键盘 触摸屏等都属于输入 input 设备 Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件 输入设备本质上还是字符设备 只是在此基础上套上了 input 框架 用户只需要负责上报输入事件 比如按键值
  • RK3568 CAN驱动更新说明

    RK3568 CAN问题 同时收发数据一段时间 几秒钟 can出现错误收发功能异常 必须重新down up恢复正常 内核更新rockchip canfd c iopoll h 配置Networking support gt CAN bus
  • 磁盘数据线接触不良的故障排查

    手头有个小型主机 运行centos 发现工作很不稳定 经常启动不起来 就算启动起来也会在几分钟内出现各种IO错误 可能出现以下几种报错 1 只读文件系统 Read only file system 尝试对磁盘写入的时候可能出现这个错误 2
  • uboot下UCLASS框架详解---结合项目工作中spi master和flash驱动开发

    文章目录 一 综述 二 UCLASS架构解析 2 1 uclass 2 2 udevice 2 3 uclass driver 2 4 driver 2 4 1 spi master driver 三 uboot代码解析 3 1 DM的初始
  • Windows驱动开发(一)第一个驱动程序

    首先我们需要了解 在操作系统中 是分两种权限的 一种是内核态 我们也称为0环 一种是用户态 称之为3环 而在我们的电脑中 驱动程序是运行在内核态的 这意味着和操作系统内核是在同一权限的 而普通的应用程序的权限是最低的 高权限谁不想拥有呢 因
  • 深入分析linux内核的内存分配函数devm_kzalloc

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

随机推荐

  • 剑指 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