Как читать отдельные сектора / кластеры с помощью DeviceIoControl() в Windows?
-
23-09-2019 - |
Вопрос
Я уронил свой ноутбук, когда Windows готовилась к переходу в спящий режим, и в результате у меня произошел сбой в работе жесткого диска.(Учит меня в следующий раз обзавестись жестким диском и / или ноутбуком с датчиком свободного падения.) В любом случае, запуск SpinRite для попытки восстановить данные привел к тому, что все запасные сектора на диске были полностью израсходованы для всех восстанавливаемых секторов на данный момент.SpinRite все еще работает прямо сейчас, но поскольку запасных секторов для использования больше не будет, я думаю, что это будет бесполезное упражнение, кроме как сообщить мне, где находятся все поврежденные сектора.
В любом случае, я планирую написать приложение, чтобы попытаться восстановить данные с жесткого диска.Из моих прошлых попыток дефрагментации я знаю, что могу использовать FSCTL_GET_RETRIEVAL_POINTERS для определения логических номеров кластеров для любого данного файла.
Как мне попытаться прочитать сектора для этого реального кластера?Мое копание в списке MSDN для кодов управления дисками, файлами и томографическими устройствами не вызвало у меня ничего удивительного в том, как я добираюсь до фактических данных кластера.
Должен ли я даже не утруждать себя попытками читать на таком низком уровне?Должен ли я вместо этого выполнять вызовы SetFilePointer() и ReadFile(), чтобы получить соответствующие смещения размера кластера в файле и прочитать фрагменты размером с кластер?
Если файл, который я пытаюсь прочитать, содержит поврежденный сектор, будет ли NTFS помечать весь файл как поврежденный и не позволит мне получить доступ к файлу в будущем?Если да, то как мне сказать NTFS, чтобы она не помечала файл как плохой или мертвый?(Помните, что на жестком диске теперь нет запасных секторов для переназначения.)
Должен ли я стряхнуть пыль со своих знаний * nix и выяснить , как читать из / dev / ?
Обновить:Я нашел ответ на свой собственный вопрос.:-) Решение заключается в выполнении SetFilePointer() и ReadFile() для дескриптора тома, а не для дескриптора файла.
Решение
Я нашел ответ на свой собственный вопрос.:-) Решение заключается в выполнении SetFilePointer() и ReadFile() для дескриптора тома, а не для дескриптора файла.