https://git.reactos.org/?p=reactos.git;a=commitdiff;h=06129f847986a9da9a5965...
commit 06129f847986a9da9a5965f78660237e82d618c7 Author: winesync ros-dev@reactos.org AuthorDate: Sun Mar 13 18:51:45 2022 +0100 Commit: Mark Jansen mark.jansen@reactos.org CommitDate: Sun Mar 20 19:28:22 2022 +0100
[WINESYNC] msi: Fix component Action for shared components in CostFinalize.
Fixes regression in wow .NET4.6.2 installation.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
wine commit id d95bffdadbf18b91c1bb15cc7132ae3b9f505f98 by Piotr Caban piotr@codeweavers.com --- dll/win32/msi/action.c | 14 +++++++++++--- modules/rostests/winetests/msi/install.c | 27 +++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/dll/win32/msi/action.c b/dll/win32/msi/action.c index 29ccf68c539..c41654e2707 100644 --- a/dll/win32/msi/action.c +++ b/dll/win32/msi/action.c @@ -1979,13 +1979,21 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) component->ActionRequest = INSTALLSTATE_UNKNOWN; }
- TRACE("component %s (installed %d request %d action %d)\n", - debugstr_w(component->Component), component->Installed, component->ActionRequest, component->Action); - if (component->Action == INSTALLSTATE_LOCAL || component->Action == INSTALLSTATE_SOURCE) component->num_clients++; else if (component->Action == INSTALLSTATE_ABSENT) + { component->num_clients--; + + if (component->num_clients > 0) + { + TRACE("multiple clients uses %s - disallowing uninstallation\n", debugstr_w(component->Component)); + component->Action = INSTALLSTATE_UNKNOWN; + } + } + + TRACE("component %s (installed %d request %d action %d)\n", + debugstr_w(component->Component), component->Installed, component->ActionRequest, component->Action); }
return ERROR_SUCCESS; diff --git a/modules/rostests/winetests/msi/install.c b/modules/rostests/winetests/msi/install.c index e348f327011..1747a4482e3 100644 --- a/modules/rostests/winetests/msi/install.c +++ b/modules/rostests/winetests/msi/install.c @@ -1223,7 +1223,9 @@ static const char shc_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" "s72\ti2\tS64\tS0\tS255\n" "CustomAction\tAction\n" - "TestComponentAction\t19\t\twrong component action on install\t\n"; + "TestComponentAction\t19\t\twrong component action on install\t\n" + "TestDisallowedAction\t19\t\twrong component action on disallowed remove\t\n" + "TestRemoveAction\t19\t\twrong component action on remove\t\n";
static const char shc_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" @@ -1233,6 +1235,27 @@ static const char shc_install_exec_seq_dat[] = "CostInitialize\t\t200\n" "FileCost\t\t300\n" "CostFinalize\t\t600\n" + "TestDisallowedAction\tREMOVE AND ($sharedcomponent <> -1)\t700\n" + "InstallValidate\t\t900\n" + "InstallInitialize\t\t1200\n" + "ProcessComponents\t\t1300\n" + "RemoveFiles\t\t1400\n" + "InstallFiles\t\t1500\n" + "TestComponentAction\tNOT REMOVE AND ($sharedcomponent <> 3)\t1600\n" + "RegisterProduct\t\t1700\n" + "PublishFeatures\t\t1800\n" + "PublishProduct\t\t1900\n" + "InstallFinalize\t\t2000\n"; + +static const char shc2_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t200\n" + "FileCost\t\t300\n" + "CostFinalize\t\t600\n" + "TestRemoveAction\tREMOVE AND ($sharedcomponent <> 2)\t700\n" "InstallValidate\t\t900\n" "InstallInitialize\t\t1200\n" "ProcessComponents\t\t1300\n" @@ -1990,7 +2013,7 @@ static const msi_table shc2_tables[] = ADD_TABLE(shc_feature), ADD_TABLE(shc_feature_comp), ADD_TABLE(shc_custom_action), - ADD_TABLE(shc_install_exec_seq), + ADD_TABLE(shc2_install_exec_seq), ADD_TABLE(shc2_property) };