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