forked from ValveSoftware/Proton
-
-
Notifications
You must be signed in to change notification settings - Fork 269
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
d0de83c
commit 503d04b
Showing
1 changed file
with
0 additions
and
210 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 <[email protected]> | ||
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 <[email protected]> | ||
Date: Mon, 15 Apr 2019 08:40:22 -0500 | ||
|