https://git.reactos.org/?p=reactos.git;a=commitdiff;h=06129f847986a9da9a5965f78660237e82d618c7

commit 06129f847986a9da9a5965f78660237e82d618c7
Author:     winesync <[email protected]>
AuthorDate: Sun Mar 13 18:51:45 2022 +0100
Commit:     Mark Jansen <[email protected]>
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 <[email protected]>
    Signed-off-by: Hans Leidekker <[email protected]>
    Signed-off-by: Alexandre Julliard <[email protected]>
    
    wine commit id d95bffdadbf18b91c1bb15cc7132ae3b9f505f98 by Piotr Caban 
<[email protected]>
---
 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)
 };
 

Reply via email to