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