From ea40a90469f3abcc18d1b599d30aa0b7ae6e6c40 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Wed, 6 Jun 2012 10:42:43 +0200 Subject: [PATCH] fusion: Account for the version prefix when building the file mask. --- dlls/fusion/asmenum.c | 78 ++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/dlls/fusion/asmenum.c b/dlls/fusion/asmenum.c index 641ed2f0ba4..76a2bce8b9c 100644 --- a/dlls/fusion/asmenum.c +++ b/dlls/fusion/asmenum.c @@ -166,23 +166,32 @@ static const IAssemblyEnumVtbl AssemblyEnumVtbl = { IAssemblyEnumImpl_Clone }; -static void parse_name(IAssemblyName *name, int depth, LPWSTR path, LPWSTR buf) +static void build_file_mask(IAssemblyName *name, int depth, const WCHAR *path, + const WCHAR *prefix, WCHAR *buf) { - WCHAR disp[MAX_PATH]; + static const WCHAR star[] = {'*',0}; + static const WCHAR ss_fmt[] = {'%','s','\\','%','s',0}; + static const WCHAR sss_fmt[] = {'%','s','\\','%','s','_','_','%','s',0}; + static const WCHAR ssss_fmt[] = {'%','s','\\','%','s','%','s','_','_','%','s',0}; + static const WCHAR ver_fmt[] = {'%','u','.','%','u','.','%','u','.','%','u',0}; + static const WCHAR star_fmt[] = {'%','s','\\','*',0}; + static const WCHAR star_prefix_fmt[] = {'%','s','\\','%','s','*',0}; + WCHAR disp[MAX_PATH], version[24]; /* strlen("65535") * 4 + 3 + 1 */ LPCWSTR verptr, pubkeyptr; HRESULT hr; DWORD size, major_size, minor_size, build_size, revision_size; WORD major, minor, build, revision; - - static const WCHAR star[] = {'*',0}; - static const WCHAR ss_fmt[] = {'%','s','\\','%','s',0}; - static const WCHAR verpubkey[] = {'%','s','\\','%','s','_','_','%','s',0}; - static const WCHAR ver_fmt[] = {'%','u','.','%','u','.','%','u','.','%','u',0}; - - WCHAR version[24]; /* strlen("65535") * 4 + 3 + 1 */ WCHAR token_str[TOKEN_LENGTH + 1]; BYTE token[BYTES_PER_TOKEN]; + if (!name) + { + if (prefix && depth == 1) + sprintfW(buf, star_prefix_fmt, path, prefix); + else + sprintfW(buf, star_fmt, path); + return; + } if (depth == 0) { size = MAX_PATH; @@ -224,7 +233,10 @@ static void parse_name(IAssemblyName *name, int depth, LPWSTR path, LPWSTR buf) pubkeyptr = token_str; } - sprintfW(buf, verpubkey, path, verptr, pubkeyptr); + if (prefix) + sprintfW(buf, ssss_fmt, path, prefix, verptr, pubkeyptr); + else + sprintfW(buf, sss_fmt, path, verptr, pubkeyptr); } } @@ -289,31 +301,24 @@ static void insert_assembly(struct list *assemblies, ASMNAME *to_insert) } static HRESULT enum_gac_assemblies(struct list *assemblies, IAssemblyName *name, - int depth, LPWSTR path) + int depth, const WCHAR *prefix, LPWSTR path) { static const WCHAR dot[] = {'.',0}; static const WCHAR dotdot[] = {'.','.',0}; - static const WCHAR search_fmt[] = {'%','s','\\','*',0}; static const WCHAR dblunder[] = {'_','_',0}; static const WCHAR path_fmt[] = {'%','s','\\','%','s','\\','%','s','.','d','l','l',0}; - static const WCHAR fmt[] = {'%','s',',',' ','V','e','r','s','i','o','n','=','%','s',',',' ', + static const WCHAR name_fmt[] = {'%','s',',',' ','V','e','r','s','i','o','n','=','%','s',',',' ', 'C','u','l','t','u','r','e','=','n','e','u','t','r','a','l',',',' ', 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=','%','s',0}; static const WCHAR ss_fmt[] = {'%','s','\\','%','s',0}; - static const WCHAR v40[] = {'v','4','.','0','_'}; WIN32_FIND_DATAW ffd; - WCHAR buf[MAX_PATH], disp[MAX_PATH], asmpath[MAX_PATH]; + WCHAR buf[MAX_PATH], disp[MAX_PATH], asmpath[MAX_PATH], *ptr; static WCHAR parent[MAX_PATH]; ASMNAME *asmname; HANDLE hfind; - WCHAR *ptr; HRESULT hr = S_OK; - if (name) - parse_name(name, depth, path, buf); - else - sprintfW(buf, search_fmt, path); - + build_file_mask(name, depth, path, prefix, buf); hfind = FindFirstFileW(buf, &ffd); if (hfind == INVALID_HANDLE_VALUE) return S_OK; @@ -334,19 +339,21 @@ static HRESULT enum_gac_assemblies(struct list *assemblies, IAssemblyName *name, } else if (depth == 1) { - unsigned int prefix_len = sizeof(v40)/sizeof(WCHAR); const WCHAR *token, *version = ffd.cFileName; sprintfW(asmpath, path_fmt, path, ffd.cFileName, parent); - ptr = strstrW(ffd.cFileName, dblunder); *ptr = '\0'; token = ptr + 2; - if (strlenW(ffd.cFileName) >= prefix_len && - !memcmp(ffd.cFileName, v40, sizeof(v40))) version += prefix_len; - - sprintfW(disp, fmt, parent, version, token); + if (prefix) + { + unsigned int prefix_len = strlenW(prefix); + if (strlenW(ffd.cFileName) >= prefix_len && + !memicmpW(ffd.cFileName, prefix, prefix_len)) + version += prefix_len; + } + sprintfW(disp, name_fmt, parent, version, token); asmname = HeapAlloc(GetProcessHeap(), 0, sizeof(ASMNAME)); if (!asmname) @@ -376,7 +383,7 @@ static HRESULT enum_gac_assemblies(struct list *assemblies, IAssemblyName *name, } sprintfW(buf, ss_fmt, path, ffd.cFileName); - hr = enum_gac_assemblies(assemblies, name, depth + 1, buf); + hr = enum_gac_assemblies(assemblies, name, depth + 1, prefix, buf); if (FAILED(hr)) break; } while (FindNextFileW(hfind, &ffd) != 0); @@ -391,6 +398,7 @@ static HRESULT enumerate_gac(IAssemblyEnumImpl *asmenum, IAssemblyName *pName) static const WCHAR gac_32[] = {'\\','G','A','C','_','3','2',0}; static const WCHAR gac_64[] = {'\\','G','A','C','_','6','4',0}; static const WCHAR gac_msil[] = {'\\','G','A','C','_','M','S','I','L',0}; + static const WCHAR v40[] = {'v','4','.','0','_',0}; WCHAR path[MAX_PATH], buf[MAX_PATH]; SYSTEM_INFO info; HRESULT hr; @@ -406,17 +414,17 @@ static HRESULT enumerate_gac(IAssemblyEnumImpl *asmenum, IAssemblyName *pName) if (info.u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { strcpyW(path + size - 1, gac_64); - hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, path); + hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, v40, path); if (FAILED(hr)) return hr; } strcpyW(path + size - 1, gac_32); - hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, path); + hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, v40, path); if (FAILED(hr)) return hr; strcpyW(path + size - 1, gac_msil); - hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, path); + hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, v40, path); if (FAILED(hr)) return hr; @@ -429,22 +437,22 @@ static HRESULT enumerate_gac(IAssemblyEnumImpl *asmenum, IAssemblyName *pName) if (info.u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { strcpyW(path + size - 1, gac_64); - hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, path); + hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, NULL, path); if (FAILED(hr)) return hr; } strcpyW(path + size - 1, gac_32); - hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, path); + hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, NULL, path); if (FAILED(hr)) return hr; strcpyW(path + size - 1, gac_msil); - hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, path); + hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, NULL, path); if (FAILED(hr)) return hr; strcpyW(path + size - 1, gac); - hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, path); + hr = enum_gac_assemblies(&asmenum->assemblies, pName, 0, NULL, path); if (FAILED(hr)) return hr;