Vincent Povirk : mscoree: Try skipping c: when searching for support msi.
Alexandre Julliard
julliard at winehq.org
Mon Apr 15 16:26:41 CDT 2019
Module: wine
Branch: master
Commit: 91e3ce8c5d1688cc71943d65dbf9604274b748b2
URL: https://source.winehq.org/git/wine.git/?a=commit;h=91e3ce8c5d1688cc71943d65dbf9604274b748b2
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Sat Apr 13 11:27:33 2019 -0500
mscoree: Try skipping c: when searching for support msi.
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mscoree/metahost.c | 6 +--
dlls/mscoree/mscoree_main.c | 102 ++++++++++++++++++++++++++---------------
dlls/mscoree/mscoree_private.h | 2 +-
3 files changed, 68 insertions(+), 42 deletions(-)
diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c
index 1b2abd2..b268acc 100644
--- a/dlls/mscoree/metahost.c
+++ b/dlls/mscoree/metahost.c
@@ -339,7 +339,7 @@ static HRESULT CLRRuntimeInfo_GetRuntimeHost(CLRRuntimeInfo *This, RuntimeHost *
return hr;
}
- if (!get_mono_path(mono_path))
+ if (!get_mono_path(mono_path, FALSE))
{
ERR("Wine Mono is not installed\n");
return CLR_E_SHIM_RUNTIME;
@@ -778,9 +778,9 @@ static BOOL get_mono_path_datadir(LPWSTR path)
return ret;
}
-BOOL get_mono_path(LPWSTR path)
+BOOL get_mono_path(LPWSTR path, BOOL skip_local)
{
- return get_mono_path_local(path) ||
+ return (!skip_local && get_mono_path_local(path)) ||
get_mono_path_registry(path) ||
get_mono_path_datadir(path) ||
get_mono_path_unix(INSTALL_DATADIR "/wine/mono/wine-mono-" WINE_MONO_VERSION, path) ||
diff --git a/dlls/mscoree/mscoree_main.c b/dlls/mscoree/mscoree_main.c
index 6393af8..40577de 100644
--- a/dlls/mscoree/mscoree_main.c
+++ b/dlls/mscoree/mscoree_main.c
@@ -717,23 +717,65 @@ static BOOL invoke_appwiz(void)
return ret;
}
-static BOOL install_wine_mono(void)
+static BOOL get_support_msi(LPCWSTR mono_path, LPWSTR msi_path)
{
static const WCHAR support_msi_relative[] = {'\\','s','u','p','p','o','r','t','\\','w','i','n','e','m','o','n','o','-','s','u','p','p','o','r','t','.','m','s','i',0};
+ UINT (WINAPI *pMsiOpenPackageW)(LPCWSTR,ULONG*);
+ UINT (WINAPI *pMsiGetProductPropertyA)(ULONG,LPCSTR,LPSTR,LPDWORD);
+ UINT (WINAPI *pMsiCloseHandle)(ULONG);
+ HMODULE hmsi = NULL;
+ char versionstringbuf[15];
+ UINT res;
+ DWORD buffer_size;
+ ULONG msiproduct;
+ BOOL ret=FALSE;
+
+ hmsi = GetModuleHandleA("msi");
+
+ strcpyW(msi_path, mono_path);
+ strcatW(msi_path, support_msi_relative);
+
+ pMsiOpenPackageW = (void*)GetProcAddress(hmsi, "MsiOpenPackageW");
+
+ res = pMsiOpenPackageW(msi_path, &msiproduct);
+
+ if (res == ERROR_SUCCESS)
+ {
+ buffer_size = sizeof(versionstringbuf);
+
+ pMsiGetProductPropertyA = (void*)GetProcAddress(hmsi, "MsiGetProductPropertyA");
+
+ res = pMsiGetProductPropertyA(msiproduct, "ProductVersion", versionstringbuf, &buffer_size);
+
+ pMsiCloseHandle = (void*)GetProcAddress(hmsi, "MsiCloseHandle");
+
+ pMsiCloseHandle(msiproduct);
+ }
+
+ if (res == ERROR_SUCCESS) {
+ TRACE("found support msi version %s at %s\n", versionstringbuf, debugstr_w(msi_path));
+
+ if (compare_versions(WINE_MONO_VERSION, versionstringbuf) <= 0)
+ {
+ ret = TRUE;
+ }
+ }
+
+ return ret;
+}
+
+static BOOL install_wine_mono(void)
+{
BOOL is_wow64 = FALSE;
HMODULE hmsi = NULL;
HRESULT initresult = E_FAIL;
UINT (WINAPI *pMsiEnumRelatedProductsA)(LPCSTR,DWORD,DWORD,LPSTR);
UINT (WINAPI *pMsiGetProductInfoA)(LPCSTR,LPCSTR,LPSTR,DWORD*);
- UINT (WINAPI *pMsiOpenPackageW)(LPCWSTR,ULONG*);
- UINT (WINAPI *pMsiGetProductPropertyA)(ULONG,LPCSTR,LPSTR,LPDWORD);
- UINT (WINAPI *pMsiCloseHandle)(ULONG);
UINT (WINAPI *pMsiInstallProductW)(LPCWSTR,LPCWSTR);
char versionstringbuf[15];
char productcodebuf[39];
UINT res;
DWORD buffer_size;
- ULONG msiproduct;
BOOL ret;
WCHAR mono_path[MAX_PATH];
WCHAR support_msi_path[MAX_PATH];
@@ -750,7 +792,7 @@ static BOOL install_wine_mono(void)
TRACE("searching for mono runtime\n");
- if (!get_mono_path(mono_path))
+ if (!get_mono_path(mono_path, FALSE))
{
TRACE("mono runtime not found\n");
return invoke_appwiz();
@@ -795,47 +837,31 @@ static BOOL install_wine_mono(void)
}
}
- strcpyW(support_msi_path, mono_path);
- strcatW(support_msi_path, support_msi_relative);
-
initresult = CoInitialize(NULL);
- pMsiOpenPackageW = (void*)GetProcAddress(hmsi, "MsiOpenPackageW");
-
- res = pMsiOpenPackageW(support_msi_path, &msiproduct);
-
- if (res == ERROR_SUCCESS)
+ ret = get_support_msi(mono_path, support_msi_path);
+ if (!ret)
{
- buffer_size = sizeof(versionstringbuf);
-
- pMsiGetProductPropertyA = (void*)GetProcAddress(hmsi, "MsiGetProductPropertyA");
-
- res = pMsiGetProductPropertyA(msiproduct, "ProductVersion", versionstringbuf, &buffer_size);
-
- pMsiCloseHandle = (void*)GetProcAddress(hmsi, "MsiCloseHandle");
-
- pMsiCloseHandle(msiproduct);
+ /* Try looking outside c:\windows\mono */
+ ret = (get_mono_path(mono_path, TRUE) &&
+ get_support_msi(mono_path, support_msi_path));
}
- if (res == ERROR_SUCCESS) {
- TRACE("found support msi version %s at %s\n", versionstringbuf, debugstr_w(support_msi_path));
-
- if (compare_versions(WINE_MONO_VERSION, versionstringbuf) <= 0)
- {
- TRACE("installing support msi\n");
+ if (ret)
+ {
+ TRACE("installing support msi\n");
- pMsiInstallProductW = (void*)GetProcAddress(hmsi, "MsiInstallProductW");
+ pMsiInstallProductW = (void*)GetProcAddress(hmsi, "MsiInstallProductW");
- res = pMsiInstallProductW(support_msi_path, NULL);
+ res = pMsiInstallProductW(support_msi_path, NULL);
- if (res == ERROR_SUCCESS)
- {
- ret = TRUE;
- goto end;
- }
- else
- ERR("MsiInstallProduct failed, err=%i\n", res);
+ if (res == ERROR_SUCCESS)
+ {
+ ret = TRUE;
+ goto end;
}
+ else
+ ERR("MsiInstallProduct failed, err=%i\n", res);
}
ret = invoke_appwiz();
diff --git a/dlls/mscoree/mscoree_private.h b/dlls/mscoree/mscoree_private.h
index 43209fd..3a3631e 100644
--- a/dlls/mscoree/mscoree_private.h
+++ b/dlls/mscoree/mscoree_private.h
@@ -108,7 +108,7 @@ extern HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config
IStream *config_stream, DWORD startup_flags, DWORD runtimeinfo_flags, BOOL legacy,
ICLRRuntimeInfo **result) DECLSPEC_HIDDEN;
-extern BOOL get_mono_path(LPWSTR path) DECLSPEC_HIDDEN;
+extern BOOL get_mono_path(LPWSTR path, BOOL skip_local) DECLSPEC_HIDDEN;
extern HRESULT ICLRRuntimeInfo_GetRuntimeHost(ICLRRuntimeInfo *iface, RuntimeHost **result) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list