Как читать отдельные сектора / кластеры с помощью DeviceIoControl() в Windows?

StackOverflow https://stackoverflow.com/questions/2350181

Вопрос

Я уронил свой ноутбук, когда Windows готовилась к переходу в спящий режим, и в результате у меня произошел сбой в работе жесткого диска.(Учит меня в следующий раз обзавестись жестким диском и / или ноутбуком с датчиком свободного падения.) В любом случае, запуск SpinRite для попытки восстановить данные привел к тому, что все запасные сектора на диске были полностью израсходованы для всех восстанавливаемых секторов на данный момент.SpinRite все еще работает прямо сейчас, но поскольку запасных секторов для использования больше не будет, я думаю, что это будет бесполезное упражнение, кроме как сообщить мне, где находятся все поврежденные сектора.

В любом случае, я планирую написать приложение, чтобы попытаться восстановить данные с жесткого диска.Из моих прошлых попыток дефрагментации я знаю, что могу использовать FSCTL_GET_RETRIEVAL_POINTERS для определения логических номеров кластеров для любого данного файла.

Как мне попытаться прочитать сектора для этого реального кластера?Мое копание в списке MSDN для кодов управления дисками, файлами и томографическими устройствами не вызвало у меня ничего удивительного в том, как я добираюсь до фактических данных кластера.

Должен ли я даже не утруждать себя попытками читать на таком низком уровне?Должен ли я вместо этого выполнять вызовы SetFilePointer() и ReadFile(), чтобы получить соответствующие смещения размера кластера в файле и прочитать фрагменты размером с кластер?

Если файл, который я пытаюсь прочитать, содержит поврежденный сектор, будет ли NTFS помечать весь файл как поврежденный и не позволит мне получить доступ к файлу в будущем?Если да, то как мне сказать NTFS, чтобы она не помечала файл как плохой или мертвый?(Помните, что на жестком диске теперь нет запасных секторов для переназначения.)

Должен ли я стряхнуть пыль со своих знаний * nix и выяснить , как читать из / dev / ?

Обновить:Я нашел ответ на свой собственный вопрос.:-) Решение заключается в выполнении SetFilePointer() и ReadFile() для дескриптора тома, а не для дескриптора файла.

Это было полезно?

Решение

Я нашел ответ на свой собственный вопрос.:-) Решение заключается в выполнении SetFilePointer() и ReadFile() для дескриптора тома, а не для дескриптора файла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top