Восстановленный компонент с ошибкой xml

Добрый вечер. Уважаемый знатоки.
Такая проблема возникает:
Сохраняю документ, открываю его вновь, программа предлагает восстановить данные.
Возникает ошибка такого содержания:
Иногда возникает такая ошибка:
Удаленный компонент: часть /xl/styles.xml с ошибкой XML.  (Стили) Ошибка загрузки. Строка 2, столбец 3335.
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet1.xml
После этого из файла пропадает часть дробных частей чисел.
В чем может быть причина?
Эксель 2007

Не торопись, и все успеешь намного быстрее


В такой ситуации надо смотреть что там с этим /xl/styles.xml, открыв файл .xlsx как архив. Например 7Zip’ом.
А далее провести эксперименты на копии файла:

  • Вариант1: Тупо удалить styles.xml.
  • Вариант2: Открыть его (например XML Notepad’ом), поискать что там не так, исправить.
  • Вариант3: Сделать пересадку из другого файла, с той же «группой крови». :)

При неудаче, попеременно (значения, формулы, форматы, а не листы целиком) перетащить всё в новый файл, а этот, косячный, утилизировать.

Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли


@nickela

Excel 2010 говорит что test.xlsx поврежден и после восставновления выдает пояснения: «Восстановленный компонент: часть /xl/worksheets/sheet1.xml с ошибкой XML. Разрушительный сбой Строка 1, столбец 3282483.».
OpenOffice Calc открывает без проблем и если пересохранить открытый файл в xlsx формате, то уже Excel его открывает без нареканий.

@qrilka

Файл/код для генерации? «столбец 3282483» намекает, что эксель мог нарваться на лимиты числа столбцов, но это лишь догадка.

@nickela

я пытался разобраться в чем дело, здесь под столбцом понимается номер символа из файла shee1.xml, в данном случае это послений символ файла ‘>’
я просто выкачал последнюю версию xlsx, собрал, запутил dist/build/test/test, и попытался открыть полученный файл test.xlsx в Excel 2010

@qrilka

ОК, спасибо за репорт, попробую посмотреть на выходных

@nickela

распаковал test.xlsx, отформатировал sheet1.xml ( xmllint —format sheet1.xml ), собрал новый архив,
теперь MS Excel жалуется на строку 180008 столбец 15. Вот данная строка:
<mergeCells/>
15-й символ — это последний символ в стоке ‘>’
Если эту строчку убрать, то Excel уже рапортует: «Восстановленные записи: Сведения о столбцах из части /xl/worksheets/sheet1.xml»

@qrilka

эх… mergeCells…
хотя «Восстановленные» намекает, что всё равно файл невалидный, надо откопать у MS была где-то тулза валидации офисных файликов

@qrilka

но если есть желание — pull requests are welcome :)

@qrilka

Откопал пока только что core.xml почему-то не нравится 2013-му офису, при этом валидатор никаких ошибок толком не видит.

@nickela

Поправил этот баг ( nickela@f166ba9 ).
Правда пришлось закоментить генерацию тега created в core.xml, не смог победить неймспейсы у атрибутов.

@qrilka

А PR оформить не получится?
Только пожелание — не надо плодить одинаковые куски кода, для этого функции есть.
Ну или я посмотрю через пару деньков и постараюсь сам оформить фикс

@nickela

Добрый день, проблема такая: стоит ms office 2007 sp3, обновления всевозможные и т.п. По outlook приходит письмо с файликом excel, если в это время сам excel открыт или какие-то документы экселевские, то вылетает следующая ошибка и файл загружается коряво без стилейформата и т.п., если эксель закрыт, то все грузится нормально. Прилагаю код ошибки, не могу победить эту хрень уже месяц. Помогите.  
Удаленный компонент: часть /xl/styles.xml с ошибкой XML.  (Стили) Ошибка загрузки. Строка 2, столбец 5935.  
Восстановленный компонент: часть /xl/worksheets/sheet1.xml с ошибкой XML.  Ошибка загрузки. Строка 2, столбец 5935.  
Восстановленный компонент: часть /xl/worksheets/sheet6.xml с ошибкой XML.  Ошибка загрузки. Строка 2, столбец 210237.  
Удаленное свойство: Шрифт из части /xl/worksheets/sheet1.xml  
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet1.xml  
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet2.xml  
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet3.xml  
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet4.xml  
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet5.xml  
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet6.xml  
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet7.xml  
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet8.xml  
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet9.xml  
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet10.xml  
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet13.xml  
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet14.xml

