• C++获取设备 PID,VID 信息


    可直接编译(设置成:使用多字节字符集)

    转来的,代码:

      1 /*
      2 http://www.experts-exchange.com/Programming/Editors_IDEs/Q_24506125.html
      3 */
      4  
      5 #include <stdio.h>
      6 #include <windows.h>
      7 #include <setupapi.h>
      8 #include <devguid.h>
      9 #include <winioctl.h>
     10 #include <regstr.h>
     11 #include <tchar.h>
     12 #include <string>
     13 using namespace std;
     14  
     15 #pragma comment(lib,"setupapi.lib")
     16  
     17 /*
     18 获取设备数
     19     路径: 如G:
     20     设备数
     21 */
     22 BOOL GetDeviceNumber(LPCTSTR pszDevPath, DWORD& dwDevNum) {
     23  
     24     BOOL bRC = FALSE;
     25  
     26     HANDLE hDrive = CreateFile(
     27         pszDevPath,
     28         0,
     29         FILE_SHARE_READ | FILE_SHARE_WRITE,
     30         NULL,
     31         OPEN_EXISTING, 
     32         NULL, 
     33         NULL
     34         );
     35  
     36     if (INVALID_HANDLE_VALUE != hDrive) {
     37  
     38         STORAGE_DEVICE_NUMBER sdn;
     39         DWORD dwBytesReturned = 0;
     40  
     41         bRC = DeviceIoControl(
     42             hDrive,
     43             IOCTL_STORAGE_GET_DEVICE_NUMBER,
     44             NULL, 
     45             0, 
     46             &sdn, 
     47             sizeof(sdn),
     48             &dwBytesReturned, 
     49             NULL
     50             );
     51  
     52  
     53         if (bRC) dwDevNum = sdn.DeviceNumber;
     54  
     55         CloseHandle(hDrive);
     56     }else printf("Error:[%d] (%s)
    ",GetLastError(),pszDevPath);
     57  
     58     return bRC;    
     59 }
     60  
     61  
     62 int GetDeviceDescription(LPCTSTR pszDrive, TCHAR* pszDesc, const size_t szDescSize)
     63 {
     64     TCHAR acDevName[MAX_PATH];
     65     //  QueryDosDevice(pszDrive,acDevName,MAX_PATH);
     66     //  printf("Test: %s
    ",acDevName);
     67     _stprintf(acDevName,"\\.\%s", pszDrive);
     68     DWORD dwNumOfInterest = -1;;
     69     GetDeviceNumber(acDevName,dwNumOfInterest);
     70     //printf("DeviceNumber:[%d]
    ",dwNumOfInterest);
     71     GUID* guid = (GUID*)&GUID_DEVINTERFACE_DISK;
     72     // Get device interface info set handle
     73     // for all devices attached to system
     74     HDEVINFO hDevInfo = SetupDiGetClassDevs(guid, NULL, NULL,
     75         DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
     76     if (hDevInfo == INVALID_HANDLE_VALUE)  {
     77         return 0;
     78     }
     79  
     80     // Retrieve a context structure for a device interface
     81     // of a device information set.
     82     DWORD dwIndex = 0;
     83     BOOL bRet = FALSE;
     84  
     85     BYTE Buf[1024];
     86     PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd =
     87         (PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf;
     88     SP_DEVICE_INTERFACE_DATA         spdid;
     89     SP_DEVINFO_DATA                  spdd;
     90     DWORD                            dwSize;
     91     spdid.cbSize = sizeof(spdid);
     92     while ( true )  {
     93         bRet = SetupDiEnumDeviceInterfaces(hDevInfo, NULL,
     94             guid, dwIndex, &spdid);
     95  
     96         if (!bRet) {
     97             break;
     98         }
     99  
    100         dwSize = 0;
    101         SetupDiGetDeviceInterfaceDetail(hDevInfo,
    102             &spdid, NULL, 0, &dwSize, NULL);
    103  
    104         if ( dwSize!=0 && dwSize<=sizeof(Buf) ) {
    105             pspdidd->cbSize = sizeof(*pspdidd); // 5 Bytes!
    106  
    107  
    108             ZeroMemory((PVOID)&spdd, sizeof(spdd));
    109             spdd.cbSize = sizeof(spdd);
    110  
    111             long res =
    112                 SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd,
    113                 dwSize, &dwSize,
    114                 &spdd);
    115  
    116             printf("Result:[%s]
    ",pspdidd->DevicePath); // <--------- here!
    117  
    118             DWORD dwType;
    119             LPTSTR buffer = NULL;
    120             DWORD buffersize = 0;
    121  
    122             while (!SetupDiGetDeviceRegistryProperty(
    123                 hDevInfo,
    124                 &spdd,
    125                 SPDRP_FRIENDLYNAME,
    126                 &dwType,
    127                 (PBYTE)buffer,
    128                 buffersize,
    129                 &buffersize))
    130             {
    131                 if (GetLastError() == 
    132                     ERROR_INSUFFICIENT_BUFFER)
    133                 {
    134                     // Change the buffer size.
    135                     if (buffer) LocalFree(buffer);
    136                     // Double the size to avoid problems on 
    137                     // W2k MBCS systems per KB 888609. 
    138                     buffer =(LPTSTR) LocalAlloc(LPTR,buffersize * 2);
    139                 }
    140                 else
    141                 {
    142                     // Insert error handling here.
    143                     break;
    144                 }
    145             }
    146  
    147             DWORD dwNum = 0;;
    148             GetDeviceNumber(pspdidd->DevicePath,dwNum);
    149             //printf("DeviceNumber:[%d]
    ",dwNum);
    150  
    151             //if (dwNumOfInterest == dwNum) _stprintf(pszDesc,_T("%s"),buffer);
    152             if (dwNumOfInterest == dwNum) _stprintf(pszDesc,_T("%s"),pspdidd->DevicePath);
    153  
    154             //printf("Result:[%s]
    ",buffer);     
    155             if (buffer) LocalFree(buffer); 
    156  
    157         }
    158         dwIndex++;
    159     }
    160     SetupDiDestroyDeviceInfoList(hDevInfo);
    161     return 0;
    162 }
    163  
    164 void main (int argc, char** argv) {
    165     TCHAR acDesc[1024] = "<unknown>";
    166     TCHAR* pszDrive;
    167     if (2 != argc) {
    168  
    169         printf("Usage: usbdev.exe <drive letter> (ex.: 'usbdev f:')
    ");
    170     }
    171     pszDrive = *(argv + 1);
    172     GetDeviceDescription(pszDrive, acDesc, 1024);
    173     _tprintf("
    Description for %s
    
    	%s
    ", pszDrive, acDesc);
    174     system("pause");
    175 }<br><br>
     
    分类: C/C++
  • 相关阅读:
    使用python3自带工具2to3.py 转换 python2.x 代码 到python3
    python2代码转换python3(2018新)
    解析搜狗词库(python)
    把搜狗输入法词库导入Google拼音输入法
    QT 窗体控件的透明度设置(三种方法)
    Telnet协议详解(远程登陆协议)
    C++游戏开发需要阅读的书籍
    explicit的作用
    C#7.0
    ES6-2
  • 原文地址:https://www.cnblogs.com/acmexyz/p/11656127.html
Copyright © 2020-2023  润新知