diff --git a/game-patches-testing/valve-wine-mono.patch b/game-patches-testing/valve-wine-mono.patch index 65dbf8c46f..5cb3f4cd79 100644 --- a/game-patches-testing/valve-wine-mono.patch +++ b/game-patches-testing/valve-wine-mono.patch @@ -1,213 +1,3 @@ -diff --git a/dlls/mscoree/mscoree_private.h b/dlls/mscoree/mscoree_private.h -index 16ae5011407..631037c9ecd 100644 ---- a/dlls/mscoree/mscoree_private.h -+++ b/dlls/mscoree/mscoree_private.h -@@ -107,6 +107,8 @@ typedef struct CorDebug - extern HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file, - DWORD startup_flags, DWORD runtimeinfo_flags, BOOL legacy, ICLRRuntimeInfo **result) DECLSPEC_HIDDEN; - -+extern BOOL get_mono_path(LPWSTR path) DECLSPEC_HIDDEN; -+ - extern HRESULT ICLRRuntimeInfo_GetRuntimeHost(ICLRRuntimeInfo *iface, RuntimeHost **result) DECLSPEC_HIDDEN; - - extern HRESULT MetaDataDispenser_CreateInstance(IUnknown **ppUnk) DECLSPEC_HIDDEN; -From 559e5c17fd14c465ab5d1e51da06831614be4f3c Mon Sep 17 00:00:00 2001 -From: Vincent Povirk -Date: Mon, 15 Apr 2019 08:39:04 -0500 -Subject: [PATCH] mscoree: Try skipping c: when searching for support msi. - ---- - 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 d0e51a4f507..a1171737e86 100644 ---- a/dlls/mscoree/metahost.c -+++ b/dlls/mscoree/metahost.c -@@ -338,7 +338,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; -@@ -777,9 +777,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 2e72b0b2268..f2b3e6bf6b6 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 631037c9ecd..d9d79c02b12 100644 ---- a/dlls/mscoree/mscoree_private.h -+++ b/dlls/mscoree/mscoree_private.h -@@ -107,7 +107,7 @@ typedef struct CorDebug - extern HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file, - 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; - From 7db0aa426bb4ddb4c306ca1049081d4265e8d7ff Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Mon, 15 Apr 2019 08:40:22 -0500