Как читать отдельные сектора / кластеры с помощью DeviceIoControl () в Windows? - PullRequest
2 голосов
/ 28 февраля 2010

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

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

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

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

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

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

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

1 Ответ

2 голосов
/ 01 марта 2010

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

...