Платные услуги для вашего проекта

  • Консалтинг и техническая поддержка

    Запросы в рамках коммерческой поддержки имеют гарантированное время ответа

  • Разработка на заказ

    Предоставляем разработку полностью нашими рабочими ресурсами или участвуем в создании вашего проекта

  • Обучение

    Для быстрого и всестороннего освоения особенностей платформы, чтобы повысить продуктивность вашей команды

Haulmont

мы разрабатываем современные корпоративные решения

  • Эксперты в области разработки корпоративного ПО

  • Создатели CUBA Platform

  • Компания основана в 2008

  • 300+

    разработчиков

  • 400+

    проектов

  • Клиенты в

    60+

    странах

В данной статье описан метод ручного восстановления хранилища компонентов Windows. Подобные описанному в данном посте методу восстановления работоспособности компонентной модели рождаются вовсе не от хорошей жизни, появляются они под воздействием многочисленных проблем с компонентной моделью операционной системы. Во многих случаях официальные подходы к восстановлению хранилища компонентов не помогают, помимо этого отсутствует какая бы то ни было внятная официальная документация, из чего складывается недопонимание структуры и принципов работы компонентной модели. При подобном отношении со стороны разработчиков абсолютно любые средства вернуть компонентную модель в работоспособное состояние приемлемы!! Как показывает практика, при всех стараниях разработчиков из Microsoft предоставить возможность конечному пользователю системы устранять возникающие проблемы в автоматическом режиме (при помощи специальных утилит), никогда полностью не будут исключены ситуации, в которых эти самые автоматизированные средства будут давать сбои. Причина тут кроется в симбиозе старых механизмов операционной системы и необходимостью постоянного внедрения новых (не оттестированных) технологий, должным образом не заботясь о приведении в надлежащее состояние всех связанных (участвующих) компонентов, что, в свою очередь, порождает огромное количество проблем.
В данной публикации речь пойдет о восстановлении компонента прямой заменой файлов. Фактически методом предусматривается прямая ручная замена поврежденных [кривых, неправильно функционирующих] файлов, являющихся причиной возникновения ошибок, а так же частей реестра. По этой методике, исправные файлы и соответствующие ключи реестра копируются с работоспособной станции-донора. Слабое место метода в том, что для реализации требуется наличие находящейся на том же уровне обновлений нормально функционирующей операционной системы той же версии/ревизии.
В процессе повествования постараемся описать общую методику, тем не менее, в статье будут присутствовать частные случаи из практики.

Определение виновника проблемы

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

Ошибки в лог-файлах

Основной и пожалуй самый информативный источник о проблемах, связанных с компонентной моделью Windows — лог-файлы системных утилит обслуживания. Чаще всего ошибки выявляются при выполнении обновления системы, то есть установки обновлений/исправлений. Проявляются они в виде разнообразных ошибочных статусов в интерфейсе Центра обновления и окон обновлений. Тем не менее, сам по себе статус не малоинформативен, а вот более детальная информация попадает в специализированные файлы журналов. В данном разделе мы опишем методики поиска источников проблем в лог-файлах результатов работы системных утилит SURT/DISM/SFC/SFCFix, которые работают с хранилищем компонентов и системными каталогами а предмет восстановления целостности компонентной модели системы.

CheckSUR.log / DISM.log

Правила поиска ошибок в файлах %Windir%LogsCBSCheckSUR.log или %Windir%LogsDISMDISM.log:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

=================================

Checking System Update Readiness.

Binary Version 6.1.7601.24499

20190716 14:04

Checking Windows Servicing Packages

Checking Package Manifests and Catalogs

Checking Package Watchlist

Checking Component Watchlist

Checking Packages

Checking Component Store

(f) CSI Manifest Zero Length 0x00000000 winsxsManifestsx86_microsoftwindowsdirectxdirect3d11_31bf3856ad364e35_7.1.7601.16492_none_e2d7c9f5b7176f4e.manifest x86_microsoftwindowsdirectxdirect3d11_31bf3856ad364e35_7.1.7601.16492_none_e2d7c9f5b7176f4e

