http://bugs.winehq.org/show_bug.cgi?id=48534 --- Comment #3 from Anastasius Focht <focht@gmx.net> --- Hello Hans, thanks for the test. It seems the 32-bit MSXML 6.0 redist installer skips itself on Vista+ via a custom action. The package sequences a custom action 'SkipInstallCA' (condition 'VersionNT>502') before 'LaunchConditions': Dumping of relevant msi installer tables: 'InstallExecuteSequence' table: --- snip --- Action Condition Sequence SkipInstallCA VersionNT>502 1 LaunchConditions 2 --- snip --- 'CustomAction' table: --- snip --- SkipInstallCA 1 redistca SkipInstall --- snip --- 'LaunchCondition' table: --- snip --- (NOT VersionNT64) [WrongPackage] --- snip --- That custom action 'SkipInstall' (redistca.dll) is a stub that unconditionally returns 0x103 = ERROR_NO_MORE_ITEMS (259). Microsoft documentation, custom action return values: https://learn.microsoft.com/en-us/windows/win32/msi/custom-action-return-val... ("Custom Action Return Values") --- snip --- ERROR_NO_MORE_ITEMS Skip remaining actions, not an error. --- snip --- So the sequence must stop at 'SkipInstallCA' with success on Vista and newer ('VersionNT>502'), regardless of prefix bitness. Wine instead continues to 'LaunchConditions'. That is only fatal in a 64-bit prefix, where 'VersionNT64' is set, '(NOT VersionNT64)' is false and yields [WrongPackage] -> 1603. In a 32-bit prefix 'VersionNT64' is undefined, the condition passes, and the same misbehaviour goes unnoticed. Looks like Wine msi swallows the return code: https://gitlab.winehq.org/wine/wine/-/blob/wine-11.16/dlls/msi/custom.c#L322 --- snip --- static UINT custom_get_thread_return( MSIPACKAGE *package, HANDLE thread ) { DWORD rc = 0; GetExitCodeThread( thread, &rc ); switch (rc) { case ERROR_FUNCTION_NOT_CALLED: case ERROR_SUCCESS: case ERROR_INSTALL_USEREXIT: case ERROR_INSTALL_FAILURE: return rc; case ERROR_NO_MORE_ITEMS: return ERROR_SUCCESS; case ERROR_INSTALL_SUSPEND: ACTION_ForceReboot( package ); return ERROR_SUCCESS; default: ERR( "invalid Return Code %lu\n", rc ); return ERROR_INSTALL_FAILURE; } } --- snip --- ERROR_NO_MORE_ITEMS becomes ERROR_SUCCESS, hence ITERATE_Actions() continues with the next action and runs 'LaunchConditions': https://gitlab.winehq.org/wine/wine/-/blob/wine-11.16/dlls/msi/action.c#L404 --- snip --- 0168:trace:msi:ACTION_PerformAction Performing action (L"SkipInstallCA") 0168:trace:msi:ACTION_PerformAction Performing action (L"LaunchConditions") 0168:err:msi:ITERATE_Actions Execution halted, action L"LaunchConditions" returned 1603 --- snip --- You need to propagate ERROR_NO_MORE_ITEMS. MSI_IterateRecords() already maps it back to ERROR_SUCCESS, so the sequence ends successfully: https://source.winehq.org/git/wine.git/blob/wine-11.16:/dlls/msi/msiquery.c#... --- snip --- if( r == ERROR_NO_MORE_ITEMS ) r = ERROR_SUCCESS; --- snip --- The existing Wine test case already exercises ERROR_NO_MORE_ITEMS but only checks the overall return value. It should also verify that a subsequent sequence action is not executed. $ wine --version wine-11.16 Regards -- Do not reply to this email, post in Bugzilla using the above URL to reply. You are receiving this mail because: You are watching all bug changes.