根据GUID获得设备路径(转载)

2023-10-28


// 根据GUID获得设备路径

#include <initguid.h>
#include <setupapi.h>

#pragma comment(lib,"setupapi.lib")

// SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大
#define INTERFACE_DETAIL_SIZE 1024


const GUID DiskClassGuid = {0x53f56307L, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b}};

// 根据GUID获得设备路径
// lpGuid: GUID指针
// pszDevicePath: 设备路径指针的指针
// 返回: 成功得到的设备路径个数,可能不止1个
int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
{
    HDEVINFO hDevInfoSet;
    SP_DEVICE_INTERFACE_DATA ifdata;
    PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
    int nCount;
    BOOL bResult;
 
    // 取得一个该GUID相关的设备信息集句柄
    hDevInfoSet = ::SetupDiGetClassDevs(lpGuid,     // class GUID
        NULL,                    // 无关键字
        NULL,                    // 不指定父窗口句柄
        DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);    // 目前存在的设备
 
    // 失败...
    if (hDevInfoSet == INVALID_HANDLE_VALUE)
    {
        return 0;
    }
 
    // 申请设备接口数据空间
    pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);
 
    pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
 
    nCount = 0;
    bResult = TRUE;
 
    // 设备序号=0,1,2... 逐一测试设备接口,到失败为止
    while (bResult)
    {
        ifdata.cbSize = sizeof(ifdata);
  
        // 枚举符合该GUID的设备接口
        bResult = ::SetupDiEnumDeviceInterfaces(
            hDevInfoSet,     // 设备信息集句柄
            NULL,            // 不需额外的设备描述
            lpGuid,          // GUID
            (ULONG)nCount,   // 设备信息集里的设备序号
            &ifdata);        // 设备接口信息
  
        if (bResult)
        {
            // 取得该设备接口的细节(设备路径)
            bResult = SetupDiGetInterfaceDeviceDetail(
                hDevInfoSet,    // 设备信息集句柄
                &ifdata,        // 设备接口信息
                pDetail,        // 设备接口细节(设备路径)
                INTERFACE_DETAIL_SIZE,    // 输出缓冲区大小
                NULL,           // 不需计算输出缓冲区大小(直接用设定值)
                NULL);          // 不需额外的设备描述
   
            if (bResult)
            {
                // 复制设备路径到输出缓冲区
                ::strcpy(pszDevicePath[nCount], pDetail->DevicePath);
    
                // 调整计数值
                nCount++;
            }
        }
    }
 
    // 释放设备接口数据空间
    ::GlobalFree(pDetail);
 
    // 关闭设备信息集句柄
    ::SetupDiDestroyDeviceInfoList(hDevInfoSet);
 
    return nCount;
}


/*

//调用GetDevicePath函数时要注意,pszDevicePath是个指向字符串指针的指针,例如可以这样

int i;
    char* szDevicePath[MAX_DEVICE];        // 设备路径
 
    // 分配需要的空间
    for (i = 0; i < MAX_DEVICE; i++)
    {
        szDevicePath[i] = new char[256];
    }
 
    // 取设备路径
    nDevice = ::GetDevicePath((LPGUID)&DiskClassGuid, szDevicePath);
 
    // 逐一获取设备信息
    for (i = 0; i < nDevice; i++)
    {
        // 打开设备
        hDevice = ::OpenDevice(szDevicePath[i]);
 
        if (hDevice != INVALID_HANDLE_VALUE)
        {
            ... ...        // I/O操作
 
            ::CloseHandle(hDevice);
        }
    }
 
    // 释放空间
    for (i = 0; i & lt; MAX_DEVICE; i++)
    {
        delete []szDevicePath[i];
    }
//本例的Project中除了要包含winioctl.h外,还要包含initguid.h,setupapi.h,以及连接setupapi.lib。
//Q 得到设备路径后,就可以到下一步,用CreateFile打开设备,然后用DeviceIoControl

 

 int MAX_DEVICE = 2;
 int i;
    char* szDevicePath[8];        // 设备路径
 
    // 分配需要的空间
    for (i = 0; i < MAX_DEVICE; i++)
    {
        szDevicePath[i] = new char[256];
  ZeroMemory(szDevicePath[i],256);
    }
 
    // 取设备路径
    int nDevice = ::GetDevicePath((LPGUID)&DiskClassGuid, szDevicePath);

 for (i = 0; i < MAX_DEVICE; i++)
    {
        MessageBox(szDevicePath[i]);
    }
 for (i = 0; i < MAX_DEVICE; i++)
    {
        delete []szDevicePath[i];
    }

*/

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

根据GUID获得设备路径(转载) 的相关文章

