Вы можете проверить эту статью: - 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(
&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,
&GUID_DEVINTERFACE_USB_DISK,
dwIndex, &spdid))
break;
DWORD dwSize = 0;
SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, NULL,
0, &dwSize, NULL);
if ((dwSize != 0) && (dwSize <= sizeof(Buf)))
{
pspdidd->cbSize = sizeof(*pspdidd); // 5 Bytes!
ZeroMemory((PVOID)&spdd, sizeof(spdd));
spdd.cbSize = sizeof(spdd);
long res = SetupDiGetDeviceInterfaceDetail(
hDevInfo, &spdid, pspdidd,
dwSize, &dwSize, &spdd);
if (res)
{
HANDLE hDrive = CreateFile(pspdidd->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->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;
}
Wron g предположение. Серийные номера USB не связаны с серийными номерами дисков. Даже USB-мышь может иметь серийный номер (на практике это происходит не потому, что у мышей нет идентификатора, они все равны) – MSalters
Возможный дубликат [Получить серийный номер USB C++] (http://stackoverflow.com/questions/3096823/get-usb-serial-number-c) – MSalters
спасибо за разъяснение моего сообщения. Тем не менее мне нужно извлечь серийный номер USB-памяти, так как, исправьте меня, если я ошибаюсь, это должен быть уникальный идентификатор. Я уже проверил сообщение, которое вы предложили, действительно есть пример в C++ для среды Windows, но я не могу его скомпилировать, несмотря на то, что я использовал оконную платформу sdk – Giorgio