(f) CSI Manifest Zero Length 0x00000000 winsxsManifestsamd64_microsoftwindowsiehtmlrendering_31bf3856ad364e35_11.2.9600.17843_none_f5715a5c3755cc36.manifest amd64_microsoftwindowsiehtmlrendering_31bf3856ad364e35_11.2.9600.17843_none_f5715a5c3755cc36

Summary:

Seconds executed: 2948

Found 2 errors

  CSI Manifest Zero Length Total count: 2

Unavailable repair files:

winsxsmanifestsx86_microsoftwindowsdirectxdirect3d11_31bf3856ad364e35_7.1.7601.16492_none_e2d7c9f5b7176f4e.manifest

winsxsmanifestsamd64_microsoftwindowsiehtmlrendering_31bf3856ad364e35_11.2.9600.17843_none_f5715a5c3755cc36.manifest

Статусы (первый символ):

  • (f) — фатальная ошибка;
  • (w) — предупреждение;
  • (fix) — указывает на ошибку, которая была исправлена; выводятся в виде отдельной строки сразу за строкой со статусом (f);

Оставшаяся часть строки содержит имя поврежденного файла и код ошибки.
В конце файла можно видеть секцию Unavailable repair files:, которая группирует все файлы, которые нужно будет заменять.

CBS.log

Несколько вариантов поиска ошибок в лог-файле %WinDir%LogsCBSCBS.log:

  • Производим поиск строк, содержащих ключевое слово Error (с пробелом ДО или ПОСЛЕ). В их окружении можно найти указание на конкретные ошибки;
  • Выполняем команду

    findstr /c:»[SR]» %windir%logscbscbs.log > c:sfcdetails.txt

    в результате чего в корне диска C: будет создан файл sfcdetails.txt, включающий лишь строки исходного файла, содержащие префикс [SR] (содержащие информацию об ошибках).

1: отсутствующие компоненты

. . .

20160105 14:20:31, Info                  CSI    00001a68 [SR] Verifying 100 (0x0000000000000064) components

20160105 14:20:31, Info                  CSI    00001a69 [SR] Beginning Verify and Repair transaction

20160105 14:20:31, Info                  CSI    00001a6a [SR] Cannot repair member file [l:32{16}]«BRCI06UI.DLL.mui» of prnbr002.inf.Resources, Version = 6.1.7600.16385, pA = PROCESSOR_ARCHITECTURE_AMD64 (9), Culture = [l:10{5}]«ru-RU», VersionScope = 1 nonSxS, PublicKeyToken = {l:8 b:31bf3856ad364e35}, Type neutral, TypeName neutral, PublicKey neutral in the store, file is missing

20160105 14:20:31, Info                  CSI    00001a6b [SR] Cannot repair member file [l:32{16}]«prnbr002.inf_loc» of prnbr002.inf.Resources, Version = 6.1.7600.16385, pA = PROCESSOR_ARCHITECTURE_AMD64 (9), Culture = [l:10{5}]«ru-RU», VersionScope = 1 nonSxS, PublicKeyToken = {l:8 b:31bf3856ad364e35}, Type neutral, TypeName neutral, PublicKey neutral in the store, file is missing

20160105 14:20:31, Error                 CSI    00001a6c (F) STATUS_OBJECT_NAME_NOT_FOUND #28089837# from Windows::Rtl::SystemImplementation::DirectFileSystemProvider::SysCreateFile(flags = (AllowSharingViolation), handle = {provider=NULL, handle=0}, da = (SYNCHRONIZE|FILE_READ_ATTRIBUTES), oa = @0x195c7d0>OBJECT_ATTRIBUTES {s:48; rd:NULL; on:[100]»??C:WindowsWinSxSamd64_prnbr002.inf_31bf3856ad364e35_6.1.7600.16385_none_49c93aa2c4304e9eAmd64″; a:(OBJ_CASE_INSENSITIVE)}, iosb = @0x195c7b0, as = (null), fa = 0, sa = (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE), cd = FILE_OPEN, co = (FILE_SYNCHRONOUS_IO_NONALERT|0x00004000), eab = NULL, eal = 0, disp = Invalid)

20160105 14:20:31, Error                 CSI    00001a6d@2016/1/5:10:20:31.885 (F) d:win7sp1_gdrbasewcpsilmergedntuntsystem.cpp(2057): Error STATUS_OBJECT_NAME_NOT_FOUND originated in function Windows::Rtl::SystemImplementation::DirectFileSystemProvider::SysCreateFile expression: (null)

