Windows下枚举USB设备信息Demo

news2024/12/29 2:22:54

目录

1 简介

1.1 设备接口类

1.2 枚举设备信息原理

2 SetupDi系列函数介绍

2.1 SetupDiGetClassDevs

2.2 SetupDiEnumDeviceInfo

2.3 SetupDiGetDeviceRegistryProperty

2.4 SetupDiGetDeviceRegistryProperty

3 演示Demo

3.1 开发环境

3.2 功能介绍

3.3 下载地址


1 简介

        Windows开发过程中,有时候需要进行设备信息的管理,那么SetupDi系列函数能够满足你的要求。

1.1 设备接口类

        任何一种驱动都要为用户,或者其他使用者提供某种类型的名字。而使用者也通过这种名字来区别不同的设备,并与之进行IO。

        在Windows NT 4.0和以前的版本中,驱动程序会为设备对象创建名字,并为之创建设备连接符,并将之注册到系统中。

        自Windows 2000开始,驱动程序不再为设备对象命名,而是使用设备接口类。设备接口类可以向使用者提供设备和驱动程序函数的入口,驱动将注册设备接口类,并为设备对象创建设备接口类实例。

        每个设备接口类都有一个GUID。系统在device-specific header files中定义了常用设备类与其GUID。但设备开发者可以自定义设备类。

        例如,三种不同类型的鼠标可以属于同一个设备接口类,即使他们分别使用了USB口,串口,红外端口。他们的驱动都把他注册为GUID_DEVINTERFACE_MOUSE设备接口类,这个设备接口类的GUID在Ntddmou.h中定义。

        特别指出,这些驱动只注册了一个设备类。然而,各种设备的驱动可以有专门的函数以注册除标准接口类以外的接口类,如可安装磁盘驱动必须注册(GUID_DEVINTERFACE_DISK) 接口类以及(MOUNTDEV_MOUNTED_DEVICE_GUID)可安装设备类。

        当驱动注册了设备接口的实例后,IO管理器就将设备和设备接口的GUID,符号链接名联系在一起。符号链接名存储在注册表中,在系统启动时即存在。使用某用户可以查询这个接口以获得支持这个接口的设备的符号链接名。使用者可以用这个符号连接名来对设备进行IO.

1.2 枚举设备信息原理

  1. 注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e97d-e325-11ce-bfc1-08002be10318}获取设备安装类的枚举信息。

  2. 通过实例获取到实例id。

  3. 获取HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum下面设备相关信息。

  4. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class:是设备安装类GUID,代表当前设备类型。

  5. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses:设备接口类GUID

  6. 通过注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses获取设备接口的枚举信息。

2 SetupDi系列函数介绍

2.1 SetupDiGetClassDevs

/*
    功    能: 获取一个指定类别或全部类别的所有已安装设备的信息。
    参    数: ClassGuid  - 一个特定类别GUID(需要查询注册表)的指针,
              Enumerator - 过滤枚举的内容
              hwndParent - 用于关联到集合成员中的用户接口的顶层窗口句柄
              Flags      - 建立设备信息表的控制选项
    返    回:如成功,返回包含所有与指定参数匹配的已经安装设备信息句柄
             如失败,则返回INVALID_HANDLE_VALUE
*/
HDEVINFO SetupDiGetClassDevs(
  _In_opt_ const GUID   *ClassGuid,
  _In_opt_       PCTSTR Enumerator,
  _In_opt_       HWND   hwndParent,
  _In_           DWORD  Flags
);

2.2 SetupDiEnumDeviceInfo

/*
    功    能: 枚举指定设备信息集合的成员,并将数据放在PSP_DEVINFO_DATA中
    参    数: DeviceInfoSet - 提供一个设备信息集合的句柄
              MemberIndex   - 指定一个要取得的设备信息成员序号,从0开始
              DeviceInfoData - 指向SP_DEVINFO_DATA结构的指针,关于指定成员的返回信息就放在该结构中
    返    回:如果要枚举全部设备信息成员,装载者首先应该将MemberIndex设为0调用SetupDiEnumDeviceInfo,
            然后递增MemberIndex(使用一个for循环),调用SetupDiEnumDeviceInfo,
            直至所有成员全部遍历(此时函数返回False,并且GetLastError返回ERROR_NO_MORE_ITEMS)。
*/
BOOL SetupDiEnumDeviceInfo(
  _In_  HDEVINFO         DeviceInfoSet,
  _In_  DWORD            MemberIndex,
  _Out_ PSP_DEVINFO_DATA DeviceInfoData
);

