Russian Qt Forum

Программирование => Общий => Тема начата: Serr500 от Февраль 15, 2012, 16:01



Название: WinAPI, физические и логические диски.
Отправлено: Serr500 от Февраль 15, 2012, 16:01
Требуется перечислить в системе все физические диски и выстроить логические по принадлежности к физическим. В итоге должна получиться следующая табличка:
Код:
HardDisk0
    Volume0 (C:)
    Volume1 (D:)
HardDisk1
    Volume0 (E:)
Можно использовать только функции WinAPI. Подскажите, пожалуйста, как можно это реализовать?


Название: Re: WinAPI, физические и логические диски.
Отправлено: neversleep от Февраль 15, 2012, 19:41
Вот сделал набросок. (проверял только с 1 хардом и флешкой, вроде бы всё правильно)
Код:
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <winioctl.h>

using namespace std;

#define BUFSIZE 1024

int main()
{
    DWORD drives = GetLogicalDrives();
    TCHAR path[] = {'\\', '\\', '.', '\\', 0, ':', 0};
    PVOLUME_DISK_EXTENTS volume = (PVOLUME_DISK_EXTENTS)new char[BUFSIZE];
    DWORD size;
    HANDLE hFile;

    for (char c = 0; c < 26; c++) {
        if (drives & (1 << c)) {
            path[4] = c + 0x61;

            hFile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0);
            if (hFile != INVALID_HANDLE_VALUE) {
                DeviceIoControl(hFile, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, 0, 0, volume, BUFSIZE, &size, 0);
                CloseHandle(hFile);

                if (size > 0) {
                    for (DWORD n = 0; n < volume->NumberOfDiskExtents; n++)
                        printf(TEXT("HardDisk%u: %s\n"), volume->Extents[n].DiskNumber, path);
                }
            }
        }
    }
    delete []volume;
}


Название: Re: WinAPI, физические и логические диски.
Отправлено: Serr500 от Февраль 16, 2012, 21:41
Спасибо. Почти то что надо. Нужную мне задачу решает. Однако, без прав администратора на Win7 CreateFile возвращает на всех хардах INVALID_HANDLE_VALUE. (С флешками, как ни странно, работает нормально.) Если запустить с правами, всё отлично. Данный вариант не очень подходит, поскольку работать с админскими правами программе совершенно не нужно. Нет ли варианта, где права админа не требуются?


Название: Re: WinAPI, физические и логические диски.
Отправлено: Пантер от Февраль 17, 2012, 09:33
Замени GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE на 0 и должно заработать от обычного пользователя.


Название: Re: WinAPI, физические и логические диски.
Отправлено: Serr500 от Февраль 17, 2012, 20:26
Вау!!! Спасибо огромное!!! То что надо!!!  :D :D :D


Название: Re: WinAPI, физические и логические диски.
Отправлено: bixbit от Февраль 19, 2012, 02:12
Интересует тот же вопрос.
Но мне нужно сформировать табличку в несколько ином виде.
Сначала нужно найти устройства \ \ \ \. \ \ PhysicalDrive. Потом найти на каждом логические разделы. Все разделы должны быть расположены в порядке смещение от начала диска.
 
Код:
Harddisk0
            Partition1 (\ Device \ HarddiskVolume1) D:
            Partition2 (\ Device \ HarddiskVolume2) C:
Насколько я понял нужно как-то с помощью Harddisk \ Partition узнать метку раздела