根据GUID获取设备信息

#include <windows.h>  
#include <setupapi.h>  
#include <objbase.h>  
#include <initguid.h>  
#include <stdio.h>
 
DEFINE_GUID(GUID_DEVINTERFACE_CDROM, 0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
#define CdRomClassGuid GUID_DEVINTERFACE_CDROM

//DEFINE_GUID(DiskClassGuid,               0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
//DEFINE_GUID(CdRomClassGuid,              0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
//DEFINE_GUID(PartitionClassGuid,          0x53f5630aL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
//DEFINE_GUID(TapeClassGuid,               0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
//DEFINE_GUID(WriteOnceDiskClassGuid,      0x53f5630cL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
//DEFINE_GUID(VolumeClassGuid,             0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
//DEFINE_GUID(MediumChangerClassGuid,      0x53f56310L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
//DEFINE_GUID(FloppyClassGuid,             0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
//DEFINE_GUID(CdChangerClassGuid,          0x53f56312L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
//DEFINE_GUID(StoragePortClassGuid,        0x2accfe60L, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
     
#define INTERFACE_DETAIL_SIZE   (1024)  
#define MAX_DEVICE      (16)     
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;     
}  
      
int main(int argc, char **argv)  
{  
    char *path[10] = {NULL};  
    int i, count;
    GUID cdrom = CdRomClassGuid;

    for (i=0; i<10; i++)  
    {  
        path[i] = (char*)malloc(256);  
    }  
    count = GetDevicePath(&cdrom, path);  
    for (i=0; i<count; i++)  
    {  
        printf("%s/n", path[i]);  
    }  
    printf("HDD Count: %d/n", count);  
    return TRUE;  
}  
原文地址:https://www.cnblogs.com/liubaocheng999/p/3573764.html