static HRESULT WINAPI IAssemblyCacheImpl_QueryAssemblyInfo(IAssemblyCache *iface, DWORD dwFlags, LPCWSTR pszAssemblyName, ASSEMBLY_INFO *pAsmInfo) { IAssemblyCacheImpl *cache = impl_from_IAssemblyCache(iface); IAssemblyName *asmname, *next = NULL; IAssemblyEnum *asmenum = NULL; HRESULT hr; TRACE("(%p, %d, %s, %p)\n", iface, dwFlags, debugstr_w(pszAssemblyName), pAsmInfo); if (pAsmInfo) { if (pAsmInfo->cbAssemblyInfo == 0) pAsmInfo->cbAssemblyInfo = sizeof(ASSEMBLY_INFO); else if (pAsmInfo->cbAssemblyInfo != sizeof(ASSEMBLY_INFO)) return E_INVALIDARG; } hr = CreateAssemblyNameObject(&asmname, pszAssemblyName, CANOF_PARSE_DISPLAY_NAME, NULL); if (FAILED(hr)) return hr; cache_lock( cache ); hr = CreateAssemblyEnum(&asmenum, NULL, asmname, ASM_CACHE_GAC, NULL); if (FAILED(hr)) goto done; for (;;) { hr = IAssemblyEnum_GetNextAssembly(asmenum, NULL, &next, 0); if (hr != S_OK) { hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); goto done; } hr = IAssemblyName_IsEqual(asmname, next, ASM_CMPF_IL_ALL); if (hr == S_OK) break; } if (!pAsmInfo) goto done; hr = IAssemblyName_GetPath(next, pAsmInfo->pszCurrentAssemblyPathBuf, &pAsmInfo->cchBuf); pAsmInfo->dwAssemblyFlags = ASSEMBLYINFO_FLAG_INSTALLED; done: IAssemblyName_Release(asmname); if (next) IAssemblyName_Release(next); if (asmenum) IAssemblyEnum_Release(asmenum); cache_unlock( cache ); return hr; }
static void test_IAssemblyName_IsEqual(void) { static const WCHAR wine1[] = {'w','i','n','e',0}; static const WCHAR wine2[] = {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0}; static const WCHAR wine3[] = {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',', 'c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0}; static const WCHAR wine4[] = {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',', 'c','u','l','t','u','r','e','=','e','n',0}; static const WCHAR wine5[] = {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',', 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','1','2','3','4','5','6', '7','8','9','0','a','b','c','d','e','f',0}; HRESULT hr; IAssemblyName *name1, *name2; hr = pCreateAssemblyNameObject( &name1, wine1, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "got %08x\n", hr ); hr = pCreateAssemblyNameObject( &name2, wine1, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "got %08x\n", hr ); if (0) { /* crashes on some old version */ hr = IAssemblyName_IsEqual( name1, NULL, 0 ); ok( hr == S_FALSE, "got %08x\n", hr ); hr = IAssemblyName_IsEqual( name1, NULL, ASM_CMPF_IL_ALL ); ok( hr == S_FALSE, "got %08x\n", hr ); } hr = IAssemblyName_IsEqual( name1, name1, ASM_CMPF_IL_ALL ); ok( hr == S_OK, "got %08x\n", hr ); hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL ); ok( hr == S_OK, "got %08x\n", hr ); IAssemblyName_Release( name2 ); hr = pCreateAssemblyNameObject( &name2, wine2, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "got %08x\n", hr ); hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL ); ok( hr == S_OK, "got %08x\n", hr ); IAssemblyName_Release( name2 ); hr = pCreateAssemblyNameObject( &name2, wine3, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "got %08x\n", hr ); hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL ); ok( hr == S_OK, "got %08x\n", hr ); IAssemblyName_Release( name1 ); hr = pCreateAssemblyNameObject( &name1, wine4, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "got %08x\n", hr ); hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL ); ok( hr == S_FALSE, "got %08x\n", hr ); IAssemblyName_Release( name1 ); hr = pCreateAssemblyNameObject( &name1, wine1, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "got %08x\n", hr ); IAssemblyName_Release( name2 ); hr = pCreateAssemblyNameObject( &name2, wine5, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "got %08x\n", hr ); hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL ); ok( hr == S_OK, "got %08x\n", hr ); IAssemblyName_Release( name1 ); IAssemblyName_Release( name2 ); }
static void test_CreateAssemblyNameObject(void) { IAssemblyName *name; WCHAR str[MAX_PATH]; WCHAR namestr[MAX_PATH]; DWORD size, hi, lo; HRESULT hr; static const WCHAR empty[] = {0}; /* NULL ppAssemblyNameObj */ to_widechar(namestr, "wine.dll"); hr = pCreateAssemblyNameObject(NULL, namestr, 0, NULL); ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); /* NULL szAssemblyName, CANOF_PARSE_DISPLAY_NAME */ name = (IAssemblyName *)0xdeadbeef; hr = pCreateAssemblyNameObject(&name, NULL, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name); /* empty szAssemblyName, CANOF_PARSE_DISPLAY_NAME */ name = (IAssemblyName *)0xdeadbeef; hr = pCreateAssemblyNameObject(&name, empty, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name); /* check the contents of the AssemblyName for default values */ /* NULL szAssemblyName */ name = NULL; hr = pCreateAssemblyNameObject(&name, NULL, CANOF_SET_DEFAULT_VALUES, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); ok(hr == FUSION_E_INVALID_NAME || broken(hr == E_INVALIDARG), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); str[0] = 'a'; size = MAX_PATH; hr = IAssemblyName_GetName(name, &size, str); ok(hr == S_OK, "got %08x\n", hr); ok(str[0] == 'a', "got %c\n", str[0]); ok(!size, "got %u\n", size); hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); ok(hr == FUSION_E_INVALID_NAME || broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); if (hr == S_OK) win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY" " and ASM_NAME_OSINFO_ARRAY correctly\n"); else test_assembly_name_props(name, defaults); IAssemblyName_Release(name); /* empty szAssemblyName */ name = NULL; hr = pCreateAssemblyNameObject(&name, empty, CANOF_SET_DEFAULT_VALUES, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); ok(hr == FUSION_E_INVALID_NAME || broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); size = 0; hr = IAssemblyName_GetName(name, &size, NULL); ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr); ok(size == 1, "got %u\n", size); if (0) /* crash */ { str[0] = '\0'; hr = IAssemblyName_GetName(name, NULL, str); ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr); ok(!str[0], "got %c\n", str[0]); } size = 0; str[0] = '\0'; hr = IAssemblyName_GetName(name, &size, str); ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr); ok(!str[0], "got %c\n", str[0]); ok(size == 1, "got %u\n", size); size = MAX_PATH; str[0] = '\0'; hr = IAssemblyName_GetName(name, &size, str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(!str[0], "Expected empty name\n"); ok(size == 1, "Expected 1, got %d\n", size); hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); ok(hr == FUSION_E_INVALID_NAME || broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); if (hr == S_OK) win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY" " and ASM_NAME_OSINFO_ARRAY correctly\n"); else test_assembly_name_props(name, emptyname); IAssemblyName_Release(name); /* 'wine' */ to_widechar(namestr, "wine"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_SET_DEFAULT_VALUES, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); size = 0; hr = IAssemblyName_GetDisplayName(name, NULL, &size, 0); ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr); ok(size == 5, "got %u\n", size); size = 3; hr = IAssemblyName_GetDisplayName(name, NULL, &size, 0); ok(hr == E_NOT_SUFFICIENT_BUFFER || broken(hr == E_INVALIDARG), "got %08x\n", hr); ok(size == 5 || broken(size == 3), "got %u\n", size); size = 3; str[0] = 'a'; hr = IAssemblyName_GetDisplayName(name, str, &size, 0); ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr); ok(str[0] == 'a', "got %c\n", str[0]); ok(size == 5, "got %u\n", size); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine", str); ok(size == 5, "Expected 5, got %d\n", size); size = 0; str[0] = 0; hr = IAssemblyName_GetName(name, &size, str); ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr); ok(!str[0], "got %c\n", str[0]); ok(size == 5, "got %u\n", size); size = MAX_PATH; str[0] = '\0'; hr = IAssemblyName_GetName(name, &size, str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine", str); ok(size == 5, "Expected 5, got %d\n", size); hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); ok(hr == FUSION_E_INVALID_NAME || broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); if (hr == S_OK) win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY" " and ASM_NAME_OSINFO_ARRAY correctly\n"); else test_assembly_name_props(name, winename); IAssemblyName_Release(name); /* check the contents of the AssemblyName with parsing */ /* 'wine' */ to_widechar(namestr, "wine"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine", str); ok(size == 5, "Expected 5, got %d\n", size); size = MAX_PATH; str[0] = '\0'; hr = IAssemblyName_GetName(name, &size, str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine", str); ok(size == 5, "Expected 5, got %d\n", size); hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); ok(hr == FUSION_E_INVALID_NAME || broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); test_assembly_name_props(name, winename); IAssemblyName_Release(name); /* 'wine, Version=1.2.3.4' */ to_widechar(namestr, "wine, Version=1.2.3.4"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine, Version=1.2.3.4", str); ok(size == 22, "Expected 22, got %d\n", size); size = MAX_PATH; str[0] = '\0'; hr = IAssemblyName_GetName(name, &size, str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine", str); ok(size == 5, "Expected 5, got %d\n", size); hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(hi == 0x00010002, "Expected 0x00010002, got %08x\n", hi); ok(lo == 0x00030004, "Expected 0x00030004, got %08x\n", lo); test_assembly_name_props(name, vername); IAssemblyName_Release(name); /* Version isn't of the form 1.x.x.x */ to_widechar(namestr, "wine, Version=1.5"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine, Version=1.5", str); ok(size == 18, "Expected 18, got %d\n", size); size = MAX_PATH; str[0] = '\0'; hr = IAssemblyName_GetName(name, &size, str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine", str); ok(size == 5, "Expected 5, got %d\n", size); hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); ok(hr == FUSION_E_INVALID_NAME || broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0 || broken(hi == 0x10005), /* .NET 1.x */ "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); test_assembly_name_props(name, badvername); IAssemblyName_Release(name); /* 'wine, Culture=neutral' */ to_widechar(namestr, "wine, Culture=neutral"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine, Culture=neutral", str); ok(size == 22, "Expected 22, got %d\n", size); size = MAX_PATH; str[0] = '\0'; hr = IAssemblyName_GetName(name, &size, str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine", str); ok(size == 5, "Expected 5, got %d\n", size); hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); ok(hr == FUSION_E_INVALID_NAME || broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); test_assembly_name_props(name, neutralname); IAssemblyName_Release(name); /* 'wine, Culture=en' */ to_widechar(namestr, "wine, Culture=en"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine, Culture=en", str); ok(size == 17, "Expected 17, got %d\n", size); size = MAX_PATH; str[0] = '\0'; hr = IAssemblyName_GetName(name, &size, str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine", str); ok(size == 5, "Expected 5, got %d\n", size); hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); ok(hr == FUSION_E_INVALID_NAME || broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); test_assembly_name_props(name, enname); IAssemblyName_Release(name); /* 'wine, PublicKeyToken=1234567890abcdef' */ to_widechar(namestr, "wine, PublicKeyToken=1234567890abcdef"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine, PublicKeyToken=1234567890abcdef", str); ok(size == 38, "Expected 38, got %d\n", size); size = MAX_PATH; str[0] = '\0'; hr = IAssemblyName_GetName(name, &size, str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine", str); ok(size == 5, "Expected 5, got %d\n", size); hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); ok(hr == FUSION_E_INVALID_NAME || broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); test_assembly_name_props(name, pubkeyname); IAssemblyName_Release(name); /* Processor architecture tests */ to_widechar(namestr, "wine, processorArchitecture=x86"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); WideCharToMultiByte(CP_ACP, 0, str, -1, string1, MAX_PATH, NULL, NULL); if (lstrcmpA(string1, "wine") == 0) win_skip("processorArchitecture not supported on .NET 1.x\n"); else { ok_aw("wine, processorArchitecture=x86", str); ok(size == 32, "Expected 32, got %d\n", size); IAssemblyName_Release(name); /* amd64 */ to_widechar(namestr, "wine, processorArchitecture=AMD64"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine, processorArchitecture=AMD64", str); ok(size == 34, "Expected 34, got %d\n", size); IAssemblyName_Release(name); /* ia64 */ to_widechar(namestr, "wine, processorArchitecture=IA64"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine, processorArchitecture=IA64", str); ok(size == 33, "Expected 33, got %d\n", size); IAssemblyName_Release(name); /* msil */ to_widechar(namestr, "wine, processorArchitecture=MSIL"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine, processorArchitecture=MSIL", str); ok(size == 33, "Expected 33, got %d\n", size); IAssemblyName_Release(name); } /* Pulling out various different values */ to_widechar(namestr, "wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_VERSION | ASM_DISPLAYF_CULTURE); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine, Version=1.2.3.4, Culture=en", str); ok(size == 34, "Expected 34, got %d\n", size); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_CULTURE | ASM_DISPLAYF_PUBLIC_KEY_TOKEN); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine, Culture=en, PublicKeyToken=1234567890abcdef", str); ok(size == 50, "Expected 50, got %d\n", size); size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef", str); ok(size == 67, "Expected 67, got %d\n", size); IAssemblyName_Release(name); /* invalid property */ to_widechar(namestr, "wine, BadProp=42"); name = NULL; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); size = MAX_PATH; str[0] = '\0'; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine", str); ok(size == 5, "Expected 5, got %d\n", size); size = MAX_PATH; str[0] = '\0'; hr = IAssemblyName_GetName(name, &size, str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok_aw("wine", str); ok(size == 5, "Expected 5, got %d\n", size); hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); ok(hr == FUSION_E_INVALID_NAME || broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); test_assembly_name_props(name, winename); IAssemblyName_Release(name); /* PublicKeyToken is not 16 chars long */ to_widechar(namestr, "wine, PublicKeyToken=567890abcdef"); name = (IAssemblyName *)0xdeadbeef; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); if (hr == S_OK && name != (IAssemblyName *)0xdeadbeef) { win_skip(".NET 1.x doesn't check PublicKeyToken correctly\n"); IAssemblyName_Release(name); return; } ok(hr == FUSION_E_INVALID_NAME, "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name); /* PublicKeyToken contains invalid chars */ to_widechar(namestr, "wine, PublicKeyToken=1234567890ghijkl"); name = (IAssemblyName *)0xdeadbeef; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == FUSION_E_INVALID_NAME, "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name); /* no comma separator */ to_widechar(namestr, "wine PublicKeyToken=1234567890abcdef"); name = (IAssemblyName *)0xdeadbeef; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == FUSION_E_INVALID_NAME, "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name); if(SUCCEEDED(hr)) IAssemblyName_Release(name); /* no '=' */ to_widechar(namestr, "wine, PublicKeyToken"); name = (IAssemblyName *)0xdeadbeef; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == FUSION_E_INVALID_NAME, "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name); /* no value */ to_widechar(namestr, "wine, PublicKeyToken="); name = (IAssemblyName *)0xdeadbeef; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == FUSION_E_INVALID_NAME, "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name); /* no spaces */ to_widechar(namestr, "wine,version=1.0.0.0"); name = (IAssemblyName *)0xdeadbeef; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); hi = lo = 0xdeadbeef; hr = IAssemblyName_GetVersion(name, &hi, &lo); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(hi == 65536, "Expected 536, got %u\n", hi); ok(lo == 0, "Expected 0, got %u\n", lo); IAssemblyName_Release(name); /* quoted values */ to_widechar(namestr, "wine, version=\"1.0.0.0\",culture=\"en\""); name = (IAssemblyName *)0xdeadbeef; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(name != NULL, "Expected non-NULL name\n"); hi = lo = 0xdeadbeef; hr = IAssemblyName_GetVersion(name, &hi, &lo); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(hi == 65536, "Expected 65536, got %u\n", hi); ok(lo == 0, "Expected 0, got %u\n", lo); IAssemblyName_Release(name); }
static HRESULT WINAPI IAssemblyCacheImpl_UninstallAssembly(IAssemblyCache *iface, DWORD dwFlags, LPCWSTR pszAssemblyName, LPCFUSION_INSTALL_REFERENCE pRefData, ULONG *pulDisposition) { HRESULT hr; IAssemblyCacheImpl *cache = impl_from_IAssemblyCache(iface); IAssemblyName *asmname, *next = NULL; IAssemblyEnum *asmenum = NULL; WCHAR *p, *path = NULL; ULONG disp; DWORD len; TRACE("(%p, 0%08x, %s, %p, %p)\n", iface, dwFlags, debugstr_w(pszAssemblyName), pRefData, pulDisposition); if (pRefData) { FIXME("application reference not supported\n"); return E_NOTIMPL; } hr = CreateAssemblyNameObject( &asmname, pszAssemblyName, CANOF_PARSE_DISPLAY_NAME, NULL ); if (FAILED( hr )) return hr; cache_lock( cache ); hr = CreateAssemblyEnum( &asmenum, NULL, asmname, ASM_CACHE_GAC, NULL ); if (FAILED( hr )) goto done; hr = IAssemblyEnum_GetNextAssembly( asmenum, NULL, &next, 0 ); if (hr == S_FALSE) { if (pulDisposition) *pulDisposition = IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED; goto done; } hr = IAssemblyName_GetPath( next, NULL, &len ); if (hr != HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER )) goto done; if (!(path = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) { hr = E_OUTOFMEMORY; goto done; } hr = IAssemblyName_GetPath( next, path, &len ); if (FAILED( hr )) goto done; if (DeleteFileW( path )) { if ((p = strrchrW( path, '\\' ))) { *p = 0; RemoveDirectoryW( path ); if ((p = strrchrW( path, '\\' ))) { *p = 0; RemoveDirectoryW( path ); } } disp = IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED; hr = S_OK; } else { disp = IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED; hr = S_FALSE; } if (pulDisposition) *pulDisposition = disp; done: IAssemblyName_Release( asmname ); if (next) IAssemblyName_Release( next ); if (asmenum) IAssemblyEnum_Release( asmenum ); HeapFree( GetProcessHeap(), 0, path ); cache_unlock( cache ); return hr; }
static void test_CreateAssemblyNameObject( void ) { static const WCHAR emptyW[] = {0}; IAssemblyName *name; HRESULT hr; hr = CreateAssemblyNameObject( NULL, wine1W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok(hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, NULL, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, emptyW, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, NULL, CANOF_SET_DEFAULT_VALUES, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, emptyW, CANOF_SET_DEFAULT_VALUES, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = NULL; hr = CreateAssemblyNameObject( &name, wine1W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "expected S_OK got %08x\n", hr ); ok( name != NULL, "expected non-NULL name\n" ); IAssemblyName_Release( name ); hr = CreateAssemblyNameObject( NULL, wine1W, CANOF_SET_DEFAULT_VALUES, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, NULL, CANOF_SET_DEFAULT_VALUES, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, emptyW, CANOF_SET_DEFAULT_VALUES, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, NULL, CANOF_SET_DEFAULT_VALUES, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, emptyW, CANOF_SET_DEFAULT_VALUES, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, wine1W, CANOF_SET_DEFAULT_VALUES, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); hr = CreateAssemblyNameObject( NULL, wine1W, 0, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, NULL, 0, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, emptyW, 0, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, NULL, 0, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, emptyW, 0, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, wine1W, 0, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); hr = CreateAssemblyNameObject( NULL, wine1W, CANOF_SET_DEFAULT_VALUES|CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, NULL, CANOF_SET_DEFAULT_VALUES|CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, emptyW, CANOF_SET_DEFAULT_VALUES|CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, NULL, CANOF_SET_DEFAULT_VALUES|CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, emptyW, CANOF_SET_DEFAULT_VALUES|CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, wine1W, CANOF_SET_DEFAULT_VALUES|CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = NULL; hr = CreateAssemblyNameObject( &name, wine3W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "expected S_OK got %08x\n", hr ); ok( name != NULL, "expected non-NULL name\n" ); IAssemblyName_Release( name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, wine4W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, wine5W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == HRESULT_FROM_WIN32( ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME ), "expected ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, wine6W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == HRESULT_FROM_WIN32( ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME ), "expected ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, wine7W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = NULL; hr = CreateAssemblyNameObject( &name, wine8W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "expected S_OK got %08x\n", hr ); ok( name != NULL, "expected non-NULL name\n" ); IAssemblyName_Release( name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, wine9W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = NULL; hr = CreateAssemblyNameObject( &name, wine10W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "expected S_OK got %08x\n", hr ); ok( name != NULL, "expected non-NULL name\n" ); IAssemblyName_Release( name ); name = (IAssemblyName *)0xdeadbeef; hr = CreateAssemblyNameObject( &name, wine11W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); }