Module: wine Branch: master Commit: ddc1baa43227c4496df950644d0dd324e5ebff00 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ddc1baa43227c4496df950644d...
Author: Andreas Maier andy1.m@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@gmx.de Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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,