Russian Qt Forum
Ноябрь 23, 2024, 10:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: WinAPI, физические и логические диски.  (Прочитано 7242 раз)
Serr500
Гость
« : Февраль 15, 2012, 16:01 »

Требуется перечислить в системе все физические диски и выстроить логические по принадлежности к физическим. В итоге должна получиться следующая табличка:
Код:
HardDisk0
    Volume0 (C:)
    Volume1 (D:)
HardDisk1
    Volume0 (E:)
Можно использовать только функции WinAPI. Подскажите, пожалуйста, как можно это реализовать?
Записан
neversleep
Гость
« Ответ #1 : Февраль 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;
}
« Последнее редактирование: Февраль 15, 2012, 19:52 от neversleep » Записан
Serr500
Гость
« Ответ #2 : Февраль 16, 2012, 21:41 »

Спасибо. Почти то что надо. Нужную мне задачу решает. Однако, без прав администратора на Win7 CreateFile возвращает на всех хардах INVALID_HANDLE_VALUE. (С флешками, как ни странно, работает нормально.) Если запустить с правами, всё отлично. Данный вариант не очень подходит, поскольку работать с админскими правами программе совершенно не нужно. Нет ли варианта, где права админа не требуются?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Февраль 17, 2012, 09:33 »

Замени GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE на 0 и должно заработать от обычного пользователя.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Serr500
Гость
« Ответ #4 : Февраль 17, 2012, 20:26 »

Вау!!! Спасибо огромное!!! То что надо!!!  Веселый Веселый Веселый
Записан
bixbit
Гость
« Ответ #5 : Февраль 19, 2012, 02:12 »

Интересует тот же вопрос.
Но мне нужно сформировать табличку в несколько ином виде.
Сначала нужно найти устройства \ \ \ \. \ \ PhysicalDrive. Потом найти на каждом логические разделы. Все разделы должны быть расположены в порядке смещение от начала диска.
 
Код:
Harddisk0
            Partition1 (\ Device \ HarddiskVolume1) D:
            Partition2 (\ Device \ HarddiskVolume2) C:
Насколько я понял нужно как-то с помощью Harddisk \ Partition узнать метку раздела
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.