Получение всех разделов, принадлежащих физическому диску

Рейтинг: 1Ответов: 1Опубликовано: 10.05.2023

в общем и целом хочу понять каким образом(с помощью каких функций или методов) я могу получить имена всех разделов диска. Если подключен диск(не к обязательно к плате, может быть через ЮСБ или ридер), условно toshiba 123456, разделён на разделы(примонтированные): D, E, F, G, можно ли зная devicepath или instanceID или имея дискриптор данного устройства, получить данные имена дисков и если можно то как? GetLogicalDrives возвращает маску всех разделов системы, поэтому к сожалению им в моей ситуации вопрос не решается, разделы необходимо получить только от конкретного диска. Если будет подключено сразу несколько носителей и в каждом по несколько разделов, то при выборе определённого носителя, необходимо получить разделы которые на нём есть, как это выглядит(условно) в диск менеджере(диск разбитый на разделы). Либо может есть способ исходя из имени раздела, узнать его "родителя", такой вариант всё равно поможет. Задача решается на ОС Windows. Благодарю за ваше время.

Ответы

▲ 2Принят

Нашлась вот такая (не моя) программка, похоже, это то, что вам нужно — по букве говорит, кому он принадлежит.

#include <windows.h>
#include <iostream>

int main() {
    DWORD drives = GetLogicalDrives(); // Получаем битовую маску всех доступных дисков

    for (char drive = 'A'; drive <= 'Z'; ++drive) {
        if (drives & 1) { // Проверяем, доступен ли диск
            std::string drivePath = "\\\\.\\" + std::string(1, drive) + ":"; // Формируем путь к диску

            HANDLE hDevice = CreateFileA(drivePath.c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
            if (hDevice != INVALID_HANDLE_VALUE) {
                DWORD bytesReturned;
                STORAGE_DEVICE_NUMBER deviceNumber;
                if (DeviceIoControl(hDevice, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &deviceNumber, sizeof(deviceNumber), &bytesReturned, NULL)) {
                    std::cout << "Диск " << drive << ": имеет раздел номер " << deviceNumber.PartitionNumber << std::endl;
                }
                else {
                    std::cout << "Не удалось получить информацию о разделе на диске " << drive << ":" << std::endl;
                }

                CloseHandle(hDevice);
            }
        }

        drives >>= 1; // Сдвигаем битовую маску для следующего диска
    }

    return 0;
}