Получить список разделов на Windows - PullRequest
9 голосов
/ 28 октября 2010

Цель

Я портирую файловую систему на Windows и пишу более похожий на Windows интерфейс для исполняемого файла mounter.Часть этого процесса позволяет пользователю найти раздел и выбрать букву диска.В конечном итоге выбор раздела должен привести к тому, что я могу открыть, используя CreateFile(), open(), fopen() или аналогичный.

Leads

Windows, кажется, вращается вокруг концепции томов, которые не похожи на диски и встречаются только для уже смонтированных файловых систем.

Многообещающие выводы, которые у меня были:

Однако все они заканчиваются томами или их смещениямиа не дескриптор стиля раздела /dev/sda1, который мне нужен.

Этот вопрос задан после очень похожей вещи, я считал награду, пока не заметил, что ОП - после физическогоимена дисков, а не разделов. Этот ответ содержит метод для подбора имен разделов с применением силы, я бы хотел этого избежать (или посмотрите документацию, содержащую границы возможных путей).

Вопрос

I*: 1040 *

  • Правильная терминология и документация для размонтированных разделов в Windows.
  • Эффективный и документированный метод для надежного извлечения всех доступных разделов.
  • Ближайшее соответствиек абстракции файла раздела, доступной в Linux, где все операции ввода-вывода привязаны к соответствующей области диска для открытого раздела.

Update0

Пока основная цель все еще открываетсяПохоже, что для необработанных разделов решение может заключаться в том, чтобы сначала получить дескриптор каждого диска, а затем использовать его для получения каждого раздела.Необходимо перечислить все дисководы (даже те, на которых уже не смонтированы тома).

Ответы [ 4 ]

4 голосов
/ 28 октября 2010

Как вы заметили, вы можете использовать IOCTL_DISK_GET_DRIVE_LAYOUT_EX , чтобы получить список разделов.

Хороший обзор связанных понятий здесь . Интересно, для вас недостающее звено

Определение типа диска

Нет определенной функции для программно определить тип диск определенный файл или каталог расположен на. Есть косвенный способ.

Сначала позвоните GetVolumePathName. Затем, позвоните CreateFile, чтобы открыть том используя путь. Далее используйте IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS с ручкой громкости, чтобы получить номер диска и использовать номер диска для построить путь к диску, например, "\? \ PhysicalDriveX". Наконец, используйте IOCTL_DISK_GET_DRIVE_LAYOUT_EX до получить список разделов и проверить PartitionType для каждой записи в список разделов.

Полный список кодов управления диском может иметь больше полезного. Если честно, я не уверен, как имя раздела Unix отображается на Windows, может быть, это просто не напрямую.

3 голосов
/ 28 октября 2010

Если вы можете представить себе переход из безопасного убежища пользовательского пространства и Windows API (win32) к кодированию драйвера устройства с помощью NTTDK, вы можете попробовать IoReadPartitionTableEx или какой-либо другой диск низкого уровня функция.

1 голос
/ 26 мая 2013

Чтобы быть тупым, лучший способ надежно получить все смонтированные / размонтированные разделы диска - это самостоятельно проанализировать mbr / gpt.

Сначала проясним некоторые вещи: диски содержат разделы, а разделы объединяются для создания томов.Поэтому у вас может быть один том, состоящий из двух разделов на двух разных дисках.

IOCTL_DISK_GET_DRIVE_LAYOUT_EX - самое близкое решение, которое вы получите, не делая его вручную.Проблема в том, что он использует окна, которые могут неправильно анализировать MBR, потому что бог знает, по какой причине.Моя текущая рабочая теория заключается в том, что если Windows была установлена ​​через EFI, но загружается через MBR, вы увидите проблему такого рода.Windows удается сойти с рук, потому что большинство менеджеров разделов копируют важную информацию о разделах в MBR вместе с GPT.Но это означает, что вы не получите важную информацию, такую ​​как UUID раздела (который хранится только в GPT).

Все остальные решения включают получение информации о томе, которая полностью отличается от информации о разделе.

Примечание: идентификатор тома будет обычно иметь форму \\.\Volume{PARTITION_UUID}.Случаи, когда это не будет выполнено: если диск разделен с MBR, а не GPT (MBR не имеет UUID раздела, поэтому Windows создает его), если у вас есть рейд-диск, или если у вас есть том, состоящий изнесколько дисков (вроде как рейд).Это как раз те случаи, которые приходят мне в голову, не приставайте ко мне.

0 голосов
/ 28 октября 2010

Я думаю, вы немного ошибаетесь на ранней стадии. Например, вы, кажется, предполагаете, что «монтирование» работает в Windows так же, как и в Unix. Это немного по-другому.

Давайте начнем с самого привычного конца. Пути типа C:\ используют буквы дисков. В настоящее время это, по сути, просто набор символических ссылок (в Windows они более формально известны как «соединения»). Существует базовый набор для всех пользователей, и каждый пользователь может добавлять своих. Даже если для тома нет буквы диска, все равно будет имя тома , например \\?\Volume{4c1b02c1-d990-11dc-99ae-806e6f6e6963}\. Вы можете использовать это имя тома в звонках на CreateFile() и т. Д. Я не уверен, что fopen() любит их.

Функция QueryDosDevice даст вам имя устройства Windows для буквы диска или имени тома. Имя устройства выглядит как «\ Device \ HarddiskVolume1», но вы не можете передать его на CreateFile

Microsoft имеет пример кода для перечисления всех разделов.

В Windows, как и в Linux, вы можете открыть сам раздел, как если бы это был файл. Это довольно хорошо задокументировано под CreateFile.

...