这个也是从某位大师那里直接转来的。。。。对我太有用了,,感激涕零!!!

因为工作需要,要写一个读取U盘PID,VID信息的程序,在网上找了很久都没有发现有相关的资料.相关的工作也搁置了很久,真是亏对公司^_^

还好终于让我慢慢揣摩出来一点端倪,在这分享一下.其实用DDK会比较容易得到.但是DDK编译设置又比较麻烦,而且我是要用BCB开发,所以也先不往那方面发展了.现在就开始讲讲.

1.获取U盘盘符.

这个比较简单,首先列举一下系统的磁盘.如果属性是DRIVE_REMOVABLE那么就是可移动磁盘.排除软盘,那么剩下的就是U盘咯.

int __fastcall C_BA580_PATH::GetUsbDevice(AnsiString* strUsbDriverName)
{
        char lpBuffer[MAX_DRIVER_STRING_LENGHT];
        char*lpSingleDevice;

DWORD nBufferLength = MAX_DRIVER_STRING_LENGHT;
        DWORD dwSignleDeviceBufferIndex =0, dwDeviceNum =0;

lpSingleDevice  = (char*)malloc(sizeof(char)* MAX_DRIVER_STRING_LENGHT);
        if(lpSingleDevice == NULL)
        {
                ShowMessage("系统分配内存错误");
                return 0;
        }
        memset(lpSingleDevice,0x0,MAX_DRIVER_STRING_LENGHT);
        memset(lpBuffer,0x0,MAX_DRIVER_STRING_LENGHT);

nBufferLength = GetLogicalDriveStrings(nBufferLength,lpBuffer); //列举盘符

for(DWORD i =0; i< nBufferLength; i++)
        {
                if(lpBuffer[i] != 0x00)       //分离各个离盘符
                {
                        lpSingleDevice[dwSignleDeviceBufferIndex] = lpBuffer[i];
                        dwSignleDeviceBufferIndex++;
                        continue;
                }
                lpSingleDevice[dwSignleDeviceBufferIndex]  = 0x0;
                dwSignleDeviceBufferIndex = 0;
                if(*lpSingleDevice == 'A')  //A盘 不需要
                        continue;
                if(GetDriveType(lpSingleDevice) == DRIVE_REMOVABLE)   //获取移动磁盘
                {
                        strUsbDriverName[dwDeviceNum] = lpSingleDevice ;
                        dwDeviceNum++;
                }

}
        free(lpSingleDevice);
        return dwDeviceNum;
}

2.获取PID,UID,序列号信息

