USB应用层开发
+ -

windows通过GUID枚举系统中所有USB设备并且显示该设备的所有属性信息

2021-11-18 22 0

微信群里有同学问怎么获取USB设备的位置信息,这个学名叫做SPDRP_LOCATION_PATHS,刚好自己以前写过这个代码,就分享了一下。
代码如下:

#include<windows.h>
#include <winioctl.h>
#include <setupapi.h>
#include <initguid.h>
#include <stdio.h>
#include<hidsdi.h>
#include<tchar.h>
#pragma comment(lib,"Setupapi.lib ")
#pragma comment(lib,"hid.lib ")

BOOL USBEnumDevice(OUT PTCHAR pDeviceName, IN LPGUID pGuid, IN int instance)
{
    HDEVINFO info = SetupDiGetClassDevs((GUID*)pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
    if (info == INVALID_HANDLE_VALUE)
    {
        printf("No HDEVINFO available for this GUID\n");
        return FALSE;
    }
    // Get interface data for the requested instance
    SP_INTERFACE_DEVICE_DATA ifdata;
    ifdata.cbSize = sizeof(ifdata);
    if (!SetupDiEnumDeviceInterfaces(info, NULL, (GUID*)pGuid, instance, &ifdata))
    {
        _tprintf(TEXT("No SP_INTERFACE_DEVICE_DATA available for this GUID instance\n"));
        SetupDiDestroyDeviceInfoList(info);
        return FALSE;
    }
    // Get size of symbolic link name
    DWORD ReqLen;
    SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &ReqLen, NULL);
    PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new TCHAR[ReqLen]);
    if (ifDetail == NULL)
    {
        SetupDiDestroyDeviceInfoList(info);
        return FALSE;
    }
    // Get symbolic link name
    ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
    if (!SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL, NULL))
    {
        SetupDiDestroyDeviceInfoList(info);
        delete[] ifDetail;
        return FALSE;
    }
    //printf("Symbolic link is %s\n", ifDetail->DevicePath);
    memcpy(pDeviceName, ifDetail->DevicePath, _tcslen(ifDetail->DevicePath) * sizeof(TCHAR));
    pDeviceName[_tcslen(ifDetail->DevicePath)] = TEXT('\0');
    delete[] ifDetail;
    SetupDiDestroyDeviceInfoList(info);
    return TRUE;
}

#define TO_SEARCH_DEVICE_UUID L"{A5DCBF10-6530-11D2-901F-00C04FB951ED}"

int main()
{
    //GUID hidGuid;
    //::HidD_GetHidGuid((LPGUID)&hidGuid);

    GUID AGuid;
    CLSIDFromString(TO_SEARCH_DEVICE_UUID, &AGuid);

    HDEVINFO hDevInfo = SetupDiGetClassDevs(&AGuid, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
    if (hDevInfo == INVALID_HANDLE_VALUE)
    {
        return 0;
    }

    SP_DEVINFO_DATA DeviceInfoData;
    for (int iIndex = 0;; iIndex++)
    {
        DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
        if (!SetupDiEnumDeviceInfo(hDevInfo, iIndex, &DeviceInfoData))
        {
            break;
        }

        char szHardWareID[512] = { 0 };
        if (!SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID,
            NULL, (PBYTE)szHardWareID, sizeof(szHardWareID), NULL))
        {
            continue;
        }
        {
            printf("%s\r\n",  szHardWareID);
        }


#define SHOW_PRO(X) \
        { \
          if (SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DeviceInfoData, X,NULL, (PBYTE)szHardWareID, sizeof(szHardWareID), NULL))\
          {\
              printf(#X ":%s\r\n", szHardWareID);\
          }\
        }

            SHOW_PRO(SPDRP_DEVICEDESC);
            SHOW_PRO(SPDRP_HARDWAREID);
            SHOW_PRO(SPDRP_COMPATIBLEIDS);
            SHOW_PRO(SPDRP_UNUSED0);
            SHOW_PRO(SPDRP_SERVICE);
            SHOW_PRO(SPDRP_UNUSED1);
            SHOW_PRO(SPDRP_UNUSED2);
            SHOW_PRO(SPDRP_CLASS);
            SHOW_PRO(SPDRP_CLASSGUID);
            SHOW_PRO(SPDRP_DRIVER);
            SHOW_PRO(SPDRP_CONFIGFLAGS);
            SHOW_PRO(SPDRP_MFG);
            SHOW_PRO(SPDRP_FRIENDLYNAME);
            SHOW_PRO(SPDRP_LOCATION_INFORMATION);
            SHOW_PRO(SPDRP_PHYSICAL_DEVICE_OBJECT_NAME);
            SHOW_PRO(SPDRP_CAPABILITIES);
            SHOW_PRO(SPDRP_UI_NUMBER);
            SHOW_PRO(SPDRP_UPPERFILTERS);
            SHOW_PRO(SPDRP_LOWERFILTERS);
            SHOW_PRO(SPDRP_BUSTYPEGUID);
            SHOW_PRO(SPDRP_LEGACYBUSTYPE);
            SHOW_PRO(SPDRP_BUSNUMBER);
            SHOW_PRO(SPDRP_ENUMERATOR_NAME);
            SHOW_PRO(SPDRP_SECURITY);
            SHOW_PRO(SPDRP_SECURITY_SDS);
            SHOW_PRO(SPDRP_DEVTYPE);
            SHOW_PRO(SPDRP_EXCLUSIVE);
            SHOW_PRO(SPDRP_CHARACTERISTICS);
            SHOW_PRO(SPDRP_ADDRESS);
            SHOW_PRO(SPDRP_UI_NUMBER_DESC_FORMAT);
            SHOW_PRO(SPDRP_DEVICE_POWER_DATA);
            SHOW_PRO(SPDRP_REMOVAL_POLICY);
            SHOW_PRO(SPDRP_REMOVAL_POLICY_HW_DEFAULT);
            SHOW_PRO(SPDRP_REMOVAL_POLICY_OVERRIDE);
            SHOW_PRO(SPDRP_INSTALL_STATE);
            SHOW_PRO(SPDRP_LOCATION_PATHS);
            SHOW_PRO(SPDRP_BASE_CONTAINERID);
    }

    getchar();
    printf("pk");
    return 0;
}

这样系统中就打印出了所有关于USB设备的信息。关于GUID的信息可见:http://www.pnpon.com/article/detail-146.html

如这里我显示一个UVC摄像头的信息:

USB\VID_0C45&PID_636D&REV_0100&MI_00
SPDRP_DEVICEDESC:USB 视频设备
SPDRP_HARDWAREID:USB\VID_0C45&PID_636D&REV_0100&MI_00
SPDRP_COMPATIBLEIDS:USB\Class_0e&SubClass_03&Prot_00
SPDRP_SERVICE:usbvideo
SPDRP_CLASS:Camera
SPDRP_CLASSGUID:{ca3e7ab9-b4c3-4ae6-8251-579ef933890f}
SPDRP_DRIVER:{ca3e7ab9-b4c3-4ae6-8251-579ef933890f}\0005
SPDRP_CONFIGFLAGS:
SPDRP_MFG:Microsoft
SPDRP_FRIENDLYNAME:USB Camera
SPDRP_LOCATION_INFORMATION:0000.0014.0000.002.000.000.000.000.000
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME:\Device\000002bf
SPDRP_CAPABILITIES:?
SPDRP_LOWERFILTERS:WdmCompanionFilter
SPDRP_BUSTYPEGUID:茧}漖妊灤
SPDRP_LEGACYBUSTYPE:
SPDRP_BUSNUMBER:
SPDRP_ENUMERATOR_NAME:USB
SPDRP_ADDRESS:
SPDRP_DEVICE_POWER_DATA:8
SPDRP_REMOVAL_POLICY:
SPDRP_REMOVAL_POLICY_HW_DEFAULT:
SPDRP_INSTALL_STATE:
SPDRP_LOCATION_PATHS:PCIROOT(0)#PCI(1400)#USBROOT(0)#USB(2)#USBMI(0)
SPDRP_BASE_CONTAINERID:{

当然,这里会出现一些乱码,是因为我把所有信息都当字符串输出了,对某些项有兴趣的同学可以自行根据类型来进行格式化输出。

0 篇笔记 写笔记

DirectShow摄像头格式UUID-GUID大全
使用DirectShow开发Windows摄像头Capture时,对于每一种支持的格式,都有一个与之对应的UUID.现将各UUID总结整理如下:(后续持续更新)// 73646976-0000-0010-8000-00AA00389B71 'vids' == MEDIATYPE_V......
UVC摄像头驱动装调试总结
前几天发表了一篇文章 UVC PTZ和扩展单元的过滤与分发调试笔记,原文见: http://www.usbzh.com/article/detail-517.html ,本来想着应该没啥问题了,可没想到上周五在实际测试过程中,还是出现了问题:经过长时间的UVC摄像头工作,突然驱动显示了大量数据包错误......
使用SetupApi函数通过GUID枚举系统中所有关联设备
Windows的设备在驱动中大部分都会IoSetRegisterInterface,这其中一个重要的参数是GUID,这样系统会根据这个GUID给设备创建一个symbolicname,这个名字在应用层可以通过CreateFile打开。这里分享一个在应用层通过SetuApi枚举该类型GUID下的所有设备......
使用WinUSB读写USB设备
Windows为WinUSB设备提供了API,主要通过以下几个步骤访问设备。通过扩展描述符中的GUID查看接口的路径用接口的路径作为参数,调用CreateFile打开接口使用WinUsb_Initialize得到WinUSB句柄通过WinUsb_WritePipe和WinUsb_ReadPipe对......
windows通过GUID枚举系统中所有USB设备并且显示该设备的所有属性信息
微信群里有同学问怎么获取USB设备的位置信息,这个学名叫做SPDRP_LOCATION_PATHS,刚好自己以前写过这个代码,就分享了一下。代码如下:#include#include #include
作者信息
USB中文网
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!