Skip to content

Commit

Permalink
fix wine-mono patch
Browse files Browse the repository at this point in the history
  • Loading branch information
GloriousEggroll committed Apr 19, 2019
1 parent d0de83c commit 503d04b
Showing 1 changed file with 0 additions and 210 deletions.
210 changes: 0 additions & 210 deletions game-patches-testing/valve-wine-mono.patch
Original file line number Diff line number Diff line change
@@ -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 <vincent@codeweavers.com>
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 <aeikum@codeweavers.com>
Date: Mon, 15 Apr 2019 08:40:22 -0500
Expand Down

0 comments on commit 503d04b

Please sign in to comment.