Andreas Maier : msi: Use special error control flag in CreateService.

Alexandre Julliard julliard at winehq.org
Tue Jun 7 11:08:16 CDT 2016


Module: wine
Branch: master
Commit: ddc1baa43227c4496df950644d0dd324e5ebff00
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ddc1baa43227c4496df950644d0dd324e5ebff00

Author: Andreas Maier <andy1.m at gmx.de>
Date:   Mon Jun  6 23:34:10 2016 +0200

msi: Use special error control flag in CreateService.

Signed-off-by: Andreas Maier <andy1.m at gmx.de>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msi/action.c | 15 ++++++++++++++-
 include/msidefs.h |  5 +++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 370007c..a3b84af 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -5811,6 +5811,7 @@ static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param)
     LPWSTR name = NULL, disp = NULL, load_order = NULL, serv_name = NULL;
     LPWSTR depends = NULL, pass = NULL, args = NULL, image_path = NULL;
     DWORD serv_type, start_type, err_control;
+    BOOL is_vital;
     SERVICE_DESCRIPTIONW sd = {NULL};
     UINT ret = ERROR_SUCCESS;
 
@@ -5849,6 +5850,13 @@ static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param)
     deformat_string(package, MSI_RecordGetString(rec, 11), &args);
     deformat_string(package, MSI_RecordGetString(rec, 13), &sd.lpDescription);
 
+    /* Should the complete install fail if CreateService fails? */
+    is_vital = (err_control & msidbServiceInstallErrorControlVital);
+
+    /* Remove the msidbServiceInstallErrorControlVital-flag from err_control.
+       CreateService (under Windows) would fail if not. */
+    err_control &= ~msidbServiceInstallErrorControlVital;
+
     /* fetch the service path */
     row = MSI_QueryGetRecord(package->db, query, comp);
     if (!row)
@@ -5890,7 +5898,12 @@ static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param)
     if (!service)
     {
         if (GetLastError() != ERROR_SERVICE_EXISTS)
-            ERR("Failed to create service %s: %d\n", debugstr_w(name), GetLastError());
+        {
+            WARN("Failed to create service %s: %d\n", debugstr_w(name), GetLastError());
+            if (is_vital)
+                ret = ERROR_INSTALL_FAILURE;
+
+        }
     }
     else if (sd.lpDescription)
     {
diff --git a/include/msidefs.h b/include/msidefs.h
index 640bfa1..c37e5b8 100644
--- a/include/msidefs.h
+++ b/include/msidefs.h
@@ -200,6 +200,11 @@ enum msidbServiceControlEvent
     msidbServiceControlEventUninstallDelete = 0x00000080,
 };
 
+enum msidbServiceInstallErrorControl
+{
+    msidbServiceInstallErrorControlVital = 0x00008000
+};
+
 enum msidbMoveFileOptions
 {
     msidbMoveFileOptionsMove = 0x00000001,




More information about the wine-cvs mailing list