В данной статье мы рассмотрим, как программно получить информацию о всех разделах дисков в Windows, не учитывая скрытые разделы. Мы будем использовать Object Pascal (Delphi) для написания примера кода.
Введение
В Windows каждая файловая система раздела диска представлена как отдельный том. Для работы с томами в Windows можно использовать функцию FindFirstVolume и FindNextVolume. Однако, эти функции не учитывают скрытые разделы, что может быть нежелательно в некоторых случаях.
Пример кода
Давайте напишем программу на Object Pascal (Delphi), которая получает информацию о всех разделах дисков в Windows, не учитывая скрытые разделы. Для этого мы будем использовать структуру PARTITION_INFORMATION и функцию DeviceIoControl для получения информации о разделах диска.
program DiskPartitions;
uses
Windows;
type
TPARTITION_INFORMATION = record
StartingOffset: _LARGE_INTEGER;
PartitionLength: _LARGE_INTEGER;
HiddenSectors: DWORD;
PartitionNumber: DWORD;
PartitionType: BYTE;
BootIndicator: BOOLEAN;
RecognizedPartition: BOOLEAN;
RewritePartition: BOOLEAN;
end;
const
IOCTL_DISK_GET_PARTITION_INFO = $0074004;
var
H: THandle;
dwBytesReturned: DWORD;
PartitionInformation: TPARTITION_INFORMATION;
i, j: Integer;
begin
for i := 0 to 99 do
begin
H := CreateFile(PChar('\.\PhysicalDrive' + IntToStr(i)), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if H <> INVALID_HANDLE_VALUE then
begin
for j := 1 to 20 do
begin
PartitionInformation.PartitionType := 0;
DeviceIoControl(H, IOCTL_DISK_GET_PARTITION_INFO, nil, 0, @PartitionInformation, SizeOf(TPARTITION_INFORMATION), dwBytesReturned, nil);
if (PartitionInformation.PartitionType not in [0, 1, 6, 7, 11, 12, 114]) or PartitionInformation.HiddenSectors <> 0 then
Continue; // Пропускаем скрытые разделы
// Здесь можно добавить код для обработки найденного раздела
end;
CloseHandle(H);
end;
end;
end.
В данном примере мы перебираем все физические диски с помощью цикла for i := 0 to 99 do. Для каждого диска мы открываем файловый дескриптор с помощью функции CreateFile и перебираем все возможные разделы с помощью цикла for j := 1 to 20 do. Для каждого раздела мы получаем информацию о типе раздела и количестве скрытых секторов с помощью функции DeviceIoControl. Если тип раздела не является известным типом файловой системы или количество скрытых секторов не равно нулю, мы пропускаем этот раздел, не учитывая его при дальнейшей обработке.
Заключение
В данной статье мы рассмотрели, как программно получить информацию о всех разделах дисков в Windows, не учитывая скрытые разделы. Мы использовали Object Pascal (Delphi) для написания примера кода, который перебирает все физические диски и получает информацию о типах разделов и количестве скрытых секторов. Это позволяет программе работать с томами дисков, не учитывая скрытые разделы.
Статья объясняет, как программно получить информацию о всех разделах дисков в Windows, не учитывая скрытые разделы, с использованием Object Pascal (Delphi) и функции DeviceIoControl.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.