From 2a4fc095ee8be79ab5df31a0dd2526c531693609 Mon Sep 17 00:00:00 2001 From: Fabian Maurer Date: Sun, 3 Nov 2024 16:13:10 +0100 Subject: [PATCH] msi: Make MsiInstallProductW open msi readonly Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57343 --- dlls/msi/msi.c | 2 +- dlls/msi/msipriv.h | 1 + dlls/msi/package.c | 5 +++-- dlls/msi/tests/custom.c | 1 - 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c index 2c0f3aa50f5..966bf8f98c6 100644 --- a/dlls/msi/msi.c +++ b/dlls/msi/msi.c @@ -229,7 +229,7 @@ UINT WINAPI MsiInstallProductW(LPCWSTR szPackagePath, LPCWSTR szCommandLine) { MSIPACKAGE *package = NULL; const WCHAR *reinstallmode; - DWORD options = 0; + DWORD options = WINE_OPENPACKAGEFLAGS_READONLY; UINT r, len; TRACE("%s %s\n",debugstr_w(szPackagePath), debugstr_w(szCommandLine)); diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index e20ead557ce..b9eb4c502bf 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -906,6 +906,7 @@ extern UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel ); /* package internals */ #define WINE_OPENPACKAGEFLAGS_RECACHE 0x80000000 +#define WINE_OPENPACKAGEFLAGS_READONLY 0x40000000 extern MSIPACKAGE *MSI_CreatePackage( MSIDATABASE * ); extern UINT MSI_OpenPackageW( LPCWSTR szPackage, DWORD dwOptions, MSIPACKAGE **pPackage ); extern UINT MSI_SetTargetPathW( MSIPACKAGE *, LPCWSTR, LPCWSTR ); diff --git a/dlls/msi/package.c b/dlls/msi/package.c index 89b4c09dfa4..02775a16d4f 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -1327,7 +1327,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, DWORD dwOptions, MSIPACKAGE **pPackage) MSIRECORD *data_row, *info_row; UINT r; WCHAR localfile[MAX_PATH], cachefile[MAX_PATH]; - LPCWSTR file = szPackage; + LPCWSTR file = szPackage, mode; DWORD index = 0; MSISUMMARYINFO *si; BOOL delete_on_close = FALSE; @@ -1405,7 +1405,8 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, DWORD dwOptions, MSIPACKAGE **pPackage) product_version = get_product_version( db ); msiobj_release( &db->hdr ); TRACE("opening package %s\n", debugstr_w( localfile )); - r = MSI_OpenDatabaseW( localfile, MSIDBOPEN_TRANSACT, &db ); + mode = (dwOptions & WINE_OPENPACKAGEFLAGS_READONLY) ? MSIDBOPEN_READONLY : MSIDBOPEN_TRANSACT; + r = MSI_OpenDatabaseW( localfile, mode, &db ); if (r != ERROR_SUCCESS) { free( product_version ); diff --git a/dlls/msi/tests/custom.c b/dlls/msi/tests/custom.c index 3a3154da7da..f0980274ce3 100644 --- a/dlls/msi/tests/custom.c +++ b/dlls/msi/tests/custom.c @@ -1270,7 +1270,6 @@ static void test_open_msi(MSIHANDLE hinst) ok(hinst, result == 0, "Failed: %x\n", result); result = MsiOpenDatabaseA(buffer, (LPCSTR)MSIDBOPEN_READONLY, &handle); - todo_wine ok (hinst, result == 0, "Got %u\n", result); MsiCloseHandle(handle);