随机推荐

  • 【转载】windows和wls文件互通

    windows和wls文件互通 wsl访问windows文件 https www jianshu com p d332e05adb6f windows访问wsl文件 https blog csdn net Caoyang He articl
  • Android 之 WebView (网页视图)基本用法

    本节引言 本节给大家带来的是Android中的一个用于显示网页的控件 WebView 网页视图 现在Android应用 层开发的方向有两种 客户端开发和HTML5移动端开发 所谓的HTML5端就是 HTML5 CSS JS来构建 一个网页版
  • TCPIP技术实验大作业:基于TCP/IP的程序开发技术综述及应用实践

    一 基于TCP IP的程序开发技术综述 1 1TCP IP协议族简介 TCP IP也被称作传输控制协议 网际协议 作为网络互连的核心协议 受到广泛的应用 该协议类型作为开放性的标准应用在各种计算机中 在一定程度上保证系统间通信的正常运行 在
  • mysql replication环境检查脚本

    author skate time 2013 05 13 mysql replication环境检查脚本 此脚本部署在slave端 可以通过短信或邮件监控slave的mysqld健康 replication环境健康 及复制延迟 脚本 mys
  • monorepo 下的 package tsc 构建

    很多个package都需要构建到每个项目的 lib 下 可以用 vscode 的 tasks json 任务去实现 具体 tasks json 的详情请看官网 https code visualstudio com docs editor
  • JavaScript中字符串的大小写转换(轮子,直接cv即可)

    此文件为js文件 封装模块按需导出即可 str 需要首字母转换的字符串 全部大写 export const all2Large str gt const arr str split let newStr 通过数组的forEach方法来遍历数
  • 解决Ubuntu下 anaconda 与ros opencv冲突的问题

    解决Ubuntu下 anaconda 与ros opencv冲突的问题 问题描述 解决办法之一 问题描述 在Ubuntu16 04上先后安装了Anaconda和ROS 然后在anaconda配置的pytorch环境中运行python代码 在
  • 【毕设】基于CycleGAN的风格迁移【一】环境搭建及运行代码

    源代码地址 CycleGAN源码 因为该篇内容包含Anaconda的环境管理及包的管理 可以选择参考 Anaconda安装 环境管理 包管理 实际演练例子 全网最详细 MrRoose1的博客 CSDN博客 一 搭配环境 1 首先把代码包下载
  • 递归、回溯-图的m着色问题

    1 问题描述 给定无向连通图G V E 和m种不同的颜色 用这些颜色为图G的各顶点着色 每个顶点着一种颜色 是否有一种着色法使G中每条边的2个顶点着不同颜色 这个问题是图的m可着色判定问题 输入 图的顶点的个数 颜色种类树m 输出顶点a与顶
  • C

    我们想定义一个全局变量 能够在多个文件中使用 举例说明比如说三个文件main c hello c hello h 想在main c和hello c中使用一个名字为a的变量 可能大家会简单地想直接在hello h里面定义一个变量unsigne
  • 网站渗透测试 越来越难渗透

    福利 网络安全重磅福利 入门 进阶全套282G学习资源包免费分享 最先 对于大家提出的难题 网站愈来愈难渗透 表明如今的安全防护技术性及其网站结构技术性的成熟情况是越来越健全了 次之 某一实际技术性方面的安全要求减少了 不可以整体表明渗透测
  • 分页组件的使用-jqPaginator

    工作中用到了分页 在github上面用到了一款分页组件 是叫jqPaginator 参考网站是 http jqpaginator keenwon com a3 上面可以下载 以及介绍怎么使用 贴出我使用的例子的代码 html div cla
  • 2020最新大厂高频微服务面试总结:Spring-Cloud+Spring-Boot+Dubbo(面试题+笔记+项目实战)

    话不多说 直接上题 SpringCloud面试题 什么是 Spring Cloud 使用 Spring Cloud 有什么优势 服务注册和发现是什么意思 Spring Cloud 如何实现 Spring Cloud 和dubbo区别 Spr
  • Linux MySQL 常见无法启动或启动异常的解决方案

    Linux MySQL 常见无法启动或启动异常的解决方案 在 Linux 上自建 MySQL 服务器 经常遇到各种无法启动或启动后异常的问题 本文列举一些常见问题的解决办法 注意 以下错误日志提示 都是查看 MySQL 错误日志得到 查看方
  • 深度理解volatile关键字

    Volatile java中可以把字段声明为volatile的 比如 public class AtomicInteger extends Number implements java io Serializable volatile变量
  • 华为OD机试 Python 【整数数组中同时出现的整数】

    描述 你有两组整数 你的任务是找出哪些整数在这两组中都出现了 如果找到了这样的整数 还需要注意它们分别在两组里出现了几次 取其中较小的那个次数为其 共同出现次数 要求如下 先按 共同出现次数 分类整数 再按这个次数从小到大输出 如果某个 共
  • 国产开源中文大语言模型再添重磅玩家:清华大学NLP实验室发布100亿参数规模的开源可商用大语言模型CPM-Bee

    5月27日 OpenBMB发布了一个最高有100亿参数规模的开源大语言模型CPM BEE OpenBMB是清华大学NLP实验室联合智源研究院成立的一个开源组织 该模型针对高质量中文数据集做了训练优化 支持中英文 根据官方的测试结果 其英文测
  • C++:计算Fibonacci数列的前30项并动态分配、用指针实现两数交换、买鸡问题、求圆的方法。

    任务一 编写一个C 风格的程序 用动态分配空间的方法计算Fibonacci数列的前30项 并将结果存储到动态分配的空间中 任务二 编写一个C 风格的程序 自定义一个函数 要求实现输入两个整数 让他们交换两个数的位置后输出 要求写一个自定义函
  • 关于Apple支付productID类型验证分析

    Apple中的productID类型包括 消耗型项目 非消耗型项目 自动续期订阅 非自动续期订阅项目 消耗型项目的验证 1 客户端发起Apple支付玩家完成付款 2 客户端收到Apple返回的票据信息 并对票据信息进行遍历发送到服务端做验证
  • 根据GUID获得设备路径(转载)

    根据GUID获得设备路径 include