1 /* 2 * Copyright 2008 James Hawkins 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 17 */ 18 19 #include <windows.h> 20 #include <fusion.h> 21 22 #include "wine/test.h" 23 24 static HMODULE hmscoree; 25 26 static HRESULT (WINAPI *pGetCachePath)(ASM_CACHE_FLAGS dwCacheFlags, 27 LPWSTR pwzCachePath, PDWORD pcchPath); 28 static HRESULT (WINAPI *pLoadLibraryShim)(LPCWSTR szDllName, LPCWSTR szVersion, 29 LPVOID pvReserved, HMODULE *phModDll); 30 static HRESULT (WINAPI *pGetCORVersion)(LPWSTR pbuffer, DWORD cchBuffer, 31 DWORD *dwLength); 32 33 static BOOL init_functionpointers(void) 34 { 35 HRESULT hr; 36 HMODULE hfusion; 37 38 static const WCHAR szFusion[] = {'f','u','s','i','o','n','.','d','l','l',0}; 39 40 hmscoree = LoadLibraryA("mscoree.dll"); 41 if (!hmscoree) 42 { 43 win_skip("mscoree.dll not available\n"); 44 return FALSE; 45 } 46 47 pLoadLibraryShim = (void *)GetProcAddress(hmscoree, "LoadLibraryShim"); 48 if (!pLoadLibraryShim) 49 { 50 win_skip("LoadLibraryShim not available\n"); 51 FreeLibrary(hmscoree); 52 return FALSE; 53 } 54 55 pGetCORVersion = (void *)GetProcAddress(hmscoree, "GetCORVersion"); 56 57 hr = pLoadLibraryShim(szFusion, NULL, NULL, &hfusion); 58 if (FAILED(hr)) 59 { 60 win_skip("fusion.dll not available\n"); 61 FreeLibrary(hmscoree); 62 return FALSE; 63 } 64 65 pGetCachePath = (void *)GetProcAddress(hfusion, "GetCachePath"); 66 return TRUE; 67 } 68 69 static void test_GetCachePath(void) 70 { 71 CHAR windirA[MAX_PATH]; 72 WCHAR windir[MAX_PATH]; 73 WCHAR cachepath[MAX_PATH]; 74 WCHAR version[MAX_PATH]; 75 WCHAR path[MAX_PATH]; 76 DWORD size; 77 HRESULT hr; 78 79 static const WCHAR backslash[] = {'\\',0}; 80 static const WCHAR nochange[] = {'n','o','c','h','a','n','g','e',0}; 81 static const WCHAR assembly[] = {'a','s','s','e','m','b','l','y',0}; 82 static const WCHAR gac[] = {'G','A','C',0}; 83 84 if (!pGetCachePath) 85 { 86 win_skip("GetCachePath not implemented\n"); 87 return; 88 } 89 90 GetWindowsDirectoryA(windirA, MAX_PATH); 91 MultiByteToWideChar(CP_ACP, 0, windirA, -1, windir, MAX_PATH); 92 lstrcpyW(cachepath, windir); 93 lstrcatW(cachepath, backslash); 94 lstrcatW(cachepath, assembly); 95 lstrcatW(cachepath, backslash); 96 lstrcatW(cachepath, gac); 97 98 /* NULL pwzCachePath, pcchPath is 0 */ 99 size = 0; 100 hr = pGetCachePath(ASM_CACHE_GAC, NULL, &size); 101 ok(hr == E_NOT_SUFFICIENT_BUFFER, "Expected E_NOT_SUFFICIENT_BUFFER, got %08x\n", hr); 102 ok(size == lstrlenW(cachepath) + 1, 103 "Expected %d, got %d\n", lstrlenW(cachepath) + 1, size); 104 105 /* NULL pwszCachePath, pcchPath is MAX_PATH */ 106 size = MAX_PATH; 107 hr = pGetCachePath(ASM_CACHE_GAC, NULL, &size); 108 ok(hr == E_NOT_SUFFICIENT_BUFFER, "Expected E_NOT_SUFFICIENT_BUFFER, got %08x\n", hr); 109 ok(size == lstrlenW(cachepath) + 1, 110 "Expected %d, got %d\n", lstrlenW(cachepath) + 1, size); 111 112 /* both pwszCachePath and pcchPath NULL */ 113 hr = pGetCachePath(ASM_CACHE_GAC, NULL, NULL); 114 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); 115 116 /* NULL pcchPath */ 117 lstrcpyW(path, nochange); 118 hr = pGetCachePath(ASM_CACHE_GAC, path, NULL); 119 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); 120 ok( !lstrcmpW( nochange, path ), "Expected %s, got %s\n", wine_dbgstr_w(nochange), wine_dbgstr_w(path)); 121 122 /* get the cache path */ 123 lstrcpyW(path, nochange); 124 size = MAX_PATH; 125 hr = pGetCachePath(ASM_CACHE_GAC, path, &size); 126 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); 127 ok( !lstrcmpW( cachepath, path ), "Expected %s, got %s\n", wine_dbgstr_w(cachepath), wine_dbgstr_w(path)); 128 129 /* pcchPath has no room for NULL terminator */ 130 lstrcpyW(path, nochange); 131 size = lstrlenW(cachepath); 132 hr = pGetCachePath(ASM_CACHE_GAC, path, &size); 133 ok(hr == E_NOT_SUFFICIENT_BUFFER, "Expected E_NOT_SUFFICIENT_BUFFER, got %08x\n", hr); 134 ok( !lstrcmpW( nochange, path ), "Expected %s, got %s\n", wine_dbgstr_w(nochange), wine_dbgstr_w(path)); 135 136 lstrcpyW(cachepath, windir); 137 lstrcatW(cachepath, backslash); 138 lstrcatW(cachepath, assembly); 139 140 /* ASM_CACHE_ROOT */ 141 lstrcpyW(path, nochange); 142 size = MAX_PATH; 143 hr = pGetCachePath(ASM_CACHE_ROOT, path, &size); 144 ok(hr == S_OK || 145 broken(hr == E_INVALIDARG), /* .NET 1.1 */ 146 "Expected S_OK, got %08x\n", hr); 147 if (hr == S_OK) 148 ok( !lstrcmpW( cachepath, path ), "Expected %s, got %s\n", wine_dbgstr_w(cachepath), wine_dbgstr_w(path)); 149 150 if (pGetCORVersion) 151 { 152 CHAR versionA[MAX_PATH]; 153 CHAR cachepathA[MAX_PATH]; 154 CHAR nativeimgA[MAX_PATH]; 155 CHAR zapfmtA[MAX_PATH]; 156 157 if (hr == S_OK) 158 { 159 lstrcpyA(nativeimgA, "NativeImages_"); 160 #ifdef _WIN64 161 lstrcpyA(zapfmtA, "%s\\%s\\%s%s_64"); 162 #else 163 lstrcpyA(zapfmtA, "%s\\%s\\%s%s_32"); 164 #endif 165 } 166 else 167 { 168 lstrcpyA(nativeimgA, "NativeImages1_"); 169 lstrcpyA(zapfmtA, "%s\\%s\\%s%s"); 170 } 171 172 pGetCORVersion(version, MAX_PATH, &size); 173 WideCharToMultiByte(CP_ACP, 0, version, -1, versionA, MAX_PATH, 0, 0); 174 175 wsprintfA(cachepathA, zapfmtA, windirA, "assembly", nativeimgA, versionA); 176 MultiByteToWideChar(CP_ACP, 0, cachepathA, -1, cachepath, MAX_PATH); 177 178 /* ASM_CACHE_ZAP */ 179 lstrcpyW(path, nochange); 180 size = MAX_PATH; 181 hr = pGetCachePath(ASM_CACHE_ZAP, path, &size); 182 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); 183 ok( !lstrcmpW( cachepath, path ), "Expected %s, got %s\n", wine_dbgstr_w(cachepath), wine_dbgstr_w(path)); 184 } 185 186 /* two flags at once */ 187 lstrcpyW(path, nochange); 188 size = MAX_PATH; 189 hr = pGetCachePath(ASM_CACHE_GAC | ASM_CACHE_ROOT, path, &size); 190 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); 191 ok( !lstrcmpW( nochange, path ), "Expected %s, got %s\n", wine_dbgstr_w(nochange), wine_dbgstr_w(path)); 192 } 193 194 START_TEST(fusion) 195 { 196 if (!init_functionpointers()) 197 return; 198 199 test_GetCachePath(); 200 201 FreeLibrary(hmscoree); 202 } 203