应用程序访问底层硬件

2023-11-09

 

2.1驱动程序开发原理
      在无操作系统的裸机中,或者类似如DOS这样操作系统中,应用程序和硬件的交互是非常简单的。如同牛郎织女,本来就睡在同一张床上,想怎么说悄悄话都行。可是现在情况有变,他们被天河分开了。要想见面聊几句,也要麻烦喜鹊来搭桥。在WINDOWS操作系统中,应用程序与硬件间的交互与此极其类似。如果没有操作系统,我们访问硬件空间可能只需一条指令就行,甚至可以访问任意的内存空间或者IO空间。因此应用程序和硬件就成了牛郎织女,被操作系统这个天河硬生生的隔开了。当应用程序要访问某个硬件或者内存空间时,就必须借助于喜鹊(驱动程序)了。至于为什么要把硬件层和应用程序隔开,答案是——安全。允许应用程序随意访问硬件是一件很危险的事情,除了可能会造成蓝屏死机之类的问题,还会发生密码的安全性问题。从这一点来说,上面的比喻还真是不够贴切,牛郎织女分开好像不是安全原因,无论比喻贴不贴切,还是往下继续吧。
      应用程序访问驱动程序,要指定驱动程序的符号链接名,然后把要发送的信息发送出去。操作系统找到相关驱动程序,驱动程序把信息发动给指定硬件。如写信一样,驱动程序像邮差。

2.2应用程序寻找设备接口的方法——SetupDixx系列函数

2.2.1SetupDiGetClassDevs

函数定义
  HDEVINFO
  SetupDiGetClassDevs(
  constGUID*ClassGuid,
  PCTSTR Enumerator,
  HWND hwndParent,
  DWORD Flags
  );
SetupDiGetClassDevs 获取一个指定类别或全部类别的所有已安装设备的信息
  参数说明:

输入参数:
  PGUID ClassGuid
  在创建设备列表的时候提供一个指向GUID的指针。如果设定了标志DIGCF_ALLCLASSES,则这个参数可以忽略,且列表结果中包括所有已经安装的设备类别。
  PCTSTR Enumerator
  提供包含设备实例的枚举注册表分支下的键名,可以通过它获取设备信息。如果这个参数没有指定,则要从整个枚举树中获取所有设备实例的设备信息。
  HWND hwndParent
  提供顶级窗口的句柄,所有用户接口可以使用它来与成员联系。
  DWORD Flags
  提供在设备信息结构中使用的控制选项。可以是以下数值:
  DIGCF_PRESENT - 只返回当前存在的设备。
  DIGCF_ALLCLASSES - 返回所有已安装的设备。如果这个标志设置了,ClassGuid参数将被忽略。
  DIGCF_PROFILE - 只返回当前硬件配置文件中的设备。
返回值:

     HDEVINFO
  如果函数运行成功,返回设备信息结构的句柄,该结构包含与指定参数匹配的所有已安装设备。如果失败,则返回INVALID_HANDLE_VALUE。调用GetLastError可以获得更多错误信息。
  说明使用此函数,需要包含头文件setupapi.h。
  此外,在project setting中的link页面需要添加setupapi.lib。
  在setuapi.h中有如下定义:
  typedef PVOID HDEVINFO;
  即HDEVINFO是个无类型指针

2.1.2 SetupDiEnumDeviceInfo(SetupDiEnumDeviceInterface同样有memberindex 可以视情况定)

函数定义

BOOLEAN
SetupDiEnumDeviceInfo(
        IN HDEVINFO  DeviceInfoSet,
        IN DWORD  MemberIndex,
        OUT PSP_DEVINFO_DATA  DeviceInfoData
        );  

SetupDiEnumDeviceInfo  枚举指定设备信息集合的成员,并将数据放在PSP_DEVINFO_DATA中
参数说明:

DeviceInfoSet
提供一个设备信息集合的句柄

MemberIndex
指定一个要取得的设备信息成员序号,从0开始

DeviceInfoD

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

