Виправлення помилки Windows Installer 0x80040154
У цій статті я розповім про виправлення однієї дуже поширеної помилки Windows Installer. Обшукавши Інтернет як українськомовний, так і англомовний, включаючи форуми та ньюсгрупи Microsoft, я зрозумів, що помилка досить поширена, проте виправити її, насправді нікому не вдавалося.
Суть проблеми
Якось одним спекотним літнім вечором я вирішив встановити на свій комп'ютерActeiveState ActivePerl. Завантажив інсталятор, який був у файлі.msiі запустив його. Яке ж було моє здивування, коли замість звичного інсталятора я побачив ось це:

Як незабаром виявилося, подібна помилка випадала під час запуску на моєму комп'ютері будь-якого файлу.
Недовго думаючи, я поліз в інтернет, ввів у пошук повідомлення, що з'явилося, і, «О жах!» — я побачив сотні постів людей із цією проблемою! В українськомовному та англомовному сегменті Інтернету у багатьох людей була аналогічна проблема, і ніхто її не зміг вирішити по суті.
Найпоширенішими поради щодо вирішення проблеми були
- Перевстановити Windows Installer — на моїй Windows 7 x64 і так стоїть Windows Installer 5.0, який не можна завантажити та переустановити окремо
- Перереєструватиmsiexec, що мені також не допомогло.
- Наприкінці всі поради зводилися до одного -перевстановити Windows.
Рішення проблеми
Для початку я увімкнув Log-файл інсталятора Windows. Як увімкнути лог Windows Installer ви можете почитати тут, або пошукати в будь-якому пошуковику за ключовим словом "voicewarmup".
Лог-файли з'являються у тимчасовій папці користувача,яка зазвичай знаходиться на шляхуC:\Users\ім'я_профілю\AppData\Local\Temp. Відкривши балку, я побачив таку помилку:
MSI (c) (B8:84) [22:08:06:894]: Використовується для підключення до сервера. Error: 0x80040154
Пошукавши за кодом помилки в Інтернеті і не знайшовши ніяких способів вирішення проблеми, я вирішив подумати логічно.
Що означає помилка 0x80040154? Пошукавши в пошуковій системі, і скориставшись утилітою Error Lookup, я визначив, що помилка означає «Клас не зареєстрований».
Зазвичай така помилка з'являється, коли ви запитуєте систему створитиCOM-объект, який був належним чином зареєстрований у реєстрі. Але як визначити, який саме об'єкт не зареєстрований?
Для початку я скористався старим добрим налагоджувачемWinDbg, який входить до пакету Debugging Tools For Windows. Мені знадобилася саме 64-розрядна версія цього відладчика.
Перед початком налагодження необхідно завантажити символи налагодження для розпізнавання імен системних функцій і змінних. Ці символи є досить корисною річчю як пошуку помилок, але й у дослідження роботи Windows загалом.
Я віддаю перевагу вказувати налагоджувачу шлях для пошуку символів через змінне середовище_NT_SYMBOL_PATH, яке має бути задане як:C:\Symbols;srv*C:\Symbols*http://msdl.microsoft.com/ download/symbols. У цьому випадку папка C:\Symbols — це сховище завантажених символів на жорсткому диску, щоб відладчик щоразу не ліз в інтернет за ними.
Завантажив я в налагоджувач файлc:\windows\system32\msiexec.exeі задав для нього параметри командного рядка так, щоб він відкрив.msi файл. У моєму випадку параметром командного рядка було:/i "C:\Users\MAV\Desktop\ActivePerl-5.12.4.1205-MSWin32-x64-294981.msi"однакможна задавати шлях до будь-якого іншого файлу.msi.

Сам по собі відладчик, звичайно, не вирішить проблему, потрібно її локалізувати. Подумавши, які функції можуть створювати COM-об'єкти, я зупинився на CoCreateInstance, CoCreateInstanceEx та CoGetClassObject
Для встановлення точок переривання на ці функції вводимо в командному рядку відладчика: bp ole32!CoCreateInstance bp ole32!CoCreateInstanceEx bp ole32!CoGetClassObject Якщо точки зупинки у вас не ставляться, ви неправильно налаштували символи .
Після запуску програми (F5), спрацьовує точка зупинки наole32!CoCreateInstance. Якщо точка зупинки не спрацьовує, а випадає вікно з параметрами Wndows Installer, ви неправильно вказали параметри командного рядка для запуску.

Давайте тепер подивимося, з якого місця коду викликається створення нашого об'єкта, ми можемо натиснутиDebug->Step Out (Shift+F11). Мені довелося натиснути вказану комбінацію двічі, щоб вийти у вихідну функцію, що викликає.

Вихідна функція називаєтьсяmsi!CreateMsiServerProxyі, очевидно, знаходиться в модуліmsi.dll.
Звернімо увагу також на регістрrax, який дорівнює нашому коду помилки80040154. Щоб дізнатися вміст регіструrax, достатньо відкрити вікноRegisters, або ввести в командному рядку r rax .
Запам'ятавши ім'я функції, а також зразковий вид шуканого коду, я відкрив дизассемблер IDA Pro, і завантажив файл msi.dll. Слід зазначити пару особливостей даного відладчика: по-перше, IDA любить блокувати доступ до досліджуваного файлу, по-друге, вона створює в папці з файлом, що досліджується, кілька своїх файлів баз даних, так що я рекомендуюкопіювати досліджувані файли окрему папку. По-третє, IDA не завжди підвантажує файли із символами, тому рекомендую в зазначену окрему папку також скопіювати файлmsi.pdbз вищезгаданої папкиC:\Symbols.
Після знаходження функції CreateMsiServerProxy, знаходимо знайомі рядки коду в ній:

Не інакше як функція намагається створити об'єкт CLSID IID_IMsiServer. Тут я не буду вдаватися в подробиці COM і шукати відмінності між CLSID і IID, важливо, що я отримав зачіпку - ім'я інтерфейсуID_IMsiServerі CLSID.
Запустивши пошук у реєстрі на своїй машині за вказаними ключовими словами, а також на машині з інстальованою Windows 7 x64, де Windows Installer працював, я знайшов відмінність: на моїй машині була відсутня гілка реєструHKEY_CLASSES_ROOT\AppID\ . Я експортував цю гілку реєстру в окремий.regфайл, а потім імпортував його на своїй машині:
Windows Registry Editor Version 5.00
Після імпорту ключа реєстру я знову спробував запустити файл.msi, і, «О диво!», він запустився, після чого я успішно встановив ActivePerl.

У вас може бути аналогічна проблема, але при цьому відсутній інший ключ реєстру. Імпортувати при цьому необхідно ключі, яких у вас немає.
- У результаті я заощадив собі багато часу — на пошук проблеми та її усунення пішло не більше двадцяти хвилин, натомість на перевстановлення всіх програм на моєму комп'ютері пішло б мінімум два дні.
- Не треба поспішати встановлювати заново Windows по будь-якому чиху. Іноді проблему можна вирішити досить просто та швидко.
А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»
Написав гарний текст – отримавзапрошення.
У «Пісочниці» діє премодерація: перед публікацією всі матеріали проходять через дбайливе проміння НЛО.
З великою ймовірністю не пройдуть премодерацію: