2013-08-12 2 views
0

Мне нужно будет получить серийный номер с моей USB-памяти, а именно серийный номер жесткого диска, который назначает производитель. По этой причине я не могу использовать GetVolumeInformation(), как это было предложено в некоторых других потоках. Я должен был бы иметь «уникальный» номерИзвлечь серийный номер из памяти USB (среда Windows C++)

Прошу вас, если вы можете поделиться пример в C++ и среды Windows (Visual C++)

спасибо!

+0

Wron g предположение. Серийные номера USB не связаны с серийными номерами дисков. Даже USB-мышь может иметь серийный номер (на практике это происходит не потому, что у мышей нет идентификатора, они все равны) – MSalters

+1

Возможный дубликат [Получить серийный номер USB C++] (http://stackoverflow.com/questions/3096823/get-usb-serial-number-c) – MSalters

+0

спасибо за разъяснение моего сообщения. Тем не менее мне нужно извлечь серийный номер USB-памяти, так как, исправьте меня, если я ошибаюсь, это должен быть уникальный идентификатор. Я уже проверил сообщение, которое вы предложили, действительно есть пример в C++ для среды Windows, но я не могу его скомпилировать, несмотря на то, что я использовал оконную платформу sdk – Giorgio

ответ

2

Вы можете проверить эту статью: - http://oroboro.com/usb-serial-number/

#include <WinIOCtl.h> 
#include <api/usbioctl.h> 
#include <Setupapi.h> 

DEFINE_GUID(GUID_DEVINTERFACE_USB_DISK, 
      0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 
      0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); 

void getDeviceInfo(int vol) 
{ 
    UsbDeviceInfo info; 

    // get the device handle 
    char devicePath[7] = "\\\\.\\@:"; 
    devicePath[4] = (char)(vol + 'A'); 

    HANDLE deviceHandle = CreateFile(devicePath, 0, 
            FILE_SHARE_READ | 
            FILE_SHARE_WRITE, NULL, 
            OPEN_EXISTING, 0, NULL); 
    if (deviceHandle == INVALID_HANDLE_VALUE) 
     return; 

    // to get the device number 
    DWORD volumeDeviceNumber = getDeviceNumber(deviceHandle); 
    CloseHandle(deviceHandle); 

    // Get device interface info set handle 
    // for all devices attached to the system 
    HDEVINFO hDevInfo = SetupDiGetClassDevs( 
     &amp;GUID_DEVINTERFACE_USB_DISK, NULL, NULL, 
     DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); 

    if (hDevInfo == INVALID_HANDLE_VALUE) 
     return; 

    // Get a context structure for the device interface 
    // of a device information set. 
    BYTE Buf[1024]; 
    PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd = 
     (PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf; 
    SP_DEVICE_INTERFACE_DATA   spdid; 
    SP_DEVINFO_DATA     spdd; 

    spdid.cbSize = sizeof(spdid); 

    DWORD dwIndex = 0; 
    while (true) 
    { 
     if (! SetupDiEnumDeviceInterfaces(hDevInfo, NULL, 
              &amp;GUID_DEVINTERFACE_USB_DISK, 
              dwIndex, &amp;spdid)) 
     break; 

     DWORD dwSize = 0; 
     SetupDiGetDeviceInterfaceDetail(hDevInfo, &amp;spdid, NULL, 
             0, &amp;dwSize, NULL); 

     if ((dwSize != 0) &amp;&amp; (dwSize &lt;= sizeof(Buf))) 
     { 
     pspdidd->cbSize = sizeof(*pspdidd); // 5 Bytes! 

     ZeroMemory((PVOID)&amp;spdd, sizeof(spdd)); 
     spdd.cbSize = sizeof(spdd); 

     long res = SetupDiGetDeviceInterfaceDetail( 
      hDevInfo, &amp;spdid, pspdidd, 
      dwSize, &amp;dwSize, &amp;spdd); 
     if (res) 
     { 
      HANDLE hDrive = CreateFile(pspdidd-&gt;DevicePath,0, 
             FILE_SHARE_READ | FILE_SHARE_WRITE, 
             NULL, OPEN_EXISTING, 0, NULL); 
      if (hDrive != INVALID_HANDLE_VALUE) 
      { 
       DWORD usbDeviceNumber = getDeviceNumber(hDrive); 

       if (usbDeviceNumber == volumeDeviceNumber) 
       { 
        fprintf("%s", pspdidd-&gt;DevicePath); 
       } 
      } 
      CloseHandle(hDrive); 
     } 
     } 
     dwIndex++; 
    } 

    SetupDiDestroyDeviceInfoList(hDevInfo); 
    return; 
} 

Вы получаете номер устройства, вызвав DeviceIOControl() с ручкой на устройство:

DWORD getDeviceNumber(HANDLE deviceHandle) 
{ 
    STORAGE_DEVICE_NUMBER sdn; 
    sdn.DeviceNumber = -1; 
    DWORD dwBytesReturned = 0; 
    if (!DeviceIoControl(deviceHandle, 
          IOCTL_STORAGE_GET_DEVICE_NUMBER, 
          NULL, 0, &sdn, sizeof(sdn), 
          &dwBytesReturned, NULL)) 
    { 
     // handle error - like a bad handle. 
     return U32_MAX; 
    } 
    return sdn.DeviceNumber; 
} 

Следующая здесь является способ узнать, если объем - это съемный носитель (например, как USB-диск или диск FireWire):

bool isRemovableMedia(s32 vol) 
{ 
    char rootPath[5] = "@:\\"; 
    rootPath[0] = (char)(vol + 'A'); 

    char szDosDeviceName[MAX_PATH]; 
    char dosDevicePath[3] = "@:"; 

    // get the drive type 
    UINT DriveType = GetDriveType(rootPath); 

    if (DriveType != DRIVE_REMOVABLE) 
     return false; 

    dosDevicePath[0] = (char)(vol + 'A'); 
    QueryDosDevice(dosDevicePath, szDosDeviceName, MAX_PATH); 

    if (strstr(szDosDeviceName,"\\Floppy") != NULL) 
    { 
     // its a floppy 
     return false; 
    } 

    return true; 
} 
+0

На самом деле нужно включить достаточно в ответ, что он останется полезным, когда эта ссылка замирает ... –

+0

спасибо. Действительно, я попытался использовать пример, который мог найти с помощью http://oroboro.com/usb-serial-number/, но я не могу его скомпилировать, несмотря на то, что я использовал правильные библиотеки. – Giorgio

Смежные вопросы