20160105 14:20:31, Error                 CSI    00001a6e (F) STATUS_OBJECT_NAME_NOT_FOUND #28089836# from Windows::Rtl::SystemImplementation::CDirectory::OpenExistingDirectory(...)[gle=0xd0000034]

20160105 14:20:31, Error                 CSI    00001a6f (F) STATUS_OBJECT_NAME_NOT_FOUND #28089835# from Windows::Rtl::SystemImplementation::CDirectory_IRtlDirectoryTearoff::OpenExistingDirectory(flags = 0, da = (SYNCHRONIZE), oa = @0x195d0e0>SIL_OBJECT_ATTRIBUTES {s:40; on:»Amd64″; a:(OBJ_CASE_INSENSITIVE)}, sa = (FILE_SHARE_READ|FILE_SHARE_WRITE), oo = (FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT|FILE_OPEN_FOR_BACKUP_INTENT), dir = NULL, disp = (null))

. . .

В обрамлении видно строки, содержащие ключевые слова Cannot repair member file.. указывающие на то, что:

  • содержимое файла не соответствует содержимому хранилища для файла и WRP пытается его восстановить, тем не менее..
  • ..WRP не может восстановить файл описанного в строке компонента, потому что записи в реестре о нем присутствуют, а вот сам файл отсутствует в хранилище, о чем недвусмысленно намекает фрагмент строки ..file is missing.

Ниже по тексту можно найти статус STATUS_OBJECT_NAME_NOT_FOUND, указывающий на отсутствие подкаталога. В нашем случае, как видно из отчета, повреждению подверглась целая иерархия компонента, состоящая из подкаталогов и файлов, размещавшаяся в каталоге C:WindowsWinSxSamd64_prnbr002.inf_31bf3856ad364e35_6.1.7600.16385_none_49c93aa2c4304e9e. Заглянув в целевой каталог, я убедился, что он действительно пуст, а вот что за событие/действие удалило его содержимое, остается только гадать, хотя подобные инциденты в Windows-системах сплошь и рядом.
2: отсутствие манифеста

. . .

20190527 14:32:54, Info                  CSI    000004f9 Looking for manifest in Backup Dir...

20190527 14:32:54, Error                 CSI    000004fa (F) Unable to load manifest for component [ml:280{140},l:186{93}]«wow64_microsoft-windows-directshow-core_31bf3856ad364e35_6.1.7601.24382_none_0f268a5b523efde9»[gle=0x80004005]

20190527 14:32:54, Error                 CSI    000004fb@2019/5/27:11:32:54.653 (F) d:w7rtmbasewcpcomponentstorestorelayout.cpp(2712): Store corruption detected in function ComponentStore::CRawStoreLayout::FetchManifestContent expression: 0

  FileHashMismatch on resource [120]«winsxsmanifestswow64_microsoft-windows-directshow-core_31bf3856ad364e35_6.1.7601.24382_none_0f268a5b523efde9.manifest»[gle=0x80004005]

20190527 14:32:56, Error                 CSI    000004fc (F) STATUS_SXS_COMPONENT_STORE_CORRUPT #1525870# from CCSDirectTransaction::OperateEnding at index 6 of 185 (0x00000000000000b9) operations, disposition 0[gle=0xd015001a]

20190527 14:32:56, Error                 CSI    000004fd (F) HRESULT_FROM_WIN32(14098) #1496294# from Windows::ServicingAPI::CCSITransaction::ICSITransaction2_AddComponents(Flags = 4, a = @0x1b50440, mp = @0x1b50c40, disp = 0)[gle=0x80073712]

20190527 14:32:56, Info                  CBS    Failed to add one or more component [HRESULT = 0x80073712 ERROR_SXS_COMPONENT_STORE_CORRUPT]

20190527 14:32:56, Error                 CBS    Failed to complete component closure [HRESULT = 0x80073712 ERROR_SXS_COMPONENT_STORE_CORRUPT]

20190527 14:32:56, Info                  CSI    000004fe@2019/5/27:11:32:56.806 CSI Transaction @0x8abb930 destroyed

20190527 14:32:56, Info                  CBS    Perf: Resolve chain complete.

