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