Эта информация доступна через Defrag API. Сторонние инструменты дефрагментации могут раскрыть его. В последних системах Windows (8.1 работает, 7 не проверено) вы можете использовать fsutil
для запроса:
C: \> файл fsutil queryextents example.txt VCN: 0x0 Кластеры: 0x2 LCN: 0x18f85e
Существует также другая подкоманда, которая выводит всю информацию для всех потоков данных в файле:
C: \> том fsutil filelayout example.exe ********* Файл 0x01390000000008dd ********* Ссылочный номер файла: 0x01390000000008dd Атрибуты файла: 0x00000020: Архив ... Поток: :: $ FILE_NAME Атрибуты: 0x00000000: * НЕТ * Флаги: 0x0000000c: Резидент | Кластеры не выделены Размер: 80 Выделенный размер: 80 Поток: :: $ DATA (основной поток данных) Атрибуты: 0x00000000: * НЕТ * Флаги: 0x00000000: * НЕТ * Размер: 1681920 Выделенный размер: 1683456 Экстенты: 1 Экстенты : 1: VCN: 0 Кластеры: 411 LCN: 8527618
В выходных данных обеих команд для каждого «экстента» (непрерывного диапазона кластеров) вы получаете «номер виртуального кластера» (смещение от начала файла), количество кластеров в экстенте и «номер логического кластера» ( смещение от начала тома).
Примечание. Крошечные файлы, которые помещаются в базовую запись MFT, сохраняются («резидентные») в своей записи MFT и будут иметь нулевые экстенты. Для этого вам нужно использовать другие способы, чтобы копаться в самом MFT. (Кроме того, в некоторых случаях файл может быть разреженным и иметь только небольшую часть, выделенную на диске; остальная часть считается пустыми байтами.)
Кластеры находятся на уровне файловой системы, поэтому вам необходимо преобразовать их в сектора уровня устройства; моя система имеет 8 секторов на кластер:
C: \> fsutil fsinfo ntfsinfo c: ... Байт на сектор: 512 Байт на кластер: 4096 ... C: \> set / a 0x18f85e * (4096/512) 13091568 C: \> set / a 0x18f85e * 4096 6702882816
Это означает, что вы можете открыть \\.\C:
с помощью HxD или другого, и найти начало файла в секторе 13091568 (или байт 6702882816).