Как в 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.


Ответы (0 шт):