Прочитал интересную статью про то, как с флешки был восстановлен крипто-контейнер, поврежденный chkdsk’ом. Для восстановления были использованы весьма оригинальные идеи. Был проделан огромный объем работы. Это было реально сложно. С разрешения Andrey Sporaw публикую статью здесь, выражаю автору свое уважение и снимаю шляпу 🙂
Стоит начать с того, что эти четыре месяца выдались «жаркими» на события:
- в январе-феврале сдохли два винчестера у моего друга (с разницей в 1-2 дня),
- в феврале «побился» мой RAID,
- и chkdsk’ом был убит volume на 8 GB (кстати, практически полностью аналогично описываемым далее событиям),
- после этого сдох винчестер у моей девушки (он помирал медленно, планомерно — были признаки, поэтому к его смерти удалось более-менее приготовиться, хотя все равно «потрахаться» пришлось),
- в прошлую субботу у меня «подгорела» очень некстати видеокарта…
Ну а в эту субботу… chkdsk убил мой крипто-контейнер на флэшке. Произошло это при достаточно простых обстоятельствах. Создавал каталоги на незашифрованной части флэшки, потом удалял. Заметил, что удаление не работает. Посмотрел security attributes — не помогло. Вспомнил, что такие проблемы с удалением часто возникают из-за проблем файловой системе (флэшка отформатирована, конечно, под NTFS).
Как раз в эту субботу собирался делать бэкап. Ну это как обычно, в лучших традициях. Если умирать — так в день бэкапа. Для запускания chkdsk пришлось контейнер размонтировать. Итог…
Забегая вперед — статистика.
Использованные приложения:
Disk Tools: WinHEX, R-Studio, Runtime DiskExplorer
Compilers: Microsoft Visual Studio v2003, Virtual Pascal (к сожалению, этот продукт уже «мертв»)
Editors: HIEW, FAR
- MD5-сравнивальщик образов (про него чуть позже отдельно)
- $MFT-анализатор (входит в NTFS-парсер)
- Генератор flat-отчетов по $MFT
- Удалятель используемых блоков (Used Blocks Eraser)
Это было реально сложно. Затраченное время:
- 3.5 часа вечера субботы,
- 3 часа в ночь с субботы на воскресенье,
- 9 часов воскресенья,
- 5 часов в ночь с воскресенья на понедельник,
- 2 часа в понедельник,
- 6 часов в ночь с понедельника на вторник,
- 10 часов во вторник,
- 6 часов в ночь со вторника на среду.
Итого: 44.5 часов, или 1.85 суток, или 5.6 рабочих дней по 8 часов (реально в днях: вечер субботы — начало среды)
Возвращаясь к произошедшему.
Так отработал chkdsk:
The type of the file system is NTFS.
Volume label is FLASH4GB.CHKDSK is verifying files (stage 1 of 3). [. ]CHKDSK is verifying indexes (stage 2 of 3).
Deleting index entry $ObjId in index $I30 of file 11.
Deleting index entry $Quota in index $I30 of file 11.
Deleting index entry $Reparse in index $I30 of file 11.
10 percent complete. (514 of 150319 index entries processed)
[. ] 83 percent complete. (136542 of 150319 index entries processed)
Deleting index entry SomeDirectory in index $I30 of file 151.
Все. Каталога с контейнером нет. Ну ладно, каталога нет, а файл-то на диске должен быть. Запускаю R-Studio, захожу в «предшествующий» каталог (родительский для каталога контейнера). Пусто. Делаю полный скан volume’а — пусто. Знаете что это означает? То, что никаких упоминаний о файле контейнера в $MFT больше нет. И по сути файла больше логически не существует (физически это не так).
Срочным образом запускаю WinHEX и делаю полный образ всей флэшки (как PhysicalDisk, не только Volume).
Все, на этом флэшку можно вытаскивать, в текущем виде она больше не понадобиться. Есть образ, с которым можно работать.
Первые же отзывы, которые я получил (крайне обнадеживающие): «Нет записей в $MFT? Ты потерял свои данные 100%. Забудь«.
Предыдущий бэкап контейнера был, конечно же, достаточно давним. Месяц назад (вот сейчас ровно месяц). За это время было проделано достаточно много изменений данных, хранящихся в этом контейнере и нигде более. Терять эти данные не было возможности просто никакой. Многие вещи были бы безвозвратно утеряны, многие требовалось бы писать или делать с нуля, что с учетом затраченного времени, сильно откидывало «назад», и создавало нереальные проблемы.
Нужно было восстанавливать. Срочно. Время шло на часы.
Первое, что я решил попробовать, найти начало контейнера и тупо скопировать все данные от его начала и до конца volume. Надежды на то, что контейнер не будет фрагментирован вообще-то не было (я сразу же понимал, что это не решение вопроса). Но была надежда таким образом получить хоть какие-то данные.
Благо у контейнера есть специфический заголовок, который я знаю наизусть. Начало контейнера быстро было найдено. Скопировал данные в файл, подмонтировал. Файловая система обычным способом (через FAR) не прочиталась. Пришлось обратиться опять к R-Studio. Увидел все свои каталоги и проч. Однако, содержимое файлов, конечно же, оставляло желать лучшего. Практически все новые и измененные за последнее время файлы содержали мусор. Либо полностью состояли из мусора, либо были частично мусорными. Толку от этого для решения общей задачи было практически мало.
Решил попробовать Runtime DiskExplorer. Нашел файловую запись 151. Это был родительский каталог каталога с контейнером. В дампе этой файловой записи было упоминание название каталога с контейнером. Но не более. Имени (или частей имени) файла с контейнером в $MFT не было! Вообще.
Сдампил файл $MFT. Опять же, прошелся в поисках по нему (в различных комбинациях) в FAR и HIEW — искал хоть что-то напоминающее имя файла контейнера — ничего.
Следующая мысль была — может быть chkdsk затер имя, но файловая запись осталась (с пометкой какой-нибудь или пусть даже «удаленная»). Стал пытаться найти в $MFT ссылки на начало файла (заголовок) — тщетно. Ничего нет.
И вот тут-то и пришла в голову мне дельная мысль — воспользоваться резервной копией контейнера! Нет-нет. Не так, как вы подумали. Не забить на все и не банально восстановить все, просто взяв забэкапленный файл контейнера. Речь о другом.
Идея заключается в следующем. Файл-контейнера именно как файл (целое) постоянен. Если не запускать дефрагментацию внутри самого контейнера, неизменяемые мною или самой файловой системой участки контейнера остаются постоянными. Соответственно, если диск 2gb, и там никто особенно не «шуровал», не перемещал файлы туда-сюда, а просто работал — то есть вносил изменения в существующие файлы, добавлял новые, что-то изредка удалял и т.п., файл контейнера сильно не изменялся! Понятие «сильно не изменился», конечно, условное. Чем меньше было изменений фактических (то, что делали вы), чем меньше срок между текущим состоянием и последней резервной копией — тем, очевидно, лучше.
Забегая вперед скажу, что в моем случае неизмененными осталось 78.5% секторов.
Операционная система при записи файлов старается их все же не фрагментировать (насколько это вообще возможно с учетом текущего состояния диска). Посмотрев свой $MFT, я был уверен, что фрагментов диска должно быть не больше 10, ну максимум — 20. А для большого файла-контейнера это означает то, что эти фрагменты будут по 100-200-300 мегабайт. То есть «огромными». И находя любой из фрагментов, сразу же находится («восстанавливается») достаточно большой пласт информации. С этим, правда, тоже есть тонкость. Ведь внутри контейнера — такая же файловая система. И она так же фрагментирована еще самом по себе. Поэтому, восстановив 100 мегабайт контейнера, не значит, что вы восстановите 100 мегабайт файлов. Может оказаться вообще так, что у вас будет в наличии 100 мегабайт «мусора» — различных кусков и обрезков от кучи файлов (где начало, где середина, где несколько кусков, где конец).
Проблема с фрагментами заключается не только в их поиске по всему физическому диску (а это огромный объем для анализа — 4gb; чтобы понять это — попробуйте вручную хотя бы 20mb пролистать клавишей PageDown), но и в том, что фрагменты могут быть записаны в любом порядке! То есть совершенно не обязательно, что файл выглядит на диске так: FRAGMENT1, FRAGMENT2, FRAGMENT3 и т.д. Он выглядит как угодно, легко порядок может оказаться таким — FRAGMENT8, FRAGMENT1, FRAGMENT6, FRAGMENT5, FRAGMENT2, FRAGMENT3 и т.д.
Моя идея позволяет сразу же «убить двух зайцев». Во-первых, мы сразу же находим все (или почти все) фрагменты на диске. Во-вторых, мы определяем корректный порядок их следования!
Теперь уже, наконец, сама суть идеи.
- Был взят файл контейнера месячной давности. И на каждые 512 байт (размер сектора) этого файла был насчитан MD5.
- Те же действия были произведены для текущего образа диска, на котором располагался контейнер (образ диска в 2 раза больше контейнера).
- Но сделано это было еще и по-хитрому. Так как я уже знал, что файла логически на этом диске не существует (нет никаких следов и упоминаний о нем), то весь файл находится сейчас в области «free space» (незанятое место, куда можно писать новые файлы). Соответственно, нет никакого смысла считать MD5 от всех секторов образа. Нужно построить маску занятых секторов, инвертировать ее (получить незанятые) и посчитать MD5 от всех незанятых секторов. Это и было проделано (для этого была написана утилита, которая анализировала $MFT и строила такой bitmap). [Позже для проверки был проведен эксперимент с поиском по всему диску и подсчету всех его секторов — разницы в отчетах не было].
Теперь у нас имелось два множества с MD5 секторов. Одно — от старого бэкапа, другое — от «свободного места» на текущем диске, в котором содержался текущий контейнер. Нужно было найти пересечение этих множеств!
Следует дополнительно отметить, что ситуация с MD5 здесь является выигрышной по той причине, что файл — это крипто-контейнер, что дает невероятно малый риск «коллизий» (речь не о хэш-функции). Допустим, если бы это был обычный файл (даже огромный .exe’шник) — в нем была бы куча повторящихся частей. С крипто-контейнером это просто исключено (если используется правильная инициализация IV для шифрования или, например, XTS с подмешиванием логического номера сектора диска).
Результат пересечения множеств — 78.5%. Остальные 21.5% — это измененные сектора диска.
Мое предположение заключалось в следующем (и полностью оправдало себя на практике) — изменения секторов более менее распределены по диску «локализованно». Соответственно, скорее всего, неизменные сектора окажутся в огромных количествах в каждом из имеющихся фрагментов диска. Что я имею в виду? То, что границы фрагментов будет определить легко. Либо граничные сектора не будут изменены, либо прилегающие к граничным секторам не будут изменены. Так и оказалось, у 5-и или 6-и из 10 (но можно считать, и 9-и) фрагментов, границы были определены очень четко, причем обе (как начало, так и конец).
У оставшей части границы пришлось поискать вручную. Но опять же, в виду того, что это шифро-данные, найти их границы не так сложно: эти данные выглядят как крайне случайный мусор. Как только этот мусор заканчивается — скорее всего, вы на границе.
Мешали этому только различные архивы (zip/rar), а так же инсталляторы (msi — считай, те же архивы). Если на стыке границы находился архив, было проблематично понять, имеют отношение эти сектора еще к фрагменту контейнера или это уже кусок архива.
Для решения этой проблемы была придумана еще одна идея: почистить сохраненный образ физического диска от… блоков, занятых файлами. То есть своеобразный жесткий wipe. Занулить все, что не относится к free space. (Это та самая утилита UsedBlocksEraser, которую пришлось написать для обработки bitmap).
Только благодаря этой утилите был найден один большой блок примерно на 50mb, в котором не было ни одного совпадения по MD5! (Вот вам и разрушение теории про «точно в каждлом блоке, найдется хотя бы несколько…»). Реально — ни одного. То есть все данные в этом фрагменте были либо изменены, либо были новыми.
Как выглядел лог пересечения множеств? (Это уже отсортированный лог с моими комментариями)
[BEGIN-4GB | BEGIN-2GB] — [ END-4GB | END-2GB ] Sectors countБлок контейнера с данными в промежутке: [00000000h — 2831A000h] [начало файла контейнера] [7D04FE00h | 00000000h] — [7E86FE00h | 01820000h] Sectors = 49408 / Size = 01820000 (25296896)
[7E870000h | 01820200h] — [7E870200h | 01820400h] Sectors = 1 / Size = 00000200 ( 512)
[7E870400h | 01820600h] — [7E881800h | 01831A00h] Sectors = 138 / Size = 00011400 ( 70656)[. ][9ECFC600h | 21CAC800h] — [9ECFD600h | 21CAD800h] Sectors = 8 / Size = 00001000 ( 4096)
[9EECE600h | 21E7E800h] — [A5369E00h | 2831A000h] Sectors = 206044 / Size = 0649B800 (105494528)
[реально конец данных] [за этим следует файловая запись из $MFT] Размер блока: 674340864 (2831A000h), Sectors = 1317072,
674mb (если внутри нет промежутков)Блок контейнера с данными в промежутке: [2831A000h — 39D75000h] [реально начало данных] [перед этим следует расшифрованный пустой сектор] [5F489E00h | 2831A000h] — [63172400h | 2C002600h] Sectors = 124739 / Size = 03CE8600 (63866368)
[63172600h | 2C002800h] — [65360E00h | 2E1F1000h] Sectors = 69492 / Size = 021EE800 (35579904)[. ][6EEEA600h | 37D7A800h] — [70EE4E00h | 39D75000h] Sectors = 65492 / Size = 01FFA800 (33531904)
[реально конец данных] [за этим следует расшифрованный неизвестный .exe] Размер блока: 296071168 (11A5B000h), Sectors = 578264,
296mb (если внутри нет промежутков)Блок контейнера с данными в промежутке: [39D75000h — 469E6000h] [реально начало данных] [перед этим следует расшифрованный пустой сектор] [242AFE00h | 39D75000h] — [25144600h | 3AC09800h] Sectors = 29860 / Size = 00E94800 (15288320)
[25145600h | 3AC0A800h] — [260DB600h | 3BBA0800h] Sectors = 31920 / Size = 00F96000 (16343040)[. ]
Кстати, забыл рассказать о «втором зайце». Порядок следования. По вот этому логу он определяется элементарно. Лог имеет формат: смещение начала отрезка одинаковых секторов, смещение конца отрезка одинаковых секторов, их количество, размер в байтах. Смещения указаны в двух «системах счисления». Первая часть — это смещение внутри образа физического диска. Вторая часть — это смещение внутри резервной копии файла-контейнера. Теперь догадываетесь как «убить второго зайца»? Нужно просто отсортировать этот лог по вторым смещениям. Чтобы они следовали от нулевого (начала контейнера) до конца, по возрастанию.
После того, как я нашел (в своем представлении) все блоки, и в своем представлении определил их границы, я написал утилиту, вытаскивающие нужные блоки из созданного образа физического диска.
Кстати, вспомнил момент. Был реальный epic fail на полпути (из-за которого, кстати, было потеряно определенное время, потому что из-за него не нашлось часть пересечения и пришлось блоки искать вручную). Я, зная о том, что это большие диски (больше 2GB), почему-то все равно использовал обычные функции seek. Как итог — неправильно построенное множество MD5 для диска с физическим образом. Более того, еще хуже ситуация была на Virtual Pascal (одна из утилит была написана на нем) с типом Longint (не DWORD), который, естественно, умеет быть отрицательным. В общем, не забывайте, что нужно использовать 64-битные смещения и 64-битный seek! Не тупите. Особенно, если знаете об этом изначально.
В общем, диск был подключен. Файловая система прекрасно читалась через FAR. Файлы были доступны и все было отлично. Стал крайне внимательно (имеют опыт) сравнивать диски/файлы: восстановленную копию, копию в своей голове и резервную копию. Не сразу же, но нашел, что часть файлов (очень малая, но они есть) — битые. В них содержалась информация от других секторов. То есть где-то произошло смещение границ блоков! Мне очень повезло, что на этом контейнере у меня было
100 файлов, на которые было заранее рассчитано MD5. Я мог проверить их целостность и понять — битые они или нет. Так же, мне повезло, что это был не XTS-режим. В противном случае я не знал бы, что это смещены границы блоков. Точнее, я не смог бы понять: расшифрован полный мусор или это «правильные данные», но просто не на том месте. (В данном случае, мусорными были первые 16 байт сектора, остальное было нормально расшифрованным, но «не отсюда» — это особенность реализации алгоритма; кстати, если не было бы такого подмешивания — была бы нереальная проблема с коллизиями при рассчете MD5 — см. выше).
Я составил список битых файлов (те, что смог найти вручную). После этого пришлось сделать утилиту, которая строит «flat-модель» (мое условное название) всего диска. Для этого уже использовался анализ $MFT из внутренностей контейнера. Лог выглядел вот так:
[. ][5EA29000-5EA34800] Sectors = 92 / Size = 0000B800 ( 47104) FO: [00018000-00023800] `.SVNC*R*includeuildconf*.h’
[5EA34800-5EA35000] Sectors = 4 / Size = 00000800 ( 2048) FO: [0000F000-0000F800] `.SVNC*R*driverDebug*.obj’
[5EA35000-5EA3D800] Sectors = 68 / Size = 00008800 ( 34816) FO: [00018000-00020800] `.SVNC*R*
*Debug*.obj’
[5EA3D800-5EA3E000] Sectors = 4 / Size = 00000800 ( 2048) FO: [00008800-00009000] `.SVNROOTC*db
evs 392′
[5EA3E000-5EA3F000] Sectors = 8 / Size = 00001000 ( 4096) FO: [00014800-00015800] `.SVNROOTC*db
evs 398′
[5EA3F000-5EA40800] Sectors = 12 / Size = 00001800 ( 6144) FO: [00010800-00012000] `.SVNROOTC*db
evs 389′
[5EA40800-5EA41000] Sectors = 4 / Size = 00000800 ( 2048) FO: [00009000-00009800] `.SVNROOTC*db
evs 392′
[5EA41000-5EA41800] Sectors = 4 / Size = 00000800 ( 2048) FO: [00008000-00008800] `.SVNROOTC*db
evs 390′
[5EA41800-5EA42000] Sectors = 4 / Size = 00000800 ( 2048) FO: [00002000-00002800] `.WORKINTERNETDESIGNsporawwww
us.htaccess'[. ]
Символ «*» тут — это просто пропущены ненужные всякие названия.
Слева указывались смещения внутри файла контейнера, дальше количество секторов, размер, потом — смещение начала блока данных внутри файла, и смещение его конца, далее — полный путь к файлу.
Такой лог позволил мне увидеть, что все битые файлы находятся в пределах одного найденного мною блока. Более того, я понял, что битых файлов значительно больше, чем я предполагал (я нашел 10, а их было 55). Причем большинство из них, к сожалению, выпадали на бинарные файлы (по ним сложно понять — битый он или нет), и более того — на куски репозитория SVN!
Используя FO-смещения (информация о блоке внутри файла), я проанализировал несколько файлов. Тут как раз помогло то, что несколько файлов было текстовых, плюс файлы были разных форматов. По ним я понял, что произошло смещение на 32-сектора (4000h байт). То есть нужно восстанавливаемый блок просто сдвинуть «вниз» на 4000h байт. А как раз за этим «плохим» блоком шел ненайденный блок в 4000h-байт. Как оказалось, нужно было просто поменять местами эти два блока! Ненайденный блок шел до найденного.
Эти 4000h байт я не стал искать, посмотрев куда они попадают в контейнере: они попадают на область free space. То есть просто пустое место. Там может быть любой мусор и мне он неважен. Искать смысла нет никакого.
Результаты проделанной за 44.5 часов работы:
// PhysOffset BlockSize PhysOffset FileOffset PhysOffset FileOffset
CopyBlock(fI, fO, 0x7D04FE00, 0x2831A000); // [7D04FE00h | 00000000h] — [A5369E00h | 2831A000h] CopyBlock(fI, fO, 0x5F489E00, 0x11A5B000); // [5F489E00h | 2831A000h] — [70EE4E00h | 39D75000h] CopyBlock(fI, fO, 0x242AFE00, 0x0CC71000); // [242AFE00h | 39D75000h] — [30F20E00h | 469E6000h] CopyBlock(fI, fO, 0xDBBB7E00, 0x09E03000); // [DBBB7E00h | 469E6000h] — [E59BAE00h | 507E9000h] CopyBlock(fI, fO, 0x0A38FE00, 0x08871000); // [0A38FE00h | 507E9000h] — <12C00E00h | 5905A000h>
UnknownBlock(fI, fO, 0x00004000); // — // FreeSpace, нет смысла искать их
CopyBlock(fI, fO, 0x0000DE00, 0x03056000); // —
CopyBlock(fI, fO, 0xA75DFE00, 0x01F5B000); //
CopyBlock(fI, fO, 0x3CE74E00, 0x01878000); // <3CE74E00h | 5E00F000h>- <3E6ECE00h | 5F887000h>
CopyBlock(fI, fO, 0x55FBFE00, 0x00779000); // <55FBFE00h | 5F887000h>- [56738E00h | 60000000h] // Total: 0x60000000 = 1’610’612’736
Все! Контейнер полностью восстановлен!
Надеюсь, эта статья и идеи кому-нибудь когда-нибудь помогут/пригодяться при восстановлении данных в схожей или иной ситуации.
Основные причины неисправности:
– некорректное завершение работы ПК;
– проблемы с электропитанием;
– последствия вирусной атаки;
При повреждении файловой системы диска в журнале событий Windows, как правило, регистрируются следующие события:
– в разделе Система
Структура файловой системы на диск повреждена и не может использоваться. Запустите программу CHKDSK на томе C:.
Обнаружена ошибка на устройстве DeviceHarddisk0D во время выполнения операции страничного обмена.
Драйвер обнаружил устаревшую настройку изготовителя для устройства DeviceIdeIdePort2. В результате возможно понижение быстродействия.
Устройство DeviceIdeIdePort2 не отвечает в течение интервала ожидания.
– в разделе Приложение
Система событий COM+ обнаружила неверный код возврата в ходе внутренней обработки. Значение HRESULT: 8007043C (строка 44 из d:
tcomcom1xsrcevents ier1eventsystemobj.cpp). Обратитесь в службу поддержки Майкрософт.
Ошибка теневого копирования тома: непредвиденная ошибка при вызове программы CoCreateInstance. hr = 0x80040206.
Checking file system on G:
The type of the file system is NTFS.
One of your disks needs to be checked for consistency. You
may cancel the disk check, but it is strongly recommended
that you continue.
Windows will now check the disk.
Cleaning up minor inconsistencies on the drive.
Cleaning up 13 unused index entries from index $SII of file 0x9.
Cleaning up 13 unused index entries from index $SDH of file 0x9.
Cleaning up 13 unused security descriptors.
Read failure with status 0xc0000185 at offset 0xbca2e000 for 0x10000 bytes.
Read failure with status 0xc0000185 at offset 0xbca33000 for 0x1000 bytes.
Replacing bad clusters in logfile.
Adding 1 bad clusters to the Bad Clusters File.
Correcting errors in the Volume Bitmap.
Windows has made corrections to the file system.
28081588 KB total disk space.
16094800 KB in 92009 files.
24648 KB in 3296 indexes.
16 KB in bad sectors.
162332 KB in use by the system.
65536 KB occupied by the log file.
11799792 KB available on disk.
4096 bytes in each allocation unit.
7020397 total allocation units on disk.
2949948 allocation units available on disk.
d8 74 01 00 54 74 01 00 a4 ae 01 00 00 00 00 00 .t..Tt.
9a 01 00 00 00 00 00 00 c5 00 00 00 00 00 00 00 .
b8 8c 17 03 00 00 00 00 96 b2 92 24 00 00 00 00 . $.
92 58 81 02 00 00 00 00 00 00 00 00 00 00 00 00 .X.
00 00 00 00 00 00 00 00 84 7f ec 55 00 00 00 00 . U.
99 9e 36 00 00 00 00 00 69 67 01 00 00 00 00 00 ..6. ig.
00 40 59 d6 03 00 00 00 e0 0c 00 00 00 00 00 00 .@Y.
Алгоритм устранения неисправности:
– выключите ПК, снимите винчестер, подключите его к другому ПК (при подключении винчестера этот ПК должен быть выключен!) ;
– включите ПК (процесс инициализации подключенного винчестера – из-за повреждения файловой системы – займет некоторое время – в пределах 5 – 7 мин) ;
– при загрузке ОС запустится программа проверки диска CHKDSK (программа найдет ошибки и «постарается» исправить их, откорректировав файловую систему) ;
– выключите ПК, снимите винчестер и установите его в «родной» ПК;

Here is the result of running a chkdsk on my drive in read-only mode:
After, I ran it with the /r switch and rebooted the computer. I wasn’t there to see what the results were but I re-ran chkdsk again and it gave me this same message.
Содержание
Premium Content
Premium Content
- https://www.experts-exchange.com/questions/27434320/Is-Correcting-Errors-in-the-Volume-Bitmap-something-to-worry-about.html copy


See http://support.microsoft.com/kb/315688 and the section with the heading NTFS File System Corruption.
It makes a suggestion as how to fix — chkdsk /f

![]()
Ensure you’re charging the right price for your IT

Do you wonder if your IT business is truly profitable or if you should raise your prices? Learn how to calculate your overhead burden using our free interactive tool and use it to determine the right price for your IT services. Start calculating Now!

When chkdsk "automatically" runs on reboot, the output is saved in the Event Log.
Ahh, well thre /r option is different than the /f option.
/r is for checking for bad sectors and any it finds try to copy the data to a new location and remap the bad spot to the new location regardless of whether the data could be read. If the data was able to be moved, great, the file is unaffected since the piece of it is just in a new location, BUT if the data was not able to be moved the file still has a piece of it relocated off the bad spot, but the file is corrupted because that piece doesn’t have the right data. If any are unsucesfully remapped, chkdsk with the /r option displays lines of "error" messages that one time and only that one time that indicate which files were adversely affected (if any). You are then expected to "deal" with those files, usually by replacing them by recovering them from last good backup. chkdsk would say how many total KB have been set aside in bad sectors, and all subsequent chkdsk would repeat that total.
Since your total KB bad sectors is still 0 zero, @skarai is correct to say there were no bad sectors found before so you don’t even have to go back and look whether the output of that chkdsk /r had success or errors due to failure to read the data when remapping the bad sectors of certain files, because so far there have been none, zero, successful or not.
Note however, if your drive was part of a hardware RAID, then the RAID handles bad sectors a completely different way, (the mirroring or striping or parity have redundant information to read or reassemble data off bad blocks/sectors) and chkdsk will typically always say 0 KB bad sectors because the RAID is handling them. IF it is a RAID then you use the raid management to manage your disk drives health.
Sidebar: I prefer paid-for third-party tools because I find the /R option gives-up too easily, so it remaps alright but you lose data, whereas SpinRite 6 or HDDRegenerator 2011 will reread iffy spots hundreds of times instead of a half doizen. Difference is chkdsk gives up so fast it doesn’t take hours and hours to finish, BUT you better have a good backup to recover corrupted files from. Everybody has a good recent verified backup right? ;P
chkdsk /f is different, and generally more important and more useful and more often needed. What /f does is say to examine the table of contents, the file allocation table, i-node and map tables, security descriptors etc (FAT or NTFS) to see if there is any corruption or inconsistencies. chkdsk without /f looks for these but does not fix them if it finds them. The /f switch tells it to "fix" those errors. It does its best to fix them, just know that sometimes if the corruption is bad enough the "fix" might "lose" some stuff, same half-finished changes to the drive. Like say if the system was in the middle of writing changes to the disk when the power was cut, things were not neatly finished and you might lose the last part of something that was left half-done. chkdsk usually reports as error message what files or file segments it decides needed dealing with during that pass.
You should be able to run chkdsk with the /f option, logged in as administrator. It will likely say the C: drive is currently "in use", making it difficult to check when things are constantly changing, so to do a proper "fixing" so it wants to do it at the next reboot. You say yes, reboot, and at the reboot it should do a "autochkdsk" with the fix option, displaying as the white text on a blue background. When booting, if the "dirty bit" is detected, the system knows the power was cut in the middle of the system being used, so it automatically checks it. Again as @skarai stated, check your System log in Event Log viewer, you will find the auto chkdsk entry and messages that were displayed on the screen is in that entry.
Your chkdsk scan is telling you there are inconsistencies in the volume bitmap and you should run chkdsk with the /F option to fix it. Do that, knowing it will probably need and you will have to say yes to do on reboot and then reboot to do it.