应用程序访问底层硬件 的相关文章

  • 如何取消同步 WinHttp 请求?

    我的服务有一个线程可能正在执行WinHttpSendRequest当有人试图停止我的服务时 The WinHttpCloseHandle 文档 http msdn microsoft com en us library windows de
  • 参考接口创建对象

    引用变量可以声明为类类型或接口类型 如果变量声明为接口类型 则它可以引用实现该接口的任何类的任何对象 根据上面的说法我做了一个理解上的代码 正如上面所说声明为接口类型 它可以引用实现该接口的任何类的任何对象 但在我的代码中显示display
  • 使用 CreateRestrictedToken(LUA_TOKEN) 从提升的进程创建低/中进程

    我正在尝试从提升的进程创建中或低完整性进程 我知道还有其他类似的问题 但它们主要关注使用资源管理器或任务计划程序等解决方法 我想坚持使用CreateRestrictedToken CreateProcessAsUser 我认为一定可以以某种
  • C# - 如何将 IntPtr 缓冲区数据保存到文件(最快的方法)?

    我使用此代码将非托管代码中的 IntPtr 缓冲区中的字节保存到文件中 这是一个简单的回调函数 private void callback IntPtr buffer int length byte bytes new byte lengt
  • 使用 cryptoapi CryptImportKey 导入公钥时出错

    我想将公钥 blob 导入到 CSP 但发生了错误 BYTE pbData 0xEB 0x2A 0x38 0x56 0x86 0x61 0x88 0x7F 0xA1 0x80 0xBD 0xDB 0x5C 0xAB 0xD5 0xF2 0x
  • 类、模块、它们的特征类和方法查找

    我们来开公开课吧Module并向其中添加一个方法 class Module def foo puts phew end end 我可以通过这样做来调用这个方法 Class foo 这是可以理解的 因为类Class is Class 其超类是
  • C++类名冲突

    我现在正在做一个项目 需要整合两个子项目 项目A是用C 编写的 项目B是用C编写的 一个问题是 在项目B中 有一个名为vector它是由其作者创建的 在项目 A 中 std vector in STL用来 因为项目B以后可能会更新 所以我不
  • 检查Windows电源管理是否关闭了显示器

    如何在 Windows 7 和 XP 中以编程方式检查 Windows 电源管理 是否已关闭显示屏 如果能收到一个活动就更好了 我不认为 XP 可以做到这一点 Windows 7 中有各种与电源管理相关的好东西 这Windows API 代
  • 用于多个窗口的 Tkinter 示例代码,为什么按钮无法正确加载?

    我正在编写一个程序 应该 按一下按钮即可打开一个窗口 按另一个按钮关闭新打开的窗口 我使用类 以便稍后可以将代码插入到更大的程序中 但是 我无法正确加载按钮 import tkinter as tk class Demo1 tk Frame
  • 使用 BitBlt 捕获程序窗口始终返回相同的图像

    我编写了以下代码 C Win32 来捕获游戏窗口屏幕并从图像中获取像素颜色数组 函数 autoB 完成这项工作 然后我将结果数组绘制到窗口中以直观地检查我得到的结果 问题是 这个程序在我启动计算机后只工作一次 在第一次 缓存 从游戏中获取的
  • C++:获取器和设置器?

    我正在尝试编写一些代码来为以下数据的 ID 号 名字 姓氏 期中成绩和期末成绩创建 getter 和 setter 这些数据位于我正在编写的班级的文本文件中 10601 ANDRES HYUN 88 91 94 94 89 84 94 84
  • 为什么在标头内的类声明中声明变量时会出现错误?

    我正在尝试创建一个包含简单整数的类 当然 它使用头文件之类的 这是代码 class h class consolBuf private int buffersize1 10 Data member initializer is not al
  • Java:SortedMap、TreeMap、可比较?如何使用?

    我有一个对象列表 需要根据其中一个字段的属性进行排序 我听说 SortedMap 和 Comparator 是实现此目的的最佳方法 我是否要与正在排序的类实现 Comparable 还是创建一个新类 如何实例化 SortedMap 并传入
  • R 中使用 `UseMethod()` 与 `inherits()` 来确定对象的类

    如果我需要根据 R 对象的类以不同的方式处理它们 我可以使用if and else在单个函数内 foo lt function x if inherits x list Foo the list else if inherits x num
  • 对象的引用计数

    在我的代码中 我使用一个小的数据存储类 它是在不同的地方创建的 为了避免内存泄漏并简化事情 我想使用引用计数 所以我这样做了 type TFileInfo class TInterfacedObject IInterface 并删除了我对
  • 以编程方式更改任务栏图标(Win32,C++)[重复]

    这个问题在这里已经有答案了 我有一个 C win32 程序 我想在运行时编辑任务栏图标以显示有关该程序的警报等 但是我对 win32 api 不太有经验 而且我找不到任何东西在线的 我发现的最接近的是http www windows tec
  • 如何在Delphi中显示Vista风格的气球提示?

    在输入验证时 我使用气球提示而不是消息框 我的问题是 在 Vista 上 它们具有带圆角的旧 XP 样式 而不是较新的矩形外观 我尝试使用 CreateWindowEx 创建它们并且tooltips class32或使用 SendMessa
  • AXI4 流接口:如何在 HLS 中管理浮点数组以生成硬件加速器并在 RTL 项目中安全地连接它们?

    最后 我想做的是使用 Vivado Design Suite 中具有单精度浮点数组的流接口来构建硬件加速器 HLS 用户指南UG902 http www xilinx com support documentation sw manuals
  • 为什么这个实现方法看不到它的同级方法? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个实现接口的类 public class SQLiteHHSDBUtils IHHSDBUtils void IHHSDBUtils
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne

随机推荐

  • python中的->和@

    gt gt 常常出现在python函数定义的函数名后面 为函数添加元数据 描述函数的返回类型 从而方便开发人员使用 如 def add x y gt int return x y 这里面 元数据表明了函数的返回值为int类型 这样做的好处是
  • 【Qt】QImage使用总结

    图像格式转换 由 RGB 格式转换成 BGR 格式 QImage rgbSwapped 返回一个QImage 其中所有像素的红色和蓝色组件的值被交换 有效地将RGB图像转换为BGR图像 QImage image fileName QImag
  • 阿里巴巴0322晚春招实习笔试算法题解析 --- sort函数的用法与第二题:数组重排

    sort first last 对容器或普通数组中 first last 范围内的元素进行排序 默认进行升序排序 sort 函数是基于快速排序实现的 sort 只对 array vector deque 这 3 个容器提供支持 默认升序排序
  • Sqli-labs Less09-10 延时型sql盲注 - GET

    本文记录 SQL 注入的学习过程 资料为 SQLi SQLi 博客目录 Less 09 GET Blind Time based Single Quotes 测试漏洞 本关我们从标题就可以看到 基于时间 单引号 所以很明显的这关要我们利用延
  • docker下查看删除kafka下topic

    在公司的项目中需要用到kafka和c 进行消息发送 有一天不知道为啥 下端就出现一直读取消息的问题 所以得清空通道内的消息 1 docker ps 获取到当前kafka的容器id 673e6f1401c7 docker ps a 可以查看所
  • 一个DataFrame赋值的诡异报错 A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc

    DataFrame赋值时报错 A value is trying to be set on a copy of a slice from a DataFrame Try using loc row indexer col indexer v
  • vscode提取扩展时出错XHR tiemout:undefinedms,如何解决?

    问题 vscode提取扩展时出错XHR tiemout undefinedms 如何解决 电脑重启了 断网重新连接了 都不行 解答 该错误通常表示 VS Code 扩展商店的连接超时 可能是网络问题导致的 您可以尝试以下几种方法 检查网络连
  • 一维码EAN 13简介及其解码实现(zxing-cpp)

    一维码EAN 13 属于国际标准条码 由13个数字组成 为EAN的标准编码型式 EAN标准码 依结构的不同 EAN条码可区分为 1 EAN 13码 由13个数字组成 为EAN的标准编码型式 EAN标准码 2 EAN 8码 由8个数字组成 属
  • protobuf的介绍、安装与使用

    1 protobuf是什么 protobuf是google旗下的一款平台无关 语言无关 可扩展的序列化结构数据格式 所以很适合用做数据存储和作为不同应用 不同语言之间相互通信的数据交换格式 只要实现相同的协议格式即同一 proto文件被编译
  • U盘安装ubuntu18.04 LTS图文详细过程

    扣扣技术交流群 460189483 制作U盘引导盘 安装Ubuntu18 04 LTS系统 一 下载Ubuntu18 04 LTS系统的iso文件 镜像下载地址 https www ubuntu com download desktop 下
  • 《基于大数据架构的视频推荐系统设计与实现》摘要

    基于大数据架构的视频推荐系统设计与实现 是一篇有关视频推荐系统的论文 它描述了基于大数据架构的视频推荐系统的设计与实现过程 论文阐述了系统的数据采集 处理 存储 分析以及推荐算法等方面的内容 最终 论文评估了系统的效果并与其他现有系统进行了
  • Python运算符和数据类型、复杂的if嵌套

    一 占位符 1 1 三种占位符 s 字符串占位符 d 整数占位符 f 小数占位符 代码演示 name 张家辉 age 50 money 10 57 print s代言了贪玩蓝月 他今年岁了 name 张家辉代言了贪玩蓝月 他今年50岁了 p
  • 类似error: #147: declaration is incompatible with ""void printf(const char *, ...)....的问题解决

    我们用LPC型号还是其他型号的系统板或开发板时我们编译文件时可能出现如下的错误 C mdk keil5 ARM ARMCC Bin include stdio h 402 error 147 declaration is incompati
  • STM32 Cube 生态体系

    STM32Cube是ST公司开发的一套生态系统 致力于使STM32的开发变的更简单 并且100 开源免费 它包括两大部分 1 PC软件工具 STM32CubeMX STM32CubeIDE STM32CubeProgrammer STM32
  • python的sorted函数自定义排序

    sorted函数语法 sorted iterable cmp key reverse 在python3中去除了cmp参数 所以这里用到python自带的一个将cmp函数转化为key的值的函数 就是functools模块的cmp to key
  • 内核error: implicit declaration of function 'irq_to_gpio' 解决方法

    第一种方法 文件1 drivers mfd Kconfig 中 删除depends on GENERIC HARDIRQS SPI MASTER 添加depends on GENERIC HARDIRQS SPI MASTER ARCH P
  • R语言零基础入门教程 第五章高级绘图(2)ggplot2包绘图工具直方图,散点图,核密度图

    直方图 实例 nutshell包的births2006 smpl数据集 包含了2006年美国出生人口的数据的10 样本 每一条记录有13个变量 使用数据集前 需通过install packages nutshell 安装并加载 以美国出生人
  • JAVA 单列集合总结

    Collection 接口 add remove contains clear size 迭代器遍历 普通迭代器 不能再遍历过程中修改集合的长度 List接口 单列集合 有序可重复 有索引 add index obj remove inde
  • 如何写好C++类

    先讲一个笑话 同时学习两年 Java的程序员在一起讨论的是面向对象和设计模式 而同时学习两年 C 的程序员 在一起讨论的是 template和各种语言规范到底怎么回事情 下面就从公开的资料中撸一撸如何写好一个c 类 从头文件 h 需要包含的
  • 应用程序访问底层硬件

    2 1驱动程序开发原理 在无操作系统的裸机中 或者类似如DOS这样操作系统中 应用程序和硬件的交互是非常简单的 如同牛郎织女 本来就睡在同一张床上 想怎么说悄悄话都行 可是现在情况有变 他们被天河分开了 要想见面聊几句 也要麻烦喜鹊来搭桥