20190527 14:32:56, Info                  CBS    Failed to resolve execution chain. [HRESULT = 0x80073712 ERROR_SXS_COMPONENT_STORE_CORRUPT]

20190527 14:32:56, Error                 CBS    Failed to process single phase execution. [HRESULT = 0x80073712 ERROR_SXS_COMPONENT_STORE_CORRUPT]

20190527 14:32:56, Info                  CBS    WER: Generating failure report for package: Package_for_RollupFix~31bf3856ad364e35~amd64~~7601.24443.1.8, status: 0x80073712, failure source: Resolve, start state: Absent, target state: Installed, client id: WindowsUpdateAgent

20190527 14:32:56, Info                  CBS    Failed to query DisableWerReporting flag.  Assuming not set... [HRESULT = 0x80070002 ERROR_FILE_NOT_FOUND]

. . .

Ключевые слова, на которые в данном случае стоит обращать внимание:

  • Manifest hash for component .. does not match expected value.
  • Unable to load manifest for component ..

Из чего следует, что в данном случае возникла проблема с файлом wow64_microsoft-windows-directshow-core_31bf3856ad364e35_6.1.7601.24382_none_0f268a5b523efde9.manifest, который является манифестом и располагается в поддиректории %SystemRoot%WinSxSManifests. При более близком изучении было выяснено, что указанный файл почему-то нулевой.
3: попытка удаления отсутствующего компонента
При попытках установки обновления безопасности мы можем столкнуться со следующей проблемой:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

. . .

20190528 12:20:09, Info                  CBS    Exec: Unprojecting Package: Package_820_for_KB4019265~31bf3856ad364e35~amd64~~6.1.1.3, Update: 40192652871_neutral_LDR, UninstallDeployment: amd64_006f1bee347aa0a86984388c82ccb379_31bf3856ad364e35_6.1.7601.23529_none_4683d079b6ce11b3

20190528 12:20:09, Info                  CBS    Exec: Uninstalling Package: Package_846_for_KB4019265~31bf3856ad364e35~amd64~~6.1.1.3

20190528 12:20:09, Info                  CBS    Exec: Uninstalling Package: Package_846_for_KB4019265~31bf3856ad364e35~amd64~~6.1.1.3, Update: 40192652966_neutral_LDR

20190528 12:20:09, Info                  CBS    Exec: Unprojecting Package: Package_846_for_KB4019265~31bf3856ad364e35~amd64~~6.1.1.3, Update: 40192652966_neutral_LDR, UninstallDeployment: amd64_0f4370f0564ad69cbf1c9624ac455552_31bf3856ad364e35_7.6.7601.23775_none_3e0e14d4d5b6573f

20190528 12:20:09, Error                 CBS    Failed. Attempted to uninstall a version of a nondriver component that is not installed, version: 0X700061db15cdf, component: amd64_microsoftwindowsw..lientaux.resources_31bf3856ad364e35_7.6.7601.23775_ruru_306f57c17eac5f89, owner: Package_846_for_KB4019265~31bf3856ad364e35~amd64~~6.1.1.3.40192652966_neutral_LDR [HRESULT = 0x80004005 E_FAIL]

20190528 12:20:09, Info                  CBS    Failed to mergecomponent [HRESULT = 0x80004005 E_FAIL]

20190528 12:20:09, Info                  CBS    ComponentAnalyzerUninstallDeployment: Failed on update: 40192652966_neutral_LDR [HRESULT = 0x80004005 E_FAIL]

20190528 12:20:09, Info                  CBS    Failed to execute item[0] in Package: Package_846_for_KB4019265~31bf3856ad364e35~amd64~~6.1.1.3, Update: 40192652966_neutral_LDR [HRESULT = 0x80004005 E_FAIL]

20190528 12:20:09, Info                  CBS    Failed to execute execution update. [HRESULT = 0x80004005 E_FAIL]

20190528 12:20:09, Info                  CBS    Failed to execute execution package: Package_846_for_KB4019265~31bf3856ad364e35~amd64~~6.1.1.3 [HRESULT = 0x80004005 E_FAIL]

20190528 12:20:09, Info                  CBS    Failed to prepare execution [HRESULT = 0x80004005 E_FAIL]

20190528 12:20:09, Info                  CSI    00000016@2019/5/28:09:20:09.916 CSI Transaction @0x1b71940 destroyed