int CUSBPortDlg::GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
{
    HDEVINFO hDevInfoSet;    //设备信息集句柄;
    SP_DEVICE_INTERFACE_DATA ifdata;
    PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
    int nCount;
    BOOL bResult;
 LPGUID UsbClassGuid;
 CHANGER_PRODUCT_DATA ProductBuffer;
 unsigned long BytesReturned;
 
 UsbClassGuid = (LPGUID)malloc(sizeof(GUID));
 UsbClassGuid->Data1 = 0xa5dcbf10L;
 UsbClassGuid->Data2 = 0x6530;
 UsbClassGuid->Data3 = 0x11d2;
 UsbClassGuid->Data4[0] = 0x90;
 UsbClassGuid->Data4[1] = 0x1F;
 UsbClassGuid->Data4[2] = 0x00;
 UsbClassGuid->Data4[3] = 0xC0;
 UsbClassGuid->Data4[4] = 0x4F;
 UsbClassGuid->Data4[5] = 0xB9;
 UsbClassGuid->Data4[6] = 0x51;
 UsbClassGuid->Data4[7] = 0xED;

// 取得一个该GUID相关的设备信息集句柄
    hDevInfoSet = SetupDiGetClassDevs(UsbClassGuid,     // 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,            // 不需额外的设备描述
            UsbClassGuid,          // 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;
}

pDetail->DevicePath 将是一串像"//?/usb#vid_0537&pid_a703#192b0c00048a#{a5dcbf10-6530-11d2-901f-00c04fb951ed}"的字符串,看到没有VID=0537,PID=A703,serial=192b0c00048a

所以分离这串字符串就可以得到你想要的信息了.至于要与盘符相对应上的PID VID我还没有找到在SDK实现的方法

读取U盘 PID,VID,SN等信息相关推荐

  1. 硬盘 U盘 的SN 号码 javascript 读取 PID,VID,SN信息

    读取当前系统的  硬盘 U盘 的SN 号码 C# 读取 System.Management.ManagementObjectSearcher cmicWmi = new ManagementObjec ...

  2. 使用国密函数读取金税盘信息-Delphi 版

    一.开发环境及工具 上一篇文章,我们使用C++ 实现了航天版国密算法模块获取金税盘信息,请参阅 上期文章. 本文将使用 Delphi 来实现,所示代码环境:Windows10  x64专业版(1904 ...

  3. Ubuntu下如何获取usb相机的PID/VID并打开指定的相机

    项目需求控制和打开两个USB摄像头,并且根据相机的PID和VID来打开指定的相机,来区分主副相机,在Windows下可以通过AForge.Video.DirectShow库来实现,但是Ubuntu下没 ...

  4. linux c 通过 pid 获取 进程相关信息 cmdline

    linux系统命令ps和top都是通过读取/proc/$PID 目录下的信息获取进程的相关信息, 它遍历/proc目录下的首字符为数字的目录,获取系统进程的信息. 我们经常会把pid写到/var/ru ...

  5. ios13可以读取u盘吗

    随着ios13系统的发布,很多iphone用户也随着升级了系统,那么在ios13系统上新增了很多实用的功能,有很多人想知道ios13可以读取u盘吗?ios13怎么连接U盘呢?下面就为大家带来一份ios ...

  6. java获取U盘盘符与SN绑定

    这是一个使用了Java语言编写的检测U盘的程序.界面搭建使用swing,能将获取的U盘信息动态的显示.当然,关键的是将获取的U盘SN号与盘符对应.不过程序只能支持增加的盘符,也就是插入的U盘只能增加, ...

  7. python批量提取word指定内容_使用python批量读取word文档并整理关键信息到excel表格的实例...

    目标 最近实验室里成立了一个计算机兴趣小组 倡议大家多把自己解决问题的经验记录并分享 就像在CSDN写博客一样 虽然刚刚起步 但考虑到后面此类经验记录的资料会越来越多 所以一开始就要做好模板设计(如下 ...

  8. 在ASP.NET AJAX中使用应用程序服务和本地化(4):示例程序:读取、修改并保存用户个性化信息...

    本文来自<ASP.NET AJAX程序设计 第II卷:客户端Microsoft AJAX Library相关>的第五章<应用程序服务和本地化>. 让我们通过编写一个完整的示例程 ...

  9. python图片读取优化_python读取raw binary图片并提取统计信息的实例

    用python语言读取二进制图片文件,并提取非零数据统计信息(例如:max,min,skewness and kurtosis) python新手,注释较少,欢迎指教 import struct im ...

最新文章

  1. 科研赢家比其他人多了哪一个特点?
  2. 7年前去搞数据科学、放弃天文学,现在我后悔了
  3. TRzCheckTree的使用
  4. vue-cli打包构建时常见的报错解决方案
  5. Codeforces 758C. Unfair Poll
  6. 一个权限的设置,你会混淆么
  7. python3 多线程_Python3多线程爬虫实例讲解
  8. java面试-Java并发编程(六)——线程间的通信
  9. OpenCV读图、展示和保存新图
  10. 《iOS 6高级开发手册(第4版)》——1.8节使用加速度移动屏幕上的对象
  11. 编程语言python入门-【python】编程语言入门经典100例--19
  12. 谭浩强 C程序设计 8.2 求方程 的根,用三个函数分别求当b^2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。...
  13. jquery 弹出层
  14. C语言实例第7期:实现投票统计功能
  15. css滚动条设置图标,更改滚动条上下箭头图标
  16. 风变编程课后习题答案
  17. signature=290c6e3366bfb08cc93085d7fdf78281,AMC Entertainment Inc
  18. 网络爬虫js逆向解决网站登录RSA加密问题,不使用selenium如何实现登录,session维持登录状态请求爬取
  19. Semantic UI 之 标签 label
  20. AI对项目管理的影响

热门文章

  1. 【PS实例】照片拼图的制作
  2. 最新ONE兔V3.0版/婚恋/交友/社交APP三端源码
  3. static 控件设置成透明后无法正常更新数据_win10又发布10月更新,提升视频体验,解决闪屏和打印问题...
  4. 【关于Endnotes】
  5. 深入 WEP和 WPA密码原理 1
  6. LEP(Linux Easy Profiling)2017年度颁奖典礼在西邮隆重举行
  7. PowerMockito 简介
  8. 维小帮景区导航系统:不止是导航,更是营销获客的流量密码
  9. 脑科学研究中基于图论的复杂脑网络分析方法
  10. 企业如何通过企业微信玩转社群营销?