2.3 SetupDiGetDeviceRegistryProperty

/*
    功    能:用来检索指定的即插即用设备特性(这个函数主要是使用System\CurrentControlSet\Enum注册表来查询相关硬件信息)
    参    数: DeviceInfoSet      - 设备信息句柄
              DeviceInfoData      - SP_DEVINFO_DATA结构体,包含DeviceInfoSet中的设备信息
              Property            - 待查询的属性
              PropertyRegDataType - 
              PropertyBuffer      - 
              PropertyBufferSize  - 
              RequiredSize        - 
    返    回:成功返回非零,否则返回零
*/
BOOL SetupDiGetDeviceRegistryProperty(
  _In_      HDEVINFO         DeviceInfoSet,
  _In_      PSP_DEVINFO_DATA DeviceInfoData,
  _In_      DWORD            Property,
  _Out_opt_ PDWORD           PropertyRegDataType,
  _Out_opt_ PBYTE            PropertyBuffer,
  _In_      DWORD            PropertyBufferSize,
  _Out_opt_ PDWORD           RequiredSize
);

2.4 SetupDiGetDeviceRegistryProperty

/*
    功    能: 要释放的设备信息句柄
    参    数: DeviceInfoSet - 设备信息句柄
    返    回:成功返回非零,否则返回零
*/
BOOL SetupDiDestroyDeviceInfoList( HDEVINFO DeviceInfoSet); 

3 演示Demo

3.1 开发环境

  • Visual Studio 2015

  • Windows 10 Pro x64

3.2 功能介绍

        演示程序主界面如下图所示,包括过滤设备、枚举设备等功能。

        支持HID、虚拟串口、CDROM等多种USB设备。

3.3 下载地址

        开发环境:

  • Windows 10 pro x64

  • Visual Studio 2015

        下载地址: Windows下枚举USB设备信息Demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

70 爬楼梯

解题思路一:(动态规划) \qquad 假设F(n)返回的是爬n阶的所有方法个数,由题可知,每次可以爬1-2级台阶,那么可以得到: \qquad \qquad \qquad \qquad \qquad F(n) F(n - 1) F(n - 2) \qquad 我…

WeTab AI桌面端的下载安装

wetab AI的使用很方便,收费也不高,专业版的最新版本的AI核心配置如下: 现在推出了桌面端,下载链接:桌面端下载链接 在下载页面点击windows(Beta版): 下载并安装,桌面上就…

DRF组件讲解

DRF组件 1. Web应用模式 在开发Web应用中,有两种应用模式: 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。 前后端分离【把前端的界面效果(html,css,js分离到另一个服务端,python服务端只需…

LLM agentic模式之工具使用: Toolformer、CoA、MM-React思路

Toolformer Toolformer出自2023年2月Meta上传的论文《Toolformer: Language Models Can Teach Themselves to Use Tools》,它提出了一种通过自监督训练的方式来让模型决定调哪个API什么时候调用。 API调用的表示:为了让模型去能够调用API,将…

实现随机地牢与摄像机追随与拖拽

//author bilibili 民用级脑的研发记录 // 开发环境 小熊猫c 2.25.1 raylib 版本 4.5 // 2024-7-14 // AABB 碰撞检测 在拖拽,绘制,放大缩小中 // 2024-7-20 // 直线改每帧打印一个点,生长的直线,直线炮弹 // 2024-8-4 // 实现敌…

JavaScript高级程序设计 -- -- 观后记录

一、什么是 JavaScript 1、JavaScript 实现 完整的 JavaScript 实现包含以下几个部分: -- --  核心(ECMAScript)  文档对象模型(DOM)  浏览器对象模型(BOM) 2、DOM 文档对象模型&#…

橙色简洁大气体育直播自适应模板赛事直播门户自适应网站源码

源码名称:酷黑简洁大气体育直播自适应模板赛事直播门户网站 源码开发环境:帝国cms 7.5 安装环境:phpmysql 带采集,可以挂着电脑上自动采集发布,无需人工操作! 橙色简洁大气体育直播自适应模板赛事直播门户…

广州必看自闭症康复机构十大排名名单出炉

在众多为自闭症儿童提供帮助的机构中,星贝育园以其卓越的服务和显著的成效脱颖而出,成功跻身广州必看自闭症康复机构十大排名。 星贝育园在广州、浙江拥有三个校区,为更多的自闭症儿童和家庭带来了希望。这里的特教老师和生活老师不辞辛劳&a…

一次现网redis CPU使用率异常定位

背景 618大促前,运维对系统做巡检时发现redis cpu利用率白天基本保持在72%左右,夜里也在60%以上。担心618流量比平时大,导致redis超负荷,因此找开发进行优化,降低redis的负载。 定位思路 其实资源使用率过高定位都…

大数据技术—— Clickhouse安装

目录 第一章 ClickHouse入门 1.1 ClickHouse的特点 1.1.1 列式存储 1.1.2 DBMS的功能 1.1.3 多样化引擎 1.1.4 高吞吐写入能力 1.1.5 数据分区与线程级并行 1.1.6 性能对比 第二章 ClickHouse的安装 2.1 准备工作 2.1.1 确定防火墙处于关闭状态 2.1.2 CentOS取消…

Vue UI - 可视化的Vue项目管理器

概述 Vue CLI 3.0 更新后,提供了一套全新的可视化Vue项目管理器 —— Vue UI。所以要想使用它,你的 Vue CL I版本必须要在v3.0以上。 一、启动Vue UI 1.1 环境准备 1.1.1 安装node.js 访问官网(外网下载速度较慢)或 http://nod…

民航管理局无人机运营合格证技术详解

1. 证书定义与意义 民航管理局无人机运营合格证(以下简称“合格证”)是对符合民航法规、规章及标准要求的无人机运营单位或个人进行资质认证的重要证明。该证书旨在确保无人机运营活动的安全、有序进行,保护国家空域安全,维护公众…

电子电气架构 --- 软件定义汽车需要怎么样的EE架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…

反射型XSS的几种payload

目录 第一种&#xff1a;采用的是urlcode编码 第二种&#xff1a;前面用html实体编码&#xff0c;后面用urlcode编码 第三种&#xff1a;只对&#xff1a;使用urlcode编码 第四种&#xff1a;对<>进行html实体编码 第五种&#xff1a;textarea 第六种&#xff1a;和…

【JavaEE】锁策略和CAS

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f4b0;一.常见的的锁策略 锁策略&#xff08;Locking Strategy&#xff09;是指在多线程环境中&#xff0c;为了控制对共享资源的访问&#xff0c;确保…

「OC」探索CALayer:基础知识与实用技巧简要介绍

「OC」探索CALayer&#xff1a;基础知识与实用技巧简要介绍 文章目录 「OC」探索CALayer&#xff1a;基础知识与实用技巧简要介绍前言认识CALayerCALayer的相关属性 UIView和CALayer区别联系创建UIView和CALayer的原因 开始创建CALayer视图层级CALayers 和 Sublayersposition与…

javaweb-flex布局

1. flex布局原理 flex是flexible Box的缩写&#xff0c;意味着"弹性布局"&#xff0c;用来为盒子模型提供最大的灵活性&#xff0c;任何一个容器都可以指定为flex布局。 当我们为父盒子设为flex布局以后&#xff0c;子元素的float、clear和vertical-align属性都将失…

【质因数分解】将正整数分解质因数

将一个正整数分解成质因数&#xff0c;例如&#xff1a;输入90&#xff0c;打印输出 902*3*3*5 使用C语言实现&#xff1a; #include<stdio.h>int main(){int n,i;printf("请输入需要分解的正整数&#xff1a; ");scanf("%d",&n);for(i2;i<…

六. 部署分类器-deploy-classification-basic

目录 前言0. 简述1. 案例运行2. 代码分析2.1 main.cpp2.2 model.cpp 3. 补充说明结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第六章—部署分类器&#xff…

Flutter-自适用高度PageView

需求 在 Flutter 中&#xff0c;PageView 是一个非常常用的组件&#xff0c;能够实现多个页面的滑动切换。然而&#xff0c;默认的 PageView 高度是固定的&#xff0c;这在展示不同高度的页面时&#xff0c;可能会导致不必要的空白或内容裁剪问题。为了使 PageView 能够根据每…