Вопрос пользователя заключается в необходимости получить физический размер сектора для различных типов системных дисков, работающих под управлением Windows 7 или более новой версии. В частности, пользователь столкнулся с проблемой, что функция, использующая DeviceIoControl для получения физического размера сектора, не работает с внешними устройствами, имеющими файловую систему, отличную от NTFS, например, FAT16 или exFAT. При попытке использовать данную функцию с такими устройствами возникает исключение с кодом ошибки 50, указывающее на то, что запрос не поддерживается.
Вот пример кода на Object Pascal, который пользователь использовал для получения физического размера сектора:
function GetSectorSize(Drive:Char):DWORD;
var
h: THandle;
junk: DWORD;
Query: STORAGE_PROPERTY_QUERY;
Alignment: STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR;
begin
Result := 0;
h := CreateFileW(PWideChar('\\.\' + UpperCase(Drive) + ':'), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if h = INVALID_HANDLE_VALUE then RaiseLastOSError;
try
FillChar(Query, SizeOf(Query), 0);
Query.PropertyId := StorageAccessAlignmentProperty;
Query.QueryType := PropertyStandardQuery;
if not DeviceIoControl(h, IOCTL_STORAGE_QUERY_PROPERTY, @Query, SizeOf(Query), @Alignment, SizeOf(Alignment), junk, nil) then RaiseLastOSError;
Result := Alignment.BytesPerPhysicalSector;
finally
CloseHandle(h);
end;
end;
Подтвержденный ответ
Для решения проблемы пользователя стоит обратить внимание на новые возможности, предоставленные в Windows 8 и Windows Server 2012, которые позволяют улучшить совместимость с дисками нового формата (Advanced Format, 4K). В частности, была введена новая структура FILE_FS_SECTOR_SIZE_INFORMATION, которая позволяет получить физический размер сектора для файловой системы.
Существуют несколько способов запроса информации о физическом размере сектора:
Использование функции FltQueryVolumeInformation или ZwQueryVolumeInformationFile, передавая в качестве параметра FileInformationClass значение FileFsSectorSizeInformation и указатель на структуру FILE_FS_SECTOR_SIZE_INFORMATION.
Создание IRP с основной функцией IRP_MJ_QUERY_VOLUME_INFORMATION.
Использование функции FsRtlGetSectorSizeInformation с передачей указателя на структуру FILE_FS_SECTOR_SIZE_INFORMATION.
Альтернативный ответ
Также стоит отметить, что физический размер сектора диска не зависит от файловой системы и должен быть запрошен не через обработчик тома, а через физическое устройство (\\.\PhysicalDriveX). Это позволяет получить корректные данные, не зависящие от файловой системы.
Комментарии и рекомендации
При работе с различными файловыми системами важно учитывать, что физический размер сектора может отличаться от логического.
Перед использованием новых методов убедитесь, что ваша версия Windows поддерживает их.
При запросе информации о физическом размере сектора рекомендуется использовать физический путь к устройству, а не к тому.
Заключение
Для получения физического размера сектора на различных файловых системах в среде Delphi, особенно для файловых систем, отличных от NTFS, рекомендуется использовать новые API, предоставленные в Windows 8 и выше. Обратите внимание на структуру FILE_FS_SECTOR_SIZE_INFORMATION и соответствующие методы запроса информации о томах. Учитывайте также, что запросы должны выполняться через физическое устройство, а не через обработчик тома.
Пользователь столкнулся с проблемой получения физического размера сектора для различных файловых систем в Delphi, особенно для систем, отличных от NTFS, и ищет решение, используя возможности, доступные в Windows 8 и выше.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.