20190528 12:20:09, Info                  CBS    Perf: InstallUninstallChain complete.

20190528 12:20:09, Info                  CBS    Failed to execute execution chain. [HRESULT = 0x80004005 E_FAIL]

20190528 12:20:09, Error                 CBS    Failed to process single phase execution. [HRESULT = 0x80004005 E_FAIL]

20190528 12:20:09, Info                  CBS    WER: Generating failure report for package: Package_for_RollupFix~31bf3856ad364e35~amd64~~7601.24443.1.8, status: 0x80004005, failure source: Execute, start state: Staged, target state: Installed, client id: WindowsUpdateAgent

20190528 12:20:09, Info                  CBS    Failed to query DisableWerReporting flag.  Assuming not set... [HRESULT = 0x80070002 ERROR_FILE_NOT_FOUND]

20190528 12:20:10, Info                  CBS    Failed to add %windir%winsxspending.xml to WER report because it is missing.  Continuing without it...

20190528 12:20:10, Info                  CBS    Failed to add %windir%winsxspending.xml.bad to WER report because it is missing.  Continuing without it...

20190528 12:20:10, Info                  CBS    Reboot mark refs: 0

. . .

Судя по всему установщик ругается на попытку удаления отсутствующего компонента amd64_microsoft-windows-w..lient-aux.resources_31bf3856ad364e35_7.6.7601.23775_ru-ru_306f57c17eac5f89 из пакета Package_846_for_KB4019265~31bf3856ad364e35~amd64~~6.1.1.3.4019265-2966_neutral_LDR. Сам компонент оказался на месте вместе со собственным манифестом, поэтому не понятно что же не нравится стеку обслуживания. Тем не менее что-то с этим пакетом явно не так.

Окна ошибок в интерфейсе

Часто ошибки наблюдаются пользователем визуально, в виде статусов ошибок в окне Центра обновления Windows, но иногда их можно увидеть в автономных информационных окнах. Например, отказ запуска множества исполняемых системных образов может выражаться в постоянно всплывающих окнах, в заголовке которых можно видеть «<имя_образа> (в контексте которого произошел сбой) — ошибочный образ», а в информационной части текст ошибки: X:XXXXXXxxxxxxxx.dll либо не предназначен для выполнения под управлением Windows или содержит ошибку. Попробуйте переустановить программу с помощью исходного установочного носителя или обратитесь к системному администратору или поставщику программного обеспечения за поддержкой:

bad image

В английских версиях в заголовке можно увидеть «<filename> — bad image», а описание звучит как: «<filename> is either not designed to run on Windows or it contains an error. Try installing the program again using the original installation media or contact your system administrator or the software vendor for support.» Часто сообщение в окне дополняется специфической деталью сбоя, например кодом ошибки: «Error status 0xc000012f».

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

В данном случае, как вы можете видеть на снимке экрана выше, у нас повреждена библиотека с именем ncrypt.dll, относительно неё мы и поведем дальнейшее повествование.

Тем не менее, в ваших случаях для выявления виновника сбоя потребуется исследовать лог-файл %WinDir%LogsCBSCBS.log и составить список проблемных файлов. И при не столь очевидных намеках на источник проблемы всегда начинайте исследование сбоя с анализа данного лог-файла.

Восстановление файлов

На предыдущем шаге мы определились в виновником ошибки, то есть определили имена поврежденных/удаленных файлов:

  • Если мы наблюдаем ошибку в виде информационного окна в графическом интерфейсе, то виновником обычно является модуль, имя которого фигурирует в тексте (в примере выше: ncrypt.dll). В этом случае мы будем менять все без исключения ревизии проблемного файла;
  • Если мы производим разбор лог-файлов отчетов сервисных утилит (CBS/DISM/CheckSur/SFCFix), то виновник(и) проблемы обычно предстают перед нами в виде списка конкретных файлов компонентов или обновлений;

Давайте в этом разделе опишем метод восстановления компонента прямой заменой файлов подробнее, разбив весь процесс на подразделы, подробно описывающие шаги.

Поиск рабочих экземпляров файлов

