Как в Qt 5.12 msvc2017 примонтировать все разделы флешки/диска
Хочу понять как примонтировать или назначить литеру на все разделы флэшки/диска (если их несколько), пробую сделать следующим образом:
QString getFirstAvailableDriveLetter()
{
DWORD drives = GetLogicalDrives();
for (char drive = 'D'; drive <= 'Z'; ++drive)
{
QString drivePath = QString(drive) + ":\\";
if ((drives & 1))
{
return QString(drive);
}
drives >>= 1;
}
return QString();
}
void deviceitem::mountvolume()
{
std::vector<std::wstring> volumeNames;
HANDLE hDevice = CreateFileW(
devovj["path"].toString().toStdWString().c_str(),
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
nullptr,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
nullptr
);
if (hDevice != INVALID_HANDLE_VALUE)
{
DWORD bytesReturned;
VOLUME_DISK_EXTENTS diskExtents;
if (DeviceIoControl(
hDevice,
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
nullptr,
0,
&diskExtents,
sizeof(diskExtents),
&bytesReturned,
nullptr
))
{
for (DWORD i = 0; i < diskExtents.NumberOfDiskExtents; ++i)
{
std::wstring volumeName = L"\\\\.\\";
volumeName += L"PhysicalDrive" + std::to_wstring(diskExtents.Extents[i].DiskNumber);
wchar_t volumePath[MAX_PATH];
QString driveLitter = getFirstAvailableDriveLetter() + ":";
BOOL result = DefineDosDeviceW(0, driveLitter.toStdWString().c_str(), volumeName.c_str());
DWORD error = GetLastError();
SetVolumeMountPointW((driveLitter.toStdWString()+ L"\\").c_str(), (volumeName + L"\\").c_str());
error = GetLastError();
}
}
CloseHandle(hDevice);
}
}
DefineDosDeviceW пробовал использовать с флагом DDD_RAW_TARGET_PATH, она и с ним и без него выполняется успешно, но ничего не происходит.
SetVolumeMountPointW пробовал использовать и с путём к разделу «\?\Volume{ GUID }\» и именем диска, всегда получаю ошибки 87 или 123.