https://git.reactos.org/?p=reactos.git;a=commitdiff;h=06129f847986a9da9a596…
commit 06129f847986a9da9a5965f78660237e82d618c7
Author: winesync <ros-dev(a)reactos.org>
AuthorDate: Sun Mar 13 18:51:45 2022 +0100
Commit: Mark Jansen <mark.jansen(a)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(a)codeweavers.com>
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
wine commit id d95bffdadbf18b91c1bb15cc7132ae3b9f505f98 by Piotr Caban
<piotr(a)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)
};