На этом этапе нам необходимо найти рабочие копии поврежденных или отсутствующих файлов. Существует несколько основных подходов по нахождению рабочих копий:

  1. Скопировать файлы с аналогичной, полностью работоспособной системы той же версии/редакции:
    • при помощи поиска (в проводнике, или любым специализированным средством типа Far/Total Commander) по системному разделу (обычно C:) находим все каталоги, содержащие в своем названии искомую маску/имя (для случая выше: *ncrypt*). Сокращенный вывод:

      . . .

      C:Windowswinsxsx86_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.24417_none_6072150268f96612

      C:Windowswinsxsamd64_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.18741_none_bbe0d7630856b4a1

      C:Windowswinsxsx86_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.24408_none_607de53868f06378

      C:Windowswinsxsamd64_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.18812_none_bc024957083d774c

      C:Windowswinsxsx86_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.24387_none_602663a869322c82

      C:Windowswinsxsamd64_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.18869_none_bbd33bc1085fb462

      C:Windowswinsxsx86_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.24384_none_602362ca6934e07d

      C:Windowswinsxsamd64_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.18923_none_bbf87b9b0844a9bb

      C:Windowswinsxsx86_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.24357_none_6046d36c6919d8af

      C:Windowswinsxsamd64_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.18933_none_bbedabaf084cc5ac

      C:Windowswinsxsx86_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.24335_none_605a72b0690b6e1f

      C:Windowswinsxsamd64_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.18939_none_bbf3ad6b08475db6

      . . .

      Соответственно, в найденных директориях располагаются и подпадающие под маску файлы (ncrypt.dll). Как можно увидеть по именам каталогов, они предназначаются для хранения различных ревизий компонента, включающего в себя файл ncrypt.dll. Но определить точно какая именно ревизия используется тем или иным приложением сложно, поскольку используются обычно сразу несколько ревизий.

      Можно произвести замену файлов и в системных каталогах, таких как C:Windowssystem32. Хотя делать это не обязательно, поскольку файлы там представляет собой жесткие ссылки на оригиналы в хранилище WinSxS, а они восстанавливаются автоматически при проверке через sfc).

    • в ходе того же самого поиска, кроме директорий, выявляются и файлы, которые располагаются по следующим путям (вывод сокращен):

      . . .

      C:WindowswinsxsManifestsamd64_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.24408_none_bc9c80bc214dd4ae.manifest

      C:WindowswinsxsManifestsx86_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.18741_none_5fc23bdf4ff9436b.manifest

      C:WindowswinsxsManifestsamd64_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.24387_none_bc44ff2c218f9db8.manifest

      C:WindowswinsxsManifestsx86_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.18812_none_5fe3add34fe00616.manifest

      C:WindowswinsxsManifestsamd64_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.24384_none_bc41fe4e219251b3.manifest

      C:WindowswinsxsManifestsx86_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.18869_none_5fb4a03d5002432c.manifest

      C:WindowswinsxsManifestsamd64_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.24357_none_bc656ef0217749e5.manifest

      C:WindowswinsxsManifestsx86_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.18923_none_5fd9e0174fe73885.manifest

      C:WindowswinsxsManifestsamd64_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.24335_none_bc790e342168df55.manifest

      C:WindowswinsxsManifestsx86_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.18933_none_5fcf102b4fef5476.manifest

      C:WindowswinsxsManifestsamd64_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.24308_none_bc9c7ed6214dd787.manifest

      C:WindowswinsxsManifestsx86_microsoftwindowsncryptdll_31bf3856ad364e35_6.1.7601.18939_none_5fd511e74fe9ec80.manifest

      . . .

  2. Разархивировать требуемые файлы из пакета обновления.
    • Для этого определяем имя обновления KBXXXXXXXX, в состав которого входят обнаруженные на предыдущем шаге файлы, из Центра загрузок Майкрософт или Центра обновления Майкрософт или попросту используя поиск.
    • Распаковываем содержимое выкачанного только что пакета обновления (.msu) в произвольную (временную) директорию:

      expand -F:* windows6.1-kb4019265-x64_c21fb9314da54cf6bd7972581da3159535f55aec.msu c:temp4019265

    • после чего в целевой директории мы увидим следующее содержимое:
      • .xml-файл — метаданные-описатели пакета обновления (.msu). Утилиты установки используют .xml-файл при выполнении установки в автоматическом режиме;
      • .cab-файл — архив с данными (полезная нагрузка) обновления;
      • *-pkgProperties.txt — файл с описанием свойств пакета (дата релиза, архитектура, тип, ссылка на KB и прочее);
      • WSUSSCAN.cab — файл оффлайн-сценария проверки;
    • затем выполняем еще одну команду, теперь уже над только что распакованным .cab-файлом:

      expand -F:* windows6.1-kb4019265-x64.cab c:temp4019265extracted

    • после этого необходимые нам для замены файлы будут располагаться в директории c:temp4019265extracted

Установка безопасности для каталогов/файлов

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

Выполнять приведенные здесь действия следует из-под учетной записи с правами локального Администратора (с эскалацией привилегий).

Сделать это можно двумя способами:

  1. Через проводник. Нажимаем правую клавишу мыши на директории WinSxS — пункт Свойства — вкладка Безопасность — кнопка Дополнительно — вкладка Владелец — кнопка Изменить — ставим курсор на нужного нам пользователя, активируем чекбокс Заменить владельца подконтейнеров и объектов — жмем кнопку Применить. После окончания процесс закрываем все открытые окна через кнопку OK, повторно жмем правую клавишу мыши на директории WinSxS — вкладка Безопасность — во фрейме Группы и пользователи кнопка Изменить — выделяем курсором группу Администраторы — ставим разрешения Изменение и Запись;
  2. Через командную строку. Из командной строки (cmd) выполняем следующие команды:

    takeown /f c:windowswinsxs*

    сменить владельца takeown

    даем группе Администраторы (в которую, я надеюсь, включена ваша учетная запись) полный доступ к целевому файлу, для этого выполняем следующую команду:

    icacls c:windowswinsxs* /GRANT АДМИНИСТРАТОРЫ:F

    назначение прав icacls

Копирование каталогов/файлов

И последним шагом выполняется непосредственно копирование (с заменой) с донорской (исправной) системы на целевую (проблемную) содержимого всех обнаруженных на предыдущих шагах каталогов и файлов, не забывайте так же и .manifest-файлы.
Что именно мы копируем:

  1. Если присутствуют пара .cat или .mum файлов компонента, то скопировать их в каталог %WinDir%servicingPackages (с донора на цель). Копировать именно всю пару, даже если поврежден всего-лишь один из них (и один из них отображается в лог-файле);
  2. Если к паре .cat/.mum файлов присутствует еще и .ses-файл, то копируем и его;
  3. Если присутствуют одноименные манифесты (.manifest-файл(ы)) компонента, то скопировать их в каталог %WinDir%WinSxSManifests (с донора на цель);
  4. Если присутствуют остальные подкаталоги/файлы компонента, то скопировать их в каталог компонента %WinDir%WinSxSимя_компонента (c донора на цель);
  5. Если присутствуют файлы в директории C:WindowsSystem32, то можно скопировать и их (с донора на цель). Хотя делать это и не обязательно, поскольку жесткие ссылки восстанавливаются при проверках через sfc;

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

Восстановление реестра

Обычно файловых исправлений бывает достаточно для того, что бы устранить ошибки в компонентной модели Windows, соответственно, исправить ошибки, происходящие в процессе установки обновлений. Тем не менее, бывают случаи, когда повреждается еще и реестровая часть компонента, тогда требуется производить дополнительные действия по восстановлению:

  • Запустить командную строку (cmd);
  • Подключить динамический куст реестра HKLMCOMPONENTS командой:

    reg load HKLMCOMPONENTS C:WINDOWSSYSTEM32CONFIGCOMPONENTS

    если выскакивает ошибка:

    процесс не может получить доступ к файлу, так как этот файл занят другим процессом.

    то куст уже подключен.

  • Запустить редактор реестра regedit;
  • В открывшемся окне нажать Ctrl+F и ввести имя компонента, который вы восстанавливали на предыдущем шаге;
  • В случае отсутствия каких либо записей реестра, выполнить импортирование соответствующих записей реестра о компоненте с рабочей машины;
  • Выполнить команду:

    reg unload HKLMCOMPONENTS

  • выполнить перезагрузку операционной системы;

Возможно, вам также будет интересно:

  • Восстановления жесткого диска на ошибки и битые сектора
  • Восстановление чертежа в автокаде после фатальной ошибки
  • Восстановление флешки не форматируется ошибка
  • Восстановление файлов word ошибка при открытии файлов
  • Восстановление файла автокад после фатальной ошибки

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии