Запись и чтение с свободного места на диске с помощью Windows API - PullRequest
7 голосов
/ 05 июня 2019

Можно ли записывать в свободные кластеры на диске или считывать данные с них с помощью Windows API?Я обнаружил, что Defrag API: https://docs.microsoft.com/en-gb/windows/desktop/FileIO/defragmenting-files

FSCTL_GET_VOLUME_BITMAP можно использовать для получения состояния выделения каждого кластера, FSCTL_MOVE_FILE можно использовать для перемещения кластеров.Но я не смог найти способ чтения данных из свободных кластеров или записи в них данных.

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

Я пытаюсь сделать что-то вроде прозрачного кэша, поэтому пользователь может по-прежнему использовать свой раздел NTFS как обычно и по-прежнему видеть эти кластеры как свободное пространство, ноЯ мог бы хранить в них некоторые данные.Безопасность данных не имеет значения, она может быть перезаписана действиями пользователя и будет просто восстановлена ​​/ перезагружена позже, когда кластеры снова станут свободными.

Ответы [ 2 ]

4 голосов
/ 07 июня 2019

Нет простого решения на этом пути.

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

Вы можете выполнить тот же трюк и с физическим диском.

Документы

1 голос
/ 12 июня 2019

Одним из способов может быть открытие тома напрямую с использованием CreateFile с указанием пути UNC тома в качестве аргумента имени файла (например, \\.\C:). Теперь вы можете напрямую читать и писать на томе.

Таким образом, вы можете достичь желаемой цели с помощью:

  • получить размер кластера в байтах с GetDiskFreeSpace
  • получить карту свободных кластеров с DeviceIoControl и FSCTL_GET_VOLUME_BITMAP
  • открыть том с помощью CreateFile с UNC-путем \\.\F:
    (внимательно изучите документацию, особенно раздел «Замечания» об открытии дисков и томов)
  • поиск смещения свободного кластера (clusterindex * clusterByteSize) с помощью SetFilePointer
  • записать / прочитать ваши данные с WriteFile / ReadFile на ручке, полученной выше CreateFile
    (Также обратите внимание, что доступ для чтения / записи должен быть выровнен по секторам, в противном случае вызовы ReadFile / WriteFile завершатся неудачно)

Обратите внимание:

это только отправная точка для ваших собственных исследований. Это не пуленепробиваемый рецепт приготовления.
Сделайте резервную копию ваших данных перед тем, как связываться с файловой системой !!!

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

...