C# 根据USB设备VID和PID 获取设备总线已报告设备描述

总线已报告设备描述   DEVPKEY_Device_BusReportedDeviceDesc

模式 winform 语言 c#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace testusb
{
    public partial class Form1 : Form
    {
        [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        static extern IntPtr SetupDiGetClassDevs(ref Guid classGuid, string enumerator, IntPtr hwndParent, uint flags);

        [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        static extern bool SetupDiEnumDeviceInfo(IntPtr deviceInfoSet, uint memberIndex, ref SP_DEVINFO_DATA deviceInfoData);

        [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        static extern bool SetupDiGetDeviceProperty(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, ref DEVPROPKEY propertyKey, out int propertyType, IntPtr propertyBuffer, int propertyBufferSize, out int requiredSize, int flags);

        [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        static extern bool SetupDiDestroyDeviceInfoList(IntPtr deviceInfoSet);

        [StructLayout(LayoutKind.Sequential)]
        struct SP_DEVINFO_DATA
        {
            public int cbSize;
            public Guid classGuid;
            public int devInst;
            public IntPtr reserved;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct DEVPROPKEY
        {
            public Guid fmtid;
            public uint pid;
        }


        public Form1()
        {
            InitializeComponent();
        }

        //按钮事件
        private void button1_Click(object sender, EventArgs e)
        {
            // USB 设备的 Vendor ID (VID) 和 Product ID (PID)
            string vid = "0xFFFF";  //这边写你usb设备的vid
            string pid = "0x0100"; //这边写你usb设备的pid

            Guid guid = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED"); // USB 设备类的 GUID
            IntPtr deviceInfoSet = SetupDiGetClassDevs(ref guid, null, IntPtr.Zero, 0x12);

            if (deviceInfoSet.ToInt64() != -1)
            {
                SP_DEVINFO_DATA devInfoData = new SP_DEVINFO_DATA();
                devInfoData.cbSize = Marshal.SizeOf(devInfoData);

                for (uint i = 0; SetupDiEnumDeviceInfo(deviceInfoSet, i, ref devInfoData); i++)
                {
                    DEVPROPKEY propertyKey = new DEVPROPKEY();
                    propertyKey.fmtid = new Guid("540b947e-8b40-45bc-a8a2-6a0b894cbda2"); // DEVPKEY_Device_BusReportedDeviceDesc 的格式 ID
                    propertyKey.pid = 4; // DEVPKEY_Device_BusReportedDeviceDesc 的属性 ID

                    int propertyType;
                    int requiredSize;

                    // 获取设备属性值的大小
                    SetupDiGetDeviceProperty(deviceInfoSet, ref devInfoData, ref propertyKey, out propertyType, IntPtr.Zero, 0, out requiredSize, 0);

                    IntPtr propertyBuffer = Marshal.AllocHGlobal(requiredSize);
					//可以根据你自己的vid pid 来进行判断 
					//string deviceVid = GetDeviceVID(deviceInfoSet, devInfoData);  //获取vid
                    //string devicePid = GetDevicePID(deviceInfoSet, devInfoData); //获取pid 

                    if (SetupDiGetDeviceProperty(deviceInfoSet, ref devInfoData, ref propertyKey, out propertyType, propertyBuffer, requiredSize, out requiredSize, 0))
                    {
                        string propertyValue = Marshal.PtrToStringUni(propertyBuffer);
                        Console.WriteLine("Device Description: " + propertyValue);
                    }

                    Marshal.FreeHGlobal(propertyBuffer);
                }

                SetupDiDestroyDeviceInfoList(deviceInfoSet);
            }
        }
		
		
		//获取vid
        private static string GetDeviceVID(IntPtr deviceInfoSet, SP_DEVINFO_DATA devInfoData)
        {
            DEVPROPKEY devPropKey = new DEVPROPKEY();
            devPropKey.fmtid = new Guid("A45C254E-DF1C-4EFD-8020-67D146A850E0"); // DEVPKEY_Device_HardwareIds 的格式 ID
            devPropKey.pid = 3; // DEVPKEY_Device_HardwareIds 的属性 ID

            int propertyType;
            int requiredSize;

            // 获取设备属性值的大小
            SetupDiGetDeviceProperty(deviceInfoSet, ref devInfoData, ref devPropKey, out propertyType, IntPtr.Zero, 0, out requiredSize, 0);

            IntPtr propertyBuffer = Marshal.AllocHGlobal(requiredSize);

            if (SetupDiGetDeviceProperty(deviceInfoSet, ref devInfoData, ref devPropKey, out propertyType, propertyBuffer, requiredSize, out requiredSize, 0))
            {
                byte[] propertyValueBytes = new byte[requiredSize];
                Marshal.Copy(propertyBuffer, propertyValueBytes, 0, requiredSize);
                Marshal.FreeHGlobal(propertyBuffer);

                string propertyValue = System.Text.Encoding.Unicode.GetString(propertyValueBytes).Trim('\0');

                // 从属性值中提取 VID
                string[] hardwareIds = propertyValue.Split(new string[] { "\0" }, StringSplitOptions.RemoveEmptyEntries);
                foreach (string id in hardwareIds)
                {
                    if (id.StartsWith("USB\\VID_", StringComparison.InvariantCultureIgnoreCase))
                    {
                        string vid = id.Substring(8, 4); // 返回 VID 值
                        return vid;
                    }
                }
            }

            Marshal.FreeHGlobal(propertyBuffer);
            return null;
        }

        //获取pid
        private string GetDevicePID(IntPtr deviceInfoSet, SP_DEVINFO_DATA devInfoData)
        {
            DEVPROPKEY devPropKey = new DEVPROPKEY();
            devPropKey.fmtid = new Guid("A45C254E-DF1C-4EFD-8020-67D146A850E0"); // DEVPKEY_Device_HardwareIds 的格式 ID
            devPropKey.pid = 3; // DEVPKEY_Device_HardwareIds 的属性 ID

            int propertyType;
            int requiredSize;

            // 获取设备属性值的大小
            SetupDiGetDeviceProperty(deviceInfoSet, ref devInfoData, ref devPropKey, out propertyType, IntPtr.Zero, 0, out requiredSize, 0);

            IntPtr propertyBuffer = Marshal.AllocHGlobal(requiredSize);

            if (SetupDiGetDeviceProperty(deviceInfoSet, ref devInfoData, ref devPropKey, out propertyType, propertyBuffer, requiredSize, out requiredSize, 0))
            {
                string propertyValue = Marshal.PtrToStringUni(propertyBuffer);
                Marshal.FreeHGlobal(propertyBuffer);

                // 从属性值中提取 PID
                string[] hardwareIds = propertyValue.Split('&');
                foreach (string id in hardwareIds)
                {
                    if (id.StartsWith("PID_"))
                    {
                        return id.Substring(4, 4); // 返回 PID 值
                    }
                }
            }

            Marshal.FreeHGlobal(propertyBuffer);
            return null;
        }
    }
}

执行结果

电脑上的设备

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA 2023和Java的JDK详细安装教程

一、软件下载 网盘链接:IntelliJ IDEA 2023 提取码:2syx 二、详细安装教程 1.鼠标右击【JetBrains2023】压缩包(win11及以上系统需先点击“显示更多选项”)选择【解压到 JetBrains2023】;打开解压后的文件夹&#x…

银行数据仓库体系实践(15)--数据应用之巴塞尔新资本协议

巴塞尔新资本协议介绍 在银行管理中经常会听到巴3、新资本协议等专用词,那这都是指《巴塞尔资本协议》,全称《关于统一国际银行资本衡量和资本标准的协议》。新资本协议的五大目标是:促进金融体系的安全性和稳健性(保持总体资本水…

c++阶梯之auto关键字与范围for

auto关键字&#xff08;c11&#xff09; 1. auto关键字的诞生背景 随着程序的逐渐复杂&#xff0c;程序代码中用到的类型也越来越复杂。譬如&#xff1a; 类型难以拼写&#xff1b;含义不明确容易出错。 比如下面一段代码&#xff1a; #include <string> #include &…

(学习日记)2024.02.01:引用变量 / 默认实参 / 一元作用域运算符 / 函数重载

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

踩坑STM32CubeMX生成Makefile工程无法使用printf(“%f“)

过去一年偶有接触STM32开发时都是使用STM32CubeMX生成Makefile的工程&#xff0c;具体开发环境见配置Clion用于STM32开发&#xff08;Makefile&#xff09;&#xff0c;但没想到今天在使用printf打印输出浮点数时无法正常输出&#xff0c;不仅printf无法使用&#xff0c;其他涉…

MongoDB从入门到实战之MongoDB快速入门

前言 上一章节主要概述了MongoDB的优劣势、应用场景和发展史。这一章节将快速的概述一下MongoDB的基本概念&#xff0c;带领大家快速入门MongoDB这个文档型的NoSQL数据库。 MongoDB从入门到实战的相关教程 MongoDB从入门到实战之MongoDB简介&#x1f449; MongoDB从入门到实战…

白皮书发布,石油石化数字孪生加速

近日&#xff0c;《数字石化 孪生智造——石油石化数字孪生白皮书》发布。白皮书聚焦石油石化行业发展机遇&#xff0c;剖析数字孪生技术在行业中的案例实践与应用场景&#xff0c;展望石油石化企业未来孪生发展新态势。 当前&#xff0c;国家大力推动减污降碳协同增效&#x…

【IM】长连接网关设计探索(一)

目录 1.长连接网关的必要性2. 设计目标2.1 技术挑战2.2 技术目标 3. 方案选型3.1 网关IP地址的选择3.1.1 使用httpDNS服务3.1.2 自建http server作为IP config server3.1.3 最佳方案 3.2 高并发收发设计3.2.1 C10K问题3.2.2 方案探索双协程监听channel实现全双工 一个定时器 1…

Unity学习之Unity核心(一)2D相关

文章目录 1. 前言2 图片导入概述3 图片设置的六大部分3.1 纹理类型3.1.1 Default3.1.2 Normal Map 法线贴图格式3.1.3 Editor GUI and Legacy GUI3.1.4 Sprite3.1.5 Cursor 自定义光标3.1.6 Cookie 光源剪影格式3.1.7 LightMap光照贴图格式3.1.8 Single Channel 纹理只需要单通…

【新书推荐】5.1节 16位汇编语言学习环境

第五章 16位汇编学习环境 16位汇编语言的学习环境是建立在8086计算机的基础上的&#xff0c;我将借助于DosBox虚拟机来实现16位汇编语言学习环境的搭建。 5.1节 16位汇编语言学习环境 本节内容&#xff1a;16位汇编学习环境的搭建。 ■汇编语言程序设计编程调试过程&#xff1…

Vulnhub billu b0x

0x01 环境搭建 1. 从官方下载靶机环境&#xff0c;解压到本地&#xff0c;双击OVF文件直接导入到vmware虚拟机里面。2. 将虚拟机的网络适配器调成NAT模式&#xff0c;然后开机即可进行操作了。 0x02 主机发现 nmap -sn 192.168.2.0/24 成功获取靶机IP为192.168.2.129。 0x0…

sqli.labs靶场(23关到28a关)

23、第二十三关 id1单引号闭合 找位置1 and 12 union select 1,2,3 爆库&#xff1a;1 and 12 union select 1,2,database() 爆表名&#xff1a;1 and 12 union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity 爆字段&#…

【大数据】Flink SQL 语法篇(二):WITH、SELECT WHERE、SELECT DISTINCT

Flink SQL 语法篇&#xff08;二&#xff09; 1.WITH 子句2.SELECT & WHERE 子句3.SELECT DISTINCT 子句 1.WITH 子句 应用场景&#xff08;支持 Batch / Streaming&#xff09;&#xff1a;With 语句和离线 Hive SQL With 语句一样的&#xff0c;语法糖 1&#xff0c;使用…

谷歌seo搜索引擎优化需要做什么?

当你要做谷歌seo&#xff0c;经手一个你之前没有接触过的网站&#xff0c;你首先要做的就是分析网站当前的流量数据&#xff0c;如果是新站自然不需要这一步&#xff0c;不过数据分析依旧是件很重要的事情&#xff0c;做seo不懂得分析数据相当于白做 再来就是你要了解网站所在的…

卸载Ubuntu双系统

卸载Ubuntu双系统 我们卸载Ubuntu双系统&#xff0c;可能出于以下原因&#xff1a; 1、Ubuntu系统内核损坏无法正常进入 2、Ubuntu系统分配空间不足&#xff0c;直接扩区较为复杂 3、以后不再使用Ubuntu&#xff0c;清理留出空间 123无论出于哪种原因&#xff0c;我们都是要…

柔性电流探头方向判断有哪些方法?干货分享!

柔性电流探头方向判断的方法干货分享&#xff01;从理论到实践&#xff0c;助您成为专业人士&#xff01;干货收藏&#xff0c;快看起来吧&#xff01;      柔性电流探头方向判断一直是电力行业测试中的关键问题之一&#xff0c;确切地判断电流方向对于测试电力系统的稳定…

【GitHub项目推荐--一个由OpenAI提供支持的聊天机器人和虚拟助手的构建平台】【转载】

Botpress Botpress是一个开源项目&#xff0c;它提供了一个平台&#xff0c;用于构建、部署和管理基于人工智能的聊天机器人和虚拟助手 github地址&#xff1a; https://github.com/botpress/botpress Botpress的介绍 Botpress是一个开源项目&#xff0c;它提供了一个平台&…

ROS2 Humble学习笔记 (2)

本文发表于个人的github pages。因csdn本身显示插件和转载过程中导致显示不太友好。建议大家阅读原文。想查看完整内容&#xff0c;请移步到ROS2 Humble学习笔记2。 本文篇幅较长&#xff0c;可抽空按照章节阅读。本文只作为对入门教程的一种浮现和提升。 一、前言 在上一篇…

Spring框架——主流框架

文章目录 Spring(轻量级容器框架)Spring 学习的核心内容-一图胜千言IOC 控制反转 的开发模式Spring快速入门Spring容器剖析手动开发- 简单的 Spring 基于 XML 配置的程序课堂练习 Spring 管理 Bean-IOCSpring 配置/管理 bean 介绍Bean 管理包括两方面: Bean 配置方式基于 xml 文…

2023年上-未来几年我要做什么

1月份&#xff0c;离职。 2月份&#xff0c;春节休假回来&#xff0c;中旬去参加了一个月的瑜伽培训&#xff0c;学会了倒立、鹤蝉。。。。 3月份&#xff0c;瑜伽培训结束&#xff0c;开始收拾房子&#xff0c;并调研各类项目。 4月份&#xff0c;参与了朋友的区块链项目 …