[3/5] fusion: Add support for ASM_CACHE_ROOT_EX in GetCachePath.

Hans Leidekker hans at codeweavers.com
Mon May 21 04:25:12 CDT 2012


---
 dlls/fusion/fusion.c |   51 +++++++++++++++++++++++++-------------------------
 include/fusion.idl   |    3 ++-
 2 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/dlls/fusion/fusion.c b/dlls/fusion/fusion.c
index ad77233..6ace81f 100644
--- a/dlls/fusion/fusion.c
+++ b/dlls/fusion/fusion.c
@@ -90,32 +90,26 @@ static HRESULT get_corversion(LPWSTR version, DWORD size)
 HRESULT WINAPI GetCachePath(ASM_CACHE_FLAGS dwCacheFlags, LPWSTR pwzCachePath,
                             PDWORD pcchPath)
 {
-    WCHAR path[MAX_PATH];
-    WCHAR windir[MAX_PATH];
-    WCHAR version[MAX_PATH];
-    DWORD len;
-    HRESULT hr = S_OK;
-
-    static const WCHAR backslash[] = {'\\',0};
-    static const WCHAR assembly[] = {'a','s','s','e','m','b','l','y',0};
-    static const WCHAR gac[] = {'G','A','C',0};
-    static const WCHAR nativeimg[] = {
-        'N','a','t','i','v','e','I','m','a','g','e','s','_',0};
+    static const WCHAR assembly[] = {'\\','a','s','s','e','m','b','l','y',0};
+    static const WCHAR gac[] = {'\\','G','A','C',0};
+    static const WCHAR nativeimg[] = {'N','a','t','i','v','e','I','m','a','g','e','s','_',0};
+    static const WCHAR dotnet[] = {'\\','M','i','c','r','o','s','o','f','t','.','N','E','T',0};
 #ifdef _WIN64
     static const WCHAR zapfmt[] = {'%','s','\\','%','s','\\','%','s','%','s','_','6','4',0};
 #else
     static const WCHAR zapfmt[] = {'%','s','\\','%','s','\\','%','s','%','s','_','3','2',0};
 #endif
+    WCHAR path[MAX_PATH], windir[MAX_PATH], version[MAX_PATH];
+    DWORD len;
+    HRESULT hr = S_OK;
 
     TRACE("(%08x, %p, %p)\n", dwCacheFlags, pwzCachePath, pcchPath);
 
     if (!pcchPath)
         return E_INVALIDARG;
 
-    GetWindowsDirectoryW(windir, MAX_PATH);
-    lstrcpyW(path, windir);
-    lstrcatW(path, backslash);
-    lstrcatW(path, assembly);
+    len = GetWindowsDirectoryW(windir, MAX_PATH);
+    strcpyW(path, windir);
 
     switch (dwCacheFlags)
     {
@@ -125,37 +119,42 @@ HRESULT WINAPI GetCachePath(ASM_CACHE_FLAGS dwCacheFlags, LPWSTR pwzCachePath,
             if (FAILED(hr))
                 return hr;
 
-            sprintfW(path, zapfmt, windir, assembly, nativeimg, version);
+            len = sprintfW(path, zapfmt, windir, assembly + 1, nativeimg, version);
             break;
         }
-
         case ASM_CACHE_GAC:
         {
-            lstrcatW(path, backslash);
-            lstrcatW(path, gac);
+            strcpyW(path + len, assembly);
+            len += sizeof(assembly)/sizeof(WCHAR) - 1;
+            strcpyW(path + len, gac);
+            len += sizeof(gac)/sizeof(WCHAR) - 1;
             break;
         }
-
         case ASM_CACHE_DOWNLOAD:
         {
             FIXME("Download cache not implemented\n");
             return E_FAIL;
         }
-
         case ASM_CACHE_ROOT:
-            break; /* already set */
-
+            strcpyW(path + len, assembly);
+            len += sizeof(assembly)/sizeof(WCHAR) - 1;
+            break;
+        case ASM_CACHE_ROOT_EX:
+            strcpyW(path + len, dotnet);
+            len += sizeof(dotnet)/sizeof(WCHAR) - 1;
+            strcpyW(path + len, assembly);
+            len += sizeof(assembly)/sizeof(WCHAR) - 1;
+            break;
         default:
             return E_INVALIDARG;
     }
 
-    len = lstrlenW(path) + 1;
+    len++;
     if (*pcchPath <= len || !pwzCachePath)
         hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
     else if (pwzCachePath)
-        lstrcpyW(pwzCachePath, path);
+        strcpyW(pwzCachePath, path);
 
     *pcchPath = len;
-
     return hr;
 }
diff --git a/include/fusion.idl b/include/fusion.idl
index d645662..cff1e6c 100644
--- a/include/fusion.idl
+++ b/include/fusion.idl
@@ -28,7 +28,8 @@ typedef enum
     ASM_CACHE_ZAP       = 0x1,
     ASM_CACHE_GAC       = 0x2,
     ASM_CACHE_DOWNLOAD  = 0x4,
-    ASM_CACHE_ROOT      = 0x8
+    ASM_CACHE_ROOT      = 0x8,
+    ASM_CACHE_ROOT_EX   = 0x80
 } ASM_CACHE_FLAGS;
 
 typedef enum
-- 
1.7.10







More information about the wine-patches mailing list