Created attachment 247 [details] скрин1 При попытке установки Гарант7 любой из трёх версий(Локальная, Сервер, Файл-Сервер), копирование файлов начинается и вроде бы проходит успешно, но в конце появляется сообщение, что установка завершена преждевременно(скрин1). Если попытаться запустить garant.exe, то выскакивает ошибка, что файл garant.ini не найден(скрин2). В папке присутствуют файлы garant.ini.tmp и garant.ini.new, если любой из них переименовать в garant.ini, то первая ошибка не выскакивает, но появляется сообщение "Не могу найти файл "C:\Program Files\Garant-Nemesis\settings\garant.ini"(скрин3), но в Program Files папки Garant-Nemesis нет вообще. Одна и та же ошибка на трёх версиях Гаранта. Wine 1.0.8.
Created attachment 248 [details] скрин2
Created attachment 249 [details] скрин3
Посмотрю. Гарант - традиционно моя задача.
На первый взгляд - вообще чисто и без ошибок. Последние действия - над файлами msiXXXX.tmp - а потом сразу окно с ошибкой. Такое ощущение, что просто отсутствуют fixme, err и даже trace в сбойных местах.
Предположение саппорта - ошибка в SHFileOperation() пока не подтверждается. Все вызовы функции возвращают ERROR_SUCCESS.
Установщик безуспешно пытался найти mscoree.dll Поставил вместо неё заглушку - результат не изменился
А вообще mscoree в wine есть, просто установщик пытается проверить наличие самого файла. Идёт обращение к функции GetCORSystemDirectory, которая является заглушкой. Думаю надо поставить .Net Framework или взять нормальную mscoree.dll для проверки
Скачал родную mscoree.dll - ничего не изменилось. Сама GetCORSystemDirectory() возвращает директорию установленного .Net А если .Net не установлен..... Думаю надо протестировать данную функцию на Винде с .Net и без
Ещё существует лог инсталлятора Причину ошибки можно посмотреть в логе инсталлятора. Для 'включения' ведения лога, инсталлятор нужно запускать из командной строки с параметром /log. Это касается как общего (f1setup.exe), так и индивидуальных (\setup\f1[server|fileserver|local|client]setup*.exe) инсталляторов. В результате, в каталоге для временных файлов пользователя Windows (на который указывает системная переменная %temp%) будет создан файл вида msi<случайное число>.log, в который и будет протоколироваться информация о работе инсталлятора.
Если посмотреть лог, то можно уведеть, что инсталлятор создаёт кучу временных файлов и котологов, а потом, в конце их удаляет. Если заглянуть в установочный каталог, то там остаётся только 1 файл: settings.tmp
где произошла сама ошибка - непонятно. Последние строки файла: MSI (c) (11:13): Executing op: ComponentUnregister(ComponentId={6444A171-2496-4D7D-9E5C-DCF73E945233},ProductKey={6AC5411A-5F27-4CDB-9EED-3FA88FAE899D},BinaryType=0,) MSI (c) (11:13): Executing op: ComponentUnregister(ComponentId={8057B849-0E43-42ED-AD04-017C6A54693E},ProductKey={6AC5411A-5F27-4CDB-9EED-3FA88FAE899D},BinaryType=0,) MSI (c) (11:13): Executing op: ComponentRegister(ComponentId={30F950F8-E868-49ED-AB02-F2ECE2274F96},KeyPath=C:\Program Files\Garant-Local\settings-xml.tmp\,State=3,ProductKey={6AC5411A-5F27-4CDB-9EED-3FA88FAE899D},,SharedDllRefCount=0,BinaryType=0) MSI (c) (11:13): Executing op: ComponentRegister(ComponentId={5BDEEF52-E8F0-4201-98B7-57725E2B6D76},KeyPath=C:\Program Files\Garant-Local\settings.bad.tmp\,State=3,ProductKey={6AC5411A-5F27-4CDB-9EED-3FA88FAE899D},,SharedDllRefCount=0,BinaryType=0) MSI (c) (11:13): Executing op: End(Checksum=0,ProgressTotal=0) MSI (c) (11:13): Error in rollback skipped. Return: 5 MSI (c) (11:13): FEATURECACHE: Entering Invalidate MSI (c) (11:13): Closing MSIHANDLE (82) of type 790536 for thread 19 MSI (c) (11:13): Unlocking Server Завершение действия 20:05:29: INSTALL. Возвращенное значение 3. MSI (c) (11:13): Decrementing counter to disable shutdown. If counter >= 0, shutdown will be denied. Counter after decrement: -1 Завершение действия 20:05:29: ExecuteAction. Возвращенное значение 3. MSI (c) (11:13): Doing action: CustomFatalError Начало действия 20:05:29: CustomFatalError. Действие 20:05:29: CustomFatalError. Dialog created
(In reply to comment #5) > Предположение саппорта - ошибка в SHFileOperation() > пока не подтверждается. > Все вызовы функции возвращают ERROR_SUCCESS. > У меня почему-то эта функция вообще не вызывается
попробовал использовать нативную shell32.dll. В консоле выдаёт: err:thunk:_loadthunk (shell.dll, Shl3216_ThunkData16, shell32.dll): Unable to load 'shell.dll', error 2 и просит urlmon.dll
при добавлении shell.dll пишет: err:thunk:_loadthunk Unable to find thunk data 'Shl3216_ThunkData16' in shell.dll, required by shell32.dll (conflicting/incorrect DLL versions !?). а при добавлении urlmon.dll просит ещё wininet.dll
при использовании winexp установка продвигается значительно дальше
при запуске через wwo говорит, что нужна новая версия Windows Installer
хотя, скорее под win98 установка продвигается дальше: сначала идёт установка, а потом инсталлятор обрануживает ошибку, и делает откат, в итоге - в папке с Гарантом остаётся только 1 файл: settings.tpm В случае с winxp файлы остаются. Т.е отката не происходит
по файлу лога можно определить примерное место перехода установки в откат: MSI (c) (11:13): Executing op: CustomActionSchedule(Action=CALLENTRY_Move.Main.Settings.To.Temp.Location.OnDeferred,ActionType=1025,Source=BinaryData,Target=MovePathName,CustomActionData=Description=Move main settings to temp location;If_NEQ_LValue="%NEWF 1USERSSAVEVERSION%";If_NEQ_RValue="%OLDF1USERSSAVEVERSION%";FromPathName=C:\Program Files\Garant-Local2\settings\;ToPathName=C:\Program Files\Garant-Local2\settings.tmp\) MSI (c) (11:13): Creating MSIHANDLE (77) of type 790536 for thread 19 Action 12:54:56: MovePathName. Move main settings to temp location MovePathName: Abort Exception {Error = 0x00000643} Action ended 12:54:56: InstallFinalize. Return value 3.
различие запуска в ww и winexp: ww по умолчанию использует стороннюю msi.dll, а winxp - встроенную со сторонней: - не предлагается востановить, а устанавливается заново (скорее всего потому, что в прошлая установка выполнила почти полный откат) - устанавливает, встречает ошибку, и почти полностью откатывается. со встроеной: - определяет, что программа уже установлена. Можно только восстановить или удалить. - устанавливает, встречает ошибку, но отката не происходит
Попробовал установить Гарант на винде, а потом скопировать в бутылку. Ошибки о том, что он не может найти файл garant.ini не выскакивает ( если гарант будет именно в той папки, которая прописана в реестра), зато выскакивает сообщение: "Файлы данных отсутствуют или повреждены"
На винде та же ошибка. Наверное БД отсутствует
Действию Action=CALLENTRY_Move.Main.Settings.To.Temp.Location.OnDeferred соответствует запуск внешней msihlp32.dll с функцией MovePathName
Этой dll нет ни в Win98, ни в WinXP, даже google выдаёт 0 результатов. В Win98 c установленным Гарантом её тоже нет
Файл этот содержится в пакете установки (msi+cab), и видимо существует только в процессе установки. Возможны 2 варианта: 1) он не распаковывается в процессе установки 2) из msihlp32.dll : MovePathName() вызывается какая-то функция, которая завершается с ошибкой
Нужно уточнить, есть ли проблемы в новых сборках
Получены исходники msihlp32.dll. Можно продолжать работу
Код написан под Borland Delphi. Если я не ошибаюсь, то там должны использоваться Борландовские высокоуровневые процедуры, а к системе обращаться только более низкоуровнеми процедурами. Это значительно затрудняет отладку. Возникла идея перекомпиллировать исходники, добавив в начале и в конце функции легко заметные текстовые строки. Таким образом можно будет найти все вызовы и сообщения системных функций рядом с местом ошибки
точно сказать нельзя, но скорее всего ошибка появляется при вызове: dllMovePathName => DoFileFolderOperation (FO_MOVE, f_FromPathName, f_ToPathName) => SHFileOperation (l_SHFileOpStruct) SHFileOperation должна быть определена в ShellAPI
SHFileOperation оказалась WINAPI функцией. Она должна копировать, перемещать и удалять 1 или несколько файлов
Да, ошибка в этой функции. На 4-м вызове она возвращает код ошибки 1223, что соответствует ERROR_CANCELLED (The operation was canceled by the user)
Интересно, у тебя хоть какая-то причина обнаружилась. У меня все 4 вызова возвращали ERROR_SUCCESS, при этом установка откатывалась.
(In reply to comment #31) > Интересно, у тебя хоть какая-то причина > обнаружилась. > У меня все 4 вызова возвращали ERROR_SUCCESS, при > этом установка откатывалась. > скорее всего эта ошибка не единственная. Если принудительно возвращать ERROR_SUCCESS, то установка идёт немного дальше, но всё-равно преждевременно завершается
в 4-й раз SHFileOperation вызывается для перемещения файлов. Для этого внутри вызывается move_files. А там следующий код: if (!flFrom->dwNumFiles || !flTo->dwNumFiles) return ERROR_CANCELLED; т.е. не реализовано перемещение более 1 файла
ошибся... имел ввиду код if (!(lpFileOp->fFlags & FOF_MULTIDESTFILES) && flTo->dwNumFiles > 1 && flFrom->dwNumFiles > 1) { return ERROR_CANCELLED; }
входные параметры FromNum=0 TuNum=1 FOF_MULTIDESTFILES=0. Поэтому ошибка возвращается по условию if (!flFrom->dwNumFiles || !flTo->dwNumFiles)
Неправильно работает функция parse_file_list(). Она должна из строки формировать список файлов. передаваемая строка 'L"C:\\Program Files\\Garant-Local226\\settings\\*.*"'. Функция определяет, что там 0 файлов
если имя файла содержит символы * или ?, то parse_file_list() запускает функцию parse_wildcard_files, которая с помощью FindFirstFileW и FindNextFileW должна искать файлы в текущей директории
FindFirstFile не находит там ни одного файла file:FindFirstFileExW L"C:\\Program Files\\Garant-Local235\\settings\\*.*" 0 0x7e34e270 0 (nil) 0 По окончанию установки этой директории уже не существует. Возможно и не существовало. Ещё возможно, что директория была пустая. Думаю надо создать тест, и проверить поведение Windows и Wine в этих случаях
добавил в shell32/testst тест, который показывает, что в случае копирования файлов из одной папки в другую с маской '*.*' функция SHFileOperation возвращает ошибку. Таким образом функция проваливается, хотя гарантированно есть папка, а в ней лежат файлы. Получается, что тест всё-таки надо было писать для FindFirstFile, который в данном случае не может найти ни единого файла
FindFirstFile работает без проблем. Приведённый тест возвращает код ошибки при условии if ((lpFileOp->fFlags & FOF_MULTIDESTFILES) && flFrom->dwNumFiles != flTo->dwNumFiles) В нашем случае 3 входных файла и 1 выходной (который является директорией). Думаю просто функция не умеет обрабатывать случай, когда в качестве выходного пути используется директория. Ещё попутно заметил, что во входные файлы при раскрытии '*.*' кроме файлов попадают ещё и директории. Необходимо проверить как в данном случае поступает Windows: перемещает только файлы в текущем каталоге, или перемещает всё дерево
В принципе в функции реализована обработка таких ситуаций, но при условии, что бит FOF_MULTIDESTFILES не выставлен. по MSDN бит должен быть выставлен в случае, если указано несколько файлов назначения или одна папка. при исправлении некоторых условий тест проходит
но Гарант всё-равно не ставится. Возникает ошибка, когда количество входных файлов = 0. Т.е копирование из пустой директории. Думаю необходимо создать тест и на эту багу
После исправления этой ошибки возникла ещё одна ошибка: Попытка копировать 3 файла в 0: FROM=L"C:\\Program Files\\Garant-Local3\\settings\\*.* TO=L"C:\\Program Files\\Garant-Local3\\settings.tmp\\*.* папка settings.tmp - пустая, поэтому и получается 0 файлов Думаю в данном случае ещё до вызова parse_file_list следует убирать из пути TO '*.*'.
При удалении из пути назначения '*.*' SHFileOperation работает нормально. Но Гарант по-прежнему не устанавливается
После вмесения изменений функция SHFileOperation вызывается уже не 4 раза а 9. Завершается функция успешно. Но, если сравнить 2 лог файла установки до и после исправлений, то они ничем не отличаются! Последние строки: Action 15:50:42: RemovePathName. Remove temp settings Action 15:50:43: MovePathName. Move main settings to temp location Очевидно, что ошибка возникает в той же операции. Возможно (но маловероятно), что операция возвращает ERROR_SUCCESS, однако нужные файлы не копирует, а затем следует проверка в функции MovePathName, которая и завершает программу аварийно.
Ещё возможно преждевременное завершение из-за отсутствия реализаций некоторых операций msi: fixme:msi:msi_unimplemented_action_stub RemoveRegistryValues -> 1 ignored L"RemoveRegistry" table values fixme:msi:msi_unimplemented_action_stub RemoveShortcuts -> 8 ignored L"Shortcut" table values fixme:msi:msi_unimplemented_action_stub RemoveFolders -> 43 ignored L"CreateFolder" table values
Created attachment 494 [details] Скрин лога Как видно из скрина, сразу после завершения SHFileOperation выполняется комманда DllThread CustomAction (47), которая завершается с кодом 1603. В итоге установка завершается с ошибкой
Этот СustomAction ни о чём не говорит. Т.к при использовании встроенной msi.dll числа могут быть другими. При использвании нативной msi.dll получается следующий лог: RemovePathName: Return Results {Error = 0x00000000 (IsConditionTrue = Yes), PathName = `C:\Program Files\Garant-Local\settings.tmp\`} Action 20:49:49: CALLENTRY_Move.Main.Settings.To.Temp.Location.OnDeferred. Action 20:49:49: MovePathName. Move main settings to temp location MovePathName: Abort Exception {Error = 0x00000643} Action ended 20:49:49: InstallFinalize. Return value 3. Action 20:49:49: Rollback. Rolling back action: Rollback: CALLENTRY_Move.Main.Settings.To.Temp.Location.OnDeferred Rollback: CALLENTRY_Remove.Temp.Settings.OnDeferred
при запуске аналогичным образом, но без всех исправлений сделанных в SHFileOperation получается абсолютно идентичный лог установки
в MovePathName Abort() вызывается в 2-х местах: 1) Если SHFileOperation вернула не 0 2) Если (операция либо перемещение либо удаление) и (from указано как *.*) и (директория откуда производилась операция существует) и ( операция RemoveDir прошла с ошибкой) Думаю проблемы могут быть в RemoveDir. Эта функция Delphi. Необходимо проверить какие системные функции она использует
RemoveDir использует системную функцию WINAPI RemoveDirectory. Которая завершается с ошибкой потому, что директория не пустая. А происходит это по следующей причине: SHFileOperation запускается для перенесения настроек из папки FROM = L"C:\\Program Files\\Garant-Local\\settings\\*.*" в папку TO = L"C:\\Program Files\\Garant-Local\\settings.tmp" при этом фунция рекурсивно вызывает себя для перемещения субдиректорий. В итоге, после вызова все файлы перемещаются, а дерево каталогов остаётся, поэтому RemoveDirectory не может удалить L"C:\\Program Files\\Garant-Local\\settings"
для перемещения папок move_files() использует вспомогательную функцию move_dir_to_dir, которая для этого вызывает SHFileOperation в параметрах передаётся исходная директория с маской '*.*', но после перемещения исходна директория не удаляется. При вызове в конце RemoveDirectory ГАРАНТ УСТАНАВЛИВАЕТСЯ!
В чем может быть проблема? Скачал по этой, присланной мне ссылке: ftp://updates.etersoft.ru/pub/download/WINE@Etersoft/27AD-259D-5g3s3kg2es/Network-1.0.9/ArchLinux/2007.08/wine-etersoft-network-1.0.9.tar.gz (версия под archlinux), но Гарант все равно не ставится. Устанавливаю в режиме Клиент-Сервер. Получаю: Мастер установки бла-бла v7.01.0.013 был преждебременно завершен по причине ошибки. Затем диалоговое окно: An error occured installing the package. Windows Installer returned "1627". Вот листинг консоли установки: " $ winexp f1setup.exe Running in NT environment... err:wineusb:ServiceMain bad hardware ID err:wineusb:ServiceMain bad hardware ID fixme:msi:msi_unimplemented_action_stub MigrateFeatureStates -> 2 ignored L"Upgrade" table values fixme:msi:msi_unimplemented_action_stub MigrateFeatureStates -> 2 ignored L"Upgrade" table values fixme:msi:ACTION_CustomAction Rollback only action... rollbacks not supported yet fixme:msi:ACTION_CustomAction Rollback only action... rollbacks not supported yet fixme:msi:ACTION_CustomAction Rollback only action... rollbacks not supported yet fixme:msi:ACTION_CustomAction Rollback only action... rollbacks not supported yet fixme:msi:ACTION_CustomAction Rollback only action... rollbacks not supported yet fixme:msi:ACTION_CustomAction Rollback only action... rollbacks not supported yet fixme:msi:ACTION_CustomAction Rollback only action... rollbacks not supported yet fixme:msi:ACTION_CustomAction Rollback only action... rollbacks not supported yet fixme:msi:ACTION_CustomAction Rollback only action... rollbacks not supported yet fixme:msi:msi_unimplemented_action_stub DeleteServices -> 2 ignored L"ServiceControl" table values fixme:msi:msi_unimplemented_action_stub RemoveRegistryValues -> 2 ignored L"RemoveRegistry" table values fixme:msi:msi_unimplemented_action_stub RemoveShortcuts -> 9 ignored L"Shortcut" table values fixme:msi:msi_unimplemented_action_stub RemoveFolders -> 44 ignored L"CreateFolder" table values err:rpc:I_RpcReceive we got fault packet with status 0x3e6 err:msi:ITERATE_InstallService Failed to create service L"GARANT.Application.Server": 998 err:msi:ITERATE_StartService Failed to open service L"GARANT.Application.Server" err:msi:ITERATE_Actions Execution halted, action L"InstallFinalize" returned 1627 err:msi:ITERATE_Actions Execution halted, action L"ExecuteAction" returned 1627
Да, действительно, установка серверной версии завершается с ошибкой. Локальная версия устанавливается без проблем.
ошибка возникает при выполнения действия Action 15:40:16: StartServices. Starting services в консоле: err:msi:ITERATE_StartService Failed to open service L"GARANT.Application.Server"
при выборе канала service: trace:service:svcctl_OpenServiceW (L"GARANT.Application.Server", 0x10) err:ntdll:RtlpWaitForCriticalSection section 0x110688 "?" wait timed out in thread 0023, blocked by 0013, retrying (60 sec) дальнейшее завершение программы только по Ctrl+С
проблема в svcctl_OpenServiceW: она либо повисает, ожидая выхода из критической секции, либо возвращает ошибку 1060 (Service doesn't exist)
Проверил после обновления исходников wine. Программа стала вести себя по-другому. Теперь: err:msi:ITERATE_Actions Execution halted, action L"InstallFinalize" returned 1603 Очень похоже на предыдущую багу с SHFileOperation(). Проверил: патч исправляющий ту багу приложен.
Ошибка возникает при срабатывании условия: if (!(lpFileOp->fFlags & FOF_MULTIDESTFILES) && !flFrom->bAnyDirectories && flFrom->dwNumFiles > flTo->dwNumFiles) { return ERROR_CANCELLED; } при этом from=0 to=1
Локальный Гарант устанавливается. Думаю следует перенести установку Клиент-серверного Гаранта в новую багу