Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 2482 - Не устанавливается сервиспак на КОМПАС-3D V10   Make a simular bug
Summary: Не устанавливается сервиспак на КОМПАС-3D V10
Status: CLOSED FIXED
Alias: None
Product: КОМПАС 3D
Classification: Поддержка проектов
Component: Тестирование (show other bugs)
Version: v10
Hardware: PC All
: P2 critical
Target Milestone: ---
Assignee: Денис Баранов
QA Contact: Денис Баранов
URL:
Whiteboard:
Keywords:
Depends on: 2499 2501 4129
Blocks: 753 5513 7073
  Show dependency treegraph
 
In work:
Reported: 2008-09-22 10:30 MSD by Виталий Булгаков
Modified: 2024-03-04 14:58 MSK (History)
6 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments
Ошибка при запуске Компаса после winetricks vcrun2005 (6.23 KB, image/png)
2010-11-18 03:58 MSK, Александр Морозов
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Виталий Булгаков 2008-09-22 10:30:43 MSD
Не устанавливается сервиспак на КОМПАС-3D V10. Пробегает индикатор прогресса распаковки после чего процесс прекращается.
Сервиспак можно скачать по адресу http://download.kompas.kolomna.ru/public/Kompas-3D_V10/SP1/KOMPAS-3D_V10_SP1.zip
Comment 1 Виталий Перов 2008-09-22 19:32:04 MSD
При извлечении файлов возникает ошибка.
err:msi:ready_media Cabinet not found: L"C:\\windows\\Installer\\Data1.cab"

Data1.cab в C:\\windows\\Installer нет, зато там есть *.msi (имя при каждой установке разное), оставшейся от установки Компаса.
Если его удалить, при обновлении даже не показывается диалог установки. Получается, что запускается именно этот *.msi
Только вот не понятно откуда берётся Data1.cab
По идее он должен распаковываться из KOMPAS-3D_V10_SP1.EXE, но этого явно не происходит.

сразу при запуске в консоле:
fixme:advapi:DecryptFileA "C:\\windows\\temp\\IXP000.TMP\\" 00000000

сейчас вместо этой функции заглушка.
По описанию, она должна дешифровывать зашифрованный файл. Притом шифрование, если я правильно понял, осуществляется на уровне файловой системы (The Encrypted File System, or EFS, was introduced in NTFS 5.0)

При завершении программы C:\\windows\\temp\\IXP000.TMP удаляется.
Но перед удалением можно посмотреть, что это пустая папка.
Comment 2 Виталий Перов 2008-09-22 20:45:15 MSD
проваливается внутренняя функция find_published_source

Сначала она вызывает MsiSourceListGetInfoW. Она возвращает корректный путь к исходному файлу установки C:\\Kompas3DV10_Demo\\Data1.cab

далее в цикле вызывается MsiSourceListEnumMediaDisks, которая должна получать список дисков, зарегистрированных как источники для данного продукта.

Цикл выполняется только 1 раз, и сравнение пути к исходному файлу с путём, полученным из MsiSourceListEnumMediaDisks.
Сравнение производится функцией source_matches_volume, котороя проваливается с сообщением:
err:msi:source_matches_volume Failed to get volume information
Comment 3 Виталий Перов 2008-09-22 21:27:12 MSD
внутри GetVolumeInformationW используется функция GetDriveTypeW для получения типа устройства. Как-раз она и проваливается.
По MSDN в качестве входного параметра туда передаётся строка, в которой указан корень диска.
Сейчас туда передаётся полный путь вместе с именем файла.
Надо написать тест и проверить как виндовая функция воспринимает полный путь 
Comment 4 Виталий Перов 2008-09-22 21:57:30 MSD
Создал тест, проверил на винде. На винде тоже не работает.
Но, если отбрасывать имя файла, и оставлять только имя директории, то функция завершается успешно.
Comment 5 Виталий Перов 2008-09-22 22:30:32 MSD
написал тест на GetVolumeInformation. Функция тоже не работает, когда в качестве входного параметра указывается файл, а не директория.

Думаю, надо во внутренней функции source_matches_volume определять содержит ли путь название файла, и если содержит, то удалять его.
Comment 6 Виталий Перов 2008-09-23 16:43:43 MSD
Реализовал удаление из пути имени файла. Не помогло
Попробовал запустить тест, передающий GetDriveType путь к текущей директории:
Локально результат верный = 3.
В бутылке завершается с ошибкой во всех директориях диска с:
Comment 7 Виталий Перов 2008-09-23 17:41:10 MSD
Как-то странно:
GetDriveType выполняется успешно, но когда она вызывается из GetVolumeInformation, то она проваливается.

Ещё GetVolumeInformation по-разному работает на локальном диске, и из бутылки.
Разница в том, что в бутылке диск С это папка, а локально - это диск Z, который уже ссылка.
Когда тест запускается локально, GetVolumeInformation идёт по другому пути CreateFileW( device .... открывается успешно, и GetDriveType не вызывается


В том и в другом случае GetVolumeInformation не может получить имя диска.
Думаю в данном случае нужно получать имя вручную, не вызывая GetVolumeInformation.
Comment 8 Виталий Перов 2008-09-23 18:41:07 MSD
Возникла проблема: нужна именно метка диска, а не его корневая директория
MsiSourceListEnumMediaDisks возвращает метку DISK1.
Поэтому вручную из пути получить такую метку невозможно

Есть ещё проблема:
Сейчас в wine метки нет, поэтому должна возвращаться пустая строка, но никак не DISK1. (Проверял в винде: если метки нет, то возвращается пустая строка)

Поэтому исправление GetVolumeInformation проблему не решит.

Думаю придётся делать хак на find_published_source.
Вряд ли источник установки может находится сразу на нескольких дисках, поэтому можно не выполнять принадлежность источника установки к дискам.
Comment 9 Виталий Перов 2008-09-23 18:54:48 MSD
Обнаружил ещё проблему:
Имя файла получается путём прибавления к строке mi->source строки mi->cabinet.
Сейчас  mi->source содержит путь вместе с именем файла. В результате получается:
C:\Kompas3DV10_Demo\Data1.cabData1.cab

Очевидно, строка mi->source должна содержать только путь к файлу.
Строку эту возвращает функция MsiSourceListGetInfo, а берёт она её из реестра.
Либо в реестре записано неправильное значение, либо сама функция должна из пути извлекать директорию.

В принципе, можно написать хак, убрав строку lstrcatW(mi->source, mi->cabinet);
Т.е брать путь к файлу только из mi->source. Но я думаю лучше всё проверить и нормально исправить ошибки
Comment 10 Виталий Перов 2008-09-23 19:31:01 MSD
Т.к бага срочная, написал временный хак. Отправил в рассылку.
Comment 11 Виталий Перов 2008-09-23 20:02:34 MSD
путь к источнику находится в 
HKEY_LOCAL_MACHINE\Software\Classes\Installer\Products\F1E4273BF20F3D9449BD8C51932AD7F9\SourceList.

В wine он включает в себя и имя файла.

Проверил в винде: там путь не включает имя файла.
Получается, это ошибка при установке Компаса
Comment 12 Виталий Перов 2008-09-23 20:58:20 MSD
Проверил в windows, по ключу HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\F1E4273BF20F3D9449BD8C51932AD7F9\SourceList\Media
значение 1=DISK1;1
Получается, что DISK1 это не метка диска, с которого производилась установка (метка была SYSTEM).

Значит работает неправильно или функция MsiSourceListEnumMediaDisks или функция find_published_source 
Comment 13 Виталий Перов 2008-10-04 20:33:39 MSD
Необходимо исправить временный патч с учётом закрытия ошибки 2501.
Сейчас он должен работать неправильно.
Comment 14 Виталий Перов 2008-10-05 16:25:46 MSD
Исправил временный патч
Comment 15 Виталий Перов 2008-10-05 19:04:46 MSD
Проверил на винде работу функции MsiSourceListEnumMediaDisks - там она тоже выдаёт метку диска VolumeLabel = "DISK1", хотя метка диска на той машине "SYSTEM"

Получается, что "DISK1" это не метка диска, и врядли из "DISK1" можно получить метку диска.
Поэтому искать последний источник во всех источниках надо по другому параметру

Comment 16 Виталий Перов 2008-10-05 21:10:08 MSD
Вообще, в реестре для последнего источника содержится и номер источника:
LastUsedSource = n;3;C:\windows\Installer\
Но при вызове MsiSourceListGetInfo (с атрибутом INSTALLPROPERTY_LASTUSEDSOURCEW) можно получить только путь.

Стандартными WINAPI функциями номер источника никак не получить.

Остаётся только писать внутреннюю функцию (переписать MsiSourceListGetInfo), которая бы это делала
Comment 17 Виталий Перов 2008-10-06 18:58:00 MSD
Написал вспомогательную функцию.
Переделал find_published_source.
Проверил: работает.
Отправил патч в рассылку.
Comment 18 Денис Баранов 2009-07-29 20:31:44 MSD
WINE@Etersoft cad eter2.1/eter2
Ошибка снова воспроизводится. Лог получается такой:
fixme:advapi:DecryptFileA "C:\\windows\\temp\\IXP001.TMP\\" 00000000
fixme:msi:MsiSourceListGetInfoW Unhandled context 4
fixme:msi:MsiSourceListGetInfoW Unhandled context 4
err:msidb:msi_table_load_transform insert row failed
err:msidb:msi_table_load_transform insert row failed
err:msidb:msi_table_load_transform insert row failed
err:msidb:msi_table_load_transform insert row failed
err:msidb:msi_table_load_transform insert row failed
err:msidb:msi_table_load_transform insert row failed
err:msidb:msi_table_load_transform insert row failed
err:ole:CoGetClassObject class {6c736db1-bd94-11d0-8a23-00aa00b58e10} not registered
err:ole:CoGetClassObject no class object {6c736db1-bd94-11d0-8a23-00aa00b58e10} could be created for context 0x1
err:ole:CoGetClassObject class {6c736db1-bd94-11d0-8a23-00aa00b58e10} not registered
err:ole:CoGetClassObject no class object {6c736db1-bd94-11d0-8a23-00aa00b58e10} could be created for context 0x1
err:msi:ITERATE_Actions Execution halted, action L"ISQuickPatchInit" returned 1627
err:msi:ITERATE_Actions Execution halted, action L"ExecuteAction" returned 1627
err:msi:remove_tracked_tempfiles failed to delete L"C:\\windows\\temp\\msi9e94.tmp"
Comment 19 Александр Морозов 2009-07-31 13:33:23 MSD
/var/ftp/pvt/Windows/CAD - 3D/Kompas/KOMPAS-3D_V10_SP1.EXE успешно устанавливается на полную установку Компаса в CAD 1.1.0-eter2.1/2
Но при запуске Компаса появляются ошибки 'C:\Program Files\ASCON\KOMPAS-3D V10\Libs\Materials\MaterialK6.DLL (error 126)' и 'Ошибка подключения библиотеки "C:\...\Libs\Materials\MaterialK6.DLL"'
Comment 20 Vitaly Lipatov 2009-07-31 16:06:47 MSD
(In reply to comment #19)
> /var/ftp/pvt/Windows/CAD - 3D/Kompas/KOMPAS-3D_V10_SP1.EXE успешно
> устанавливается на полную установку
> Компаса в CAD 1.1.0-eter2.1/2
> Но при запуске Компаса появляются ошибки
> 'C:\Program Files\ASCON\KOMPAS-3D V10\Libs\Materials\MaterialK6.DLL (error
> 126)' и 'Ошибка подключения библиотеки
> "C:\...\Libs\Materials\MaterialK6.DLL"'

Что за ошибка с номером 126?
Быть может какой-то лимит?
Наверное надо установить на Windows, появится ли там этот файл?

Comment 21 Виталий Булгаков 2009-07-31 17:18:18 MSD
Справка: MaterialK6.DLL - библиотека интеграции КОМПАС с библиотекой (справочником) Материалы и Сортаменты ...Libs\Materials\Materials.exe. Работают через COM. Сам Materials.exe работает с базой MatSort.MDB через ADO.
ошибка 126 обычно вызывается тем, что:
1. Не хватает (недоустановились) какие-то библиотеки (dll)
2. Требуемые библиотеки не той версии (грубо говоря, не подходят). Т.е. при установке СП либо исходного продукта часть файлов могла недоустановится или не обновится.
Comment 22 Александр Морозов 2009-08-03 14:36:54 MSD
Created attachment 1275 [details]
Ошибка при запуске Компаса после winetricks vcrun2005
Comment 23 Александр Морозов 2009-08-03 14:37:58 MSD
Проблема с загрузкой DLL связана с отсутствием в WINE библиотек MFC80U.DLL и MSVCR80.DLL:

$ winedump -x MaterialK6.DLL | grep '^  offset.*[lL]$'
  offset 0003067c kAPI2D5.DLL
  offset 00030690 MFC80U.DLL
  offset 000306a4 MSVCR80.dll
  offset 000306b8 KERNEL32.dll
  offset 000306cc USER32.dll
  offset 000306e0 GDI32.dll
  offset 000306f4 ADVAPI32.dll
  offset 00030708 ole32.dll
  offset 0003071c OLEAUT32.dll

После winetricks vcrun2005 при запуске Компаса появляется новое сообщение об ошибке (см. аттач выше).
Comment 24 Александр Морозов 2009-08-03 18:08:23 MSD
От сообщений об ошибках можно избавиться, выполнив
winetricks vcrun2005
winetricks vcrun2005sp1

До установки библиотек:
fixme:actctx:parse_depend_manifests Could not find dependent assembly L"Microsoft.VC80.CRT" (8.0.50727.762)
err:module:import_dll Library MFC80U.DLL (which is needed by L"C:\\Program Files\\ASCON\\KOMPAS-3D V10\\Libs\\Materials\\MaterialK6.DLL") not found
err:module:import_dll Library MSVCR80.dll (which is needed by L"C:\\Program Files\\ASCON\\KOMPAS-3D V10\\Libs\\Materials\\MaterialK6.DLL") not found

После winetricks vcrun2005:
fixme:actctx:parse_depend_manifests Could not find dependent assembly L"Microsoft.VC80.CRT" (8.0.50727.762)
trace:loaddll:load_native_dll Loaded L"C:\\windows\\system32\\MSVCR80.dll" at 0x78130000: native
trace:loaddll:load_native_dll Loaded L"C:\\windows\\system32\\MFC80U.DLL" at 0x782e0000: native
trace:loaddll:load_native_dll Loaded L"C:\\Program Files\\ASCON\\KOMPAS-3D V10\\Libs\\Materials\\MaterialK6.DLL" at 0xe760000: native

После winetricks vcrun2005sp1:
trace:loaddll:load_native_dll Loaded L"C:\\windows\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700\\MSVCR80.dll" at 0x78130000: native
trace:loaddll:load_native_dll Loaded L"C:\\windows\\winsxs\\x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_3bf8fa05\\MFC80U.DLL" at 0x782e0000: native
trace:loaddll:load_native_dll Loaded L"C:\\Program Files\\ASCON\\KOMPAS-3D V10\\Libs\\Materials\\MaterialK6.DLL" at 0xe540000: native
Comment 25 Vitaly Lipatov 2009-08-07 10:43:34 MSD
Раз уж ты не стал проверять установку только с vcrun2005sp1, проверь пожалуйста сборку 1.1.0-eter4 (пакеты установлены на kompas, или в /var/ftp/pub/download/WINE@Etersoft-CAD), я туда включил vcrun2005sp1
Comment 26 Александр Морозов 2009-08-07 13:23:10 MSD
В 1.1.0-eter4 проблема осталась:
fixme:actctx:parse_depend_manifests Could not find dependent assembly L"Microsoft.VC80.CRT" (8.0.50727.762)
trace:loaddll:load_native_dll Loaded L"C:\\windows\\system32\\MSVCR80.dll" at 0x78130000: native
trace:loaddll:load_native_dll Loaded L"C:\\windows\\system32\\MFC80U.DLL" at 0x782e0000: native
trace:loaddll:load_native_dll Loaded L"C:\\Program Files\\ASCON\\KOMPAS-3D V10\\Libs\\Materials\\MaterialK6.DLL" at 0xe6b0000: native

Появляются окошки с сообщениями об ошибках.
Comment 27 Александр Морозов 2009-09-03 15:39:15 MSD
При установке SP1 почему-то удаляется часть файлов из c:/windows/winsxs, созданных при установке vcrun2005 и vcrun2005sp1.
Comment 28 Александр Морозов 2009-09-09 17:00:36 MSD
Действие SxsUninstallCA, удаляющее часть файлов из c:/windows/winsxs, выполняется, если истинно условие "((Installed AND NOT REINSTALL) OR MsiPatchRemovalList) AND (NOT Version9X)". Installed в этом условии оказывается равно "1", а REINSTALL оказывается не установлено. Первоначально REINSTALL устанавливается в "ALL", но затем некое действие его зачем-то сбрасывает. Если подправить MSI_SetPropertyW так, чтобы REINSTALL не сбрасывался, то файлы не удаляются.

Фрагмент лога со сбросом REINSTALL:
trace:msi:MSI_ProcessMessage 4000000
trace:msi:MSI_ProcessMessage ((nil) 0 10 L"The QUICKPATCH_REINSTALL property is empty. Potentially, nothing is going to get installed.")
trace:msi:MsiCloseHandle 7
trace:msi:MsiCloseHandle handle 7 destroyed
trace:msi:msiobj_release object 0x10ba8f0 destroyed
trace:msi:alloc_msihandle 0x10ba8f0 -> 7
trace:msi:MSI_ProcessMessage 4000000
trace:msi:MSI_ProcessMessage ((nil) 0 10 L"Setting REINSTALL to NULL")
trace:msi:MsiCloseHandle 7
trace:msi:MsiCloseHandle handle 7 destroyed
trace:msi:msiobj_release object 0x10ba8f0 destroyed
trace:msi:MSI_SetPropertyW 0x12e998 L"REINSTALL" L""
Comment 29 Александр Морозов 2009-09-09 18:37:43 MSD
В логе установки под Windows REINSTALL тоже устанавливается в NULL, и действие SxsUninstallCA выполняется.
Comment 30 Александр Морозов 2009-09-11 15:53:13 MSD
Если vcrun2005sp1 устанавливать второй раз, то происходит удаление файлов из c:/windows/winsxs. При этом в логах, как и при установке SP1, присутствует вызов функции CustomAction_SxsMsmCleanup. Похоже, что в SP1 входит та же DLL, что и в установщик vcrun2005sp1.
Comment 31 Александр Морозов 2009-09-11 16:13:59 MSD
> Если vcrun2005sp1 устанавливать второй раз, то
> происходит удаление файлов из c:/windows/winsxs.
В Wine 1.1.29 проблема не воспроизводится.
Comment 32 Александр Морозов 2009-09-14 16:37:42 MSD
В Wine 1.1.25, на котором основан etercad, проблема есть.
Comment 33 Александр Морозов 2009-09-14 17:17:01 MSD
2 lav: Будем ли мы мерджить оригинальный wine в etercad? Или просто возьмём из оригинального wine определённые нужные нам патчи?
Comment 34 Александр Морозов 2011-02-17 02:05:07 MSK
Надо протестировать на текущем eterhack. Возможно, проблемы уже давно нет.
Comment 35 Andrey Vusik 2011-02-25 15:26:40 MSK
(В ответ на comment #34)
> Надо протестировать на текущем eterhack. Возможно, проблемы уже давно нет.

В текущем eterhack устанавливается корректно.
Comment 36 Денис Баранов 2011-02-25 20:09:59 MSK
Закрываем раз работает.