Louis Lenders : mscoree: Improve GetCORSytemDirectory.
Alexandre Julliard
julliard at winehq.org
Wed Aug 25 12:35:07 CDT 2010
Module: wine
Branch: master
Commit: 127af150e0c8e307efb9980dc29640df3aa0e0cb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=127af150e0c8e307efb9980dc29640df3aa0e0cb
Author: Louis Lenders <xerox_xerox2000 at yahoo.co.uk>
Date: Wed Aug 25 14:53:05 2010 +0200
mscoree: Improve GetCORSytemDirectory.
---
dlls/mscoree/mscoree_main.c | 51 +++++++++++++++++++++++++++++++++++++++--
dlls/mscoree/tests/mscoree.c | 4 +-
2 files changed, 50 insertions(+), 5 deletions(-)
diff --git a/dlls/mscoree/mscoree_main.c b/dlls/mscoree/mscoree_main.c
index d1f035c..e64f9b0 100644
--- a/dlls/mscoree/mscoree_main.c
+++ b/dlls/mscoree/mscoree_main.c
@@ -79,6 +79,28 @@ static BOOL get_mono_path(LPWSTR path)
return TRUE;
}
+static BOOL get_install_root(LPWSTR install_dir)
+{
+ const WCHAR dotnet_key[] = {'S','O','F','T','W','A','R','E','\\','M','i','c','r','o','s','o','f','t','\\','.','N','E','T','F','r','a','m','e','w','o','r','k','\\',0};
+ const WCHAR install_root[] = {'I','n','s','t','a','l','l','R','o','o','t',0};
+
+ DWORD len;
+ HKEY key;
+
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, dotnet_key, 0, KEY_READ, &key))
+ return FALSE;
+
+ len = MAX_PATH;
+ if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)install_dir, &len))
+ {
+ RegCloseKey(key);
+ return FALSE;
+ }
+ RegCloseKey(key);
+
+ return TRUE;
+}
+
static CRITICAL_SECTION mono_lib_cs;
static CRITICAL_SECTION_DEBUG mono_lib_cs_debug =
{
@@ -336,12 +358,35 @@ HRESULT WINAPI _CorValidateImage(PVOID* imageBase, LPCWSTR imageName)
HRESULT WINAPI GetCORSystemDirectory(LPWSTR pbuffer, DWORD cchBuffer, DWORD *dwLength)
{
- FIXME("(%p, %d, %p): stub!\n", pbuffer, cchBuffer, dwLength);
+ static const WCHAR slash[] = {'\\',0};
+ WCHAR system_dir[MAX_PATH];
+ WCHAR version[MAX_PATH];
+
+ FIXME("(%p, %d, %p): semi-stub!\n", pbuffer, cchBuffer, dwLength);
if (!dwLength)
return E_POINTER;
- *dwLength = 0;
+ if (!pbuffer)
+ return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
+
+ if (!get_install_root(system_dir))
+ {
+ ERR("error reading registry key for installroot, returning empty path\n");
+ *dwLength = 0;
+ }
+ else
+ {
+ GetCORVersion(version, MAX_PATH, dwLength);
+ lstrcatW(system_dir, version);
+ lstrcatW(system_dir, slash);
+ *dwLength = lstrlenW(system_dir) + 1;
+
+ if (cchBuffer < *dwLength)
+ return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
+
+ lstrcpyW(pbuffer, system_dir);
+ }
return S_OK;
}
@@ -355,7 +400,7 @@ HRESULT WINAPI GetCORVersion(LPWSTR pbuffer, DWORD cchBuffer, DWORD *dwLength)
if (!dwLength || !pbuffer)
return E_POINTER;
- *dwLength = lstrlenW(version);
+ *dwLength = lstrlenW(version) + 1;
if (cchBuffer < *dwLength)
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
diff --git a/dlls/mscoree/tests/mscoree.c b/dlls/mscoree/tests/mscoree.c
index e66a44b..b513ade 100644
--- a/dlls/mscoree/tests/mscoree.c
+++ b/dlls/mscoree/tests/mscoree.c
@@ -71,10 +71,10 @@ static void test_versioninfo(void)
path_len = size;
hr = pGetCORSystemDirectory(path, path_len-1 , &size);
- todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "GetCORSystemDirectory returned %08x\n", hr);
+ ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "GetCORSystemDirectory returned %08x\n", hr);
hr = pGetCORSystemDirectory(NULL, MAX_PATH , &size);
- todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "GetCORSystemDirectory returned %08x\n", hr);
+ ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "GetCORSystemDirectory returned %08x\n", hr);
hr = pGetCORSystemDirectory(path, MAX_PATH , NULL);
ok(hr == E_POINTER,"GetCORSystemDirectory returned %08x\n", hr);
More information about the wine-cvs
mailing list