Для тех, кто может столкнуться с этим в будущих поисках, вот что я в конце концов придумал.Обратите внимание, что есть несколько неопределенных типов, которые являются частью внешних библиотек или определены мной, а не частью Windows.например, nowide
и qDebug
Комментарии, по меньшей мере, плохие , но перекрестные ссылки на документацию MSDN для вызовов функций должны помочь вам в этом.Цель состояла в том, чтобы перечислить каждый список на каждом диске и получить требуемую информацию, чтобы позволить мне получить HANDLE
для устройства И заполнить информацию о Plug and Play (описание / имя устройства).
typedef struct _DISK_DRIVE_INFORMATION
{
std::string Path;
std::string FriendlyName;
} DISK_DRIVE_INFORMATION;
unsigned i;
DWORD dwSize, dwPropertyRegDataType = SPDRP_PHYSICAL_DEVICE_OBJECT_NAME;
CONFIGRET r;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
SP_DEVICE_INTERFACE_DATA interfaceData;
TCHAR szDeviceInstanceID [MAX_DEVICE_ID_LEN];
TCHAR szDesc[1024];
GUID HddClass;
HddClass = GUID_DEVINTERFACE_DISK;//GUID_DEVCLASS_DISKDRIVE;
// List all connected disk drives
hDevInfo = SetupDiGetClassDevs (&HddClass, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE)
return;
// Find the ones that are driverless
for (i = 0; ; i++)
{
DeviceInfoData.cbSize = sizeof (DeviceInfoData);
// Get the next device info
if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData))
break;
interfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);
// Get the next device interface
if (!SetupDiEnumInterfaceDevice(hDevInfo, NULL, &HddClass, i, &interfaceData))
{
break;
}
// Get the device ID
r = CM_Get_Device_ID(DeviceInfoData.DevInst, szDeviceInstanceID , MAX_PATH, 0);
if (r != CR_SUCCESS)
continue;
// To add to the vector
DISK_DRIVE_INFORMATION AddToVector;
DWORD requiredSize = 0;
// Get the path
SetupDiGetDeviceInterfaceDetail(hDevInfo, &interfaceData, NULL, NULL, &requiredSize, NULL);
SP_INTERFACE_DEVICE_DETAIL_DATA* data = (SP_INTERFACE_DEVICE_DETAIL_DATA*) malloc(requiredSize);
data->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &interfaceData, data, requiredSize, NULL, NULL))
{
continue;
}
AddToVector.Path = nowide::convert(std::wstring(data->DevicePath));
qDebug("Disk path: %s", AddToVector.Path.c_str());
// Friendly name (e.g. SanDisk Cruzer USB...)
SetupDiGetDeviceRegistryProperty (hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME,
&dwPropertyRegDataType, (BYTE*)szDesc,
sizeof(szDesc), // The size, in bytes
&dwSize);
AddToVector.FriendlyName = nowide::convert(std::wstring((TCHAR*)szDesc));
qDebug("Friendly name: %s", AddToVector.FriendlyName.c_str());
OutVector.push_back(AddToVector);
delete data;
}