2 * Copyright 2008 James Hawkins
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.
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.
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
29 #include "wine/test.h"
31 typedef struct _tagASSEMBLY ASSEMBLY
;
60 LARGE_INTEGER MaskValid
;
61 LARGE_INTEGER MaskSorted
;
106 DWORD ImportLookupTable
;
108 DWORD ForwarderChain
;
110 DWORD ImportAddressTable
;
116 DWORD HintNameTableRVA
;
143 VS_FIXEDFILEINFO Value
;
197 static struct _tagASSEMBLY
199 IMAGE_DOS_HEADER doshdr
;
201 IMAGE_NT_HEADERS32 nthdrs
;
202 IMAGE_SECTION_HEADER text
;
203 IMAGE_SECTION_HEADER rsrc
;
204 IMAGE_SECTION_HEADER reloc
;
206 IMAGE_IMPORT_BY_NAME iat
;
208 IMAGE_COR20_HEADER clrhdr
;
211 METADATAHDR metadatahdr
;
212 METADATASTREAMHDR roothdr
;
214 METADATASTREAMHDR stringshdr
;
215 BYTE stringsname
[12];
216 METADATASTREAMHDR ushdr
;
218 METADATASTREAMHDR guidhdr
;
220 METADATASTREAMHDR blobhdr
;
222 METADATATABLESHDR tableshdr
;
224 MODULETABLE modtable
;
225 TYPEDEFTABLE tdtable
;
226 ASSEMBLYTABLE asmtable
;
227 MANIFESTRESTABLE manifestrestable
;
233 IMAGE_IMPORT_DESCRIPTOR importdesc
;
235 IMPORTLOOKUPTABLE importlookup
;
236 HINTNAMETABLE hintnametable
;
238 IMAGE_RESOURCE_DIRECTORY topresdir
;
239 IMAGE_RESOURCE_DIRECTORY_ENTRY labelres
;
240 IMAGE_RESOURCE_DIRECTORY res11dir
;
241 IMAGE_RESOURCE_DIRECTORY_ENTRY label11res
;
242 IMAGE_RESOURCE_DIRECTORY res10dir
;
243 IMAGE_RESOURCE_DIRECTORY_ENTRY label10res
;
244 IMAGE_RESOURCE_DATA_ENTRY resdata
;
245 VS_VERSIONINFO verinfo
;
246 VARFILEINFO varfileinfo
;
248 STRINGFILEINFO strfileinfo
;
249 STRINGTABLE strtable
;
250 STRINGHDR filedeschdr
;
251 WCHAR filedesckey
[17];
252 WCHAR filedescval
[2];
253 STRINGHDR fileverhdr
;
254 WCHAR fileverkey
[13];
256 STRINGHDR intnamehdr
;
257 WCHAR intnamekey
[13];
258 WCHAR intnameval
[10];
259 STRINGHDR copyrighthdr
;
260 WCHAR copyrightkey
[15];
261 WCHAR copyrightval
[2];
262 STRINGHDR orignamehdr
;
263 WCHAR orignamekey
[17];
264 WCHAR orignameval
[10];
265 STRINGHDR prodverhdr
;
266 WCHAR prodverkey
[15];
272 RELOCATION relocation
;
276 /* IMAGE_DOS_HEADER */
278 IMAGE_DOS_SIGNATURE
, 144, 3, 0, 4, 0, 0xFFFF, 0, 0xB8, 0, 0, 0, 0x40,
279 0, { 0 }, 0, 0, { 0 }, 0x80
281 /* binary to print "This program cannot be run in DOS mode." */
283 0x1F0E, 0x0EBA, 0xB400, 0xCD09, 0xB821, 0x4C01, 0x21CD, 0x6854, 0x7369,
284 0x7020, 0x6F72, 0x7267, 0x6D61, 0x6320, 0x6E61, 0x6F6E, 0x2074, 0x6562,
285 0x7220, 0x6E75, 0x6920, 0x206E, 0x4F44, 0x2053, 0x6F6D, 0x6564, 0x0D2E,
286 0x0A0D, 0x0024, 0x0000, 0x0000, 0x0000
288 /* IMAGE_NT_HEADERS32 */
290 IMAGE_NT_SIGNATURE
, /* Signature */
291 /* IMAGE_FILE_HEADER */
293 IMAGE_FILE_MACHINE_I386
, /* Machine */
294 3, /* NumberOfSections */
295 0x47EFDF09, /* TimeDateStamp */
296 0, /* PointerToSymbolTable */
297 0, /* NumberOfSymbols */
298 0xE0, /* SizeOfOptionalHeader */
299 IMAGE_FILE_32BIT_MACHINE
| IMAGE_FILE_LOCAL_SYMS_STRIPPED
|
300 IMAGE_FILE_LINE_NUMS_STRIPPED
| IMAGE_FILE_EXECUTABLE_IMAGE
|
301 IMAGE_FILE_DLL
, /* Characteristics */
303 /* IMAGE_OPTIONAL_HEADER32 */
305 IMAGE_NT_OPTIONAL_HDR_MAGIC
, /* Magic */
306 8, /* MajorLinkerVersion */
307 0, /* MinorLinkerVersion */
308 0x400, /* SizeOfCode */
309 0x600, /* SizeOfInitializedData */
310 0, /* SizeOfUninitializedData */
311 0x238E, /* AddressOfEntryPoint */
312 0x2000, /* BaseOfCode */
313 0x4000, /* BaseOfData */
314 0x400000, /* ImageBase */
315 0x2000, /* SectionAlignment */
316 0x200, /* FileAlignment */
317 4, /* MajorOperatingSystemVersion */
318 0, /* MinorOperatingSystemVersion */
319 0, /* MajorImageVersion */
320 0, /* MinorImageVersion */
321 4, /* MajorSubsystemVersion */
322 0, /* MinorSubsystemVersion */
323 0, /* Win32VersionValue */
324 0x8000, /* SizeOfImage */
325 0x200, /* SizeOfHeaders */
326 0xB576, /* CheckSum */
327 IMAGE_SUBSYSTEM_WINDOWS_CUI
, /* Subsystem */
328 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
|
329 IMAGE_DLLCHARACTERISTICS_NO_SEH
|
330 IMAGE_DLLCHARACTERISTICS_NX_COMPAT
, /* DllCharacteristics */
331 0x100000, /* SizeOfStackReserve */
332 0x1000, /* SizeOfStackCommit */
333 0x100000, /* SizeOfHeapReserve */
334 0x1000, /* SizeOfHeapCommit */
336 0x10, /* NumberOfRvaAndSizes */
337 /* IMAGE_DATA_DIRECTORY */
339 { 0 }, /* Export Table */
340 { 0x233C, 0x4F }, /* Import Table */
341 { 0x4000, 0x298 }, /* Resource Table */
342 { 0 }, /* Exception Table */
343 { 0 }, /* Certificate Table */
344 { 0x6000, 0xC }, /* Base Relocation Table */
346 { 0 }, /* Copyright */
347 { 0 }, /* Global Ptr */
348 { 0 }, /* TLS Table */
349 { 0 }, /* Load Config Table */
350 { 0 }, /* Bound Import */
351 { 0x2000, 8 }, /* IAT */
352 { 0 }, /* Delay Import Descriptor */
353 { 0x2008, 0x48 }, /* CLI Header */
358 /* IMAGE_SECTION_HEADER */
361 { 0x394 }, /* Misc.VirtualSize */
362 0x2000, /* VirtualAddress */
363 0x400, /* SizeOfRawData */
364 0x200, /* PointerToRawData */
365 0, /* PointerToRelocations */
366 0, /* PointerToLinenumbers */
367 0, /* NumberOfRelocations */
368 0, /* NumberOfLinenumbers */
369 IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_EXECUTE
|
370 IMAGE_SCN_CNT_CODE
, /* Characteristics */
372 /* IMAGE_SECTION_HEADER */
375 { 0x298 }, /* Misc.VirtualSize */
376 0x4000, /* VirtualAddress */
377 0x400, /* SizeOfRawData */
378 0x600, /* PointerToRawData */
379 0, /* PointerToRelocations */
380 0, /* PointerToLinenumbers */
381 0, /* NumberOfRelocations */
382 0, /* NumberOfLinenumbers */
383 IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_MEM_READ
, /* Characteristics */
385 /* IMAGE_SECTION_HEADER */
388 { 0xC }, /* Misc.VirtualSize */
389 0x6000, /* VirtualAddress */
390 0x200, /* SizeOfRawData */
391 0xA00, /* PointerToRawData */
392 0, /* PointerToRelocations */
393 0, /* PointerToLinenumbers */
394 0, /* NumberOfRelocations */
395 0, /* NumberOfLinenumbers */
396 IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_MEM_READ
|
397 IMAGE_SCN_MEM_DISCARDABLE
, /* Characteristics */
401 /* IMAGE_IMPORT_BY_NAME */
408 /* IMAGE_COR20_HEADER */
411 2, /* MajorRuntimeVersion */
412 5, /* MinorRuntimeVersion */
413 { 0x2188, 0x1B4 }, /* MetaData */
414 COMIMAGE_FLAGS_ILONLY
| COMIMAGE_FLAGS_STRONGNAMESIGNED
, /* Flags */
415 0, /* EntryPointToken */
416 { 0x20D0, 0xB8 }, /* Resources */
417 { 0x2050, 0x80 }, /* StrongNameSignature */
418 { 0 }, /* CodeManagerTable */
419 { 0 }, /* VTableFixups */
420 { 0 }, /* ExportAddressTableJumps */
421 { 0 } /* ManagedNativeHeader */
423 { 0xE496, 0x9A6E, 0xD95E, 0xA2A1, 0x5D72, 0x9CEF, 0x41E3, 0xD483,
424 0xCB5C, 0x329A, 0x887C, 0xE18E, 0xE664, 0x2E1C, 0x0E61, 0xB361,
425 0x8B88, 0xC8D0, 0x47A5, 0x9260, 0x6CC5, 0xE60F, 0x1F61, 0x1E3E,
426 0xAFEE, 0x925A, 0xA084, 0x6B44, 0x2DC6, 0x8126, 0xEBC9, 0xD812,
427 0xF3E9, 0xA3F3, 0xD0D5, 0x2C7F, 0x4592, 0xA0AF, 0x8B15, 0xD91E,
428 0x693E, 0x7A4F, 0x5567, 0xC466, 0xC410, 0x3D29, 0xB25F, 0xCD6C,
429 0x53EF, 0x0D29, 0x085A, 0xEC39, 0xE3BD, 0x58E0, 0x78F5, 0x0587,
430 0xF8D8, 0x14E4, 0x77CE, 0xCCC9, 0x4DCF, 0x8A18, 0x90E8, 0x1A52
435 0xBEEFCACE, /* Signature */
436 1, /* HeaderVersion */
437 0x91, /* SkipBytes */
438 { 'l','S','y','s','t','e','m','.','R','e','s','o','u','r','c','e','s','.',
439 'R','e','s','o','u','r','c','e','R','e','a','d','e','r',',',' ',
440 'm','s','c','o','r','l','i','b',',',' ','V','e','r','s','i','o','n','=',
441 '2','.','0','.','0','.','0',',',' ','C','u','l','t','u','r','e','=',
442 'n','e','u','t','r','a','l',',',' ','P','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
443 'b','7','7','a','5','c','5','6','1','9','3','4','e','0','8','9',
444 '#','S','y','s','t','e','m','.','R','e','s','o','u','r','c','e','s','.',
445 'R','u','n','t','i','m','e','R','e','s','o','u','r','c','e','S','e','t',
446 2,0,0,0,0,0,0,0,0,0,0,0,'P','A','D','P','A','D','P',180,0,0,0
451 0x424A5342, /* Signature */
452 1, /* MajorVersion */
453 1, /* MinorVersion */
455 0xC, /* VersionLength */
456 "v2.0.50727", /* Version */
460 /* METADATASTREAMHDR */
466 /* METADATASTREAMHDR */
472 /* METADATASTREAMHDR */
478 /* METADATASTREAMHDR */
484 /* METADATASTREAMHDR */
490 /* METADATATABLESHDR */
493 2, /* MajorVersion */
494 0, /* MinorVersion */
495 0, /* HeapOffsetSizes */
497 { { 0 } }, /* MaskValid */
498 { { 0 } } /* MaskSorted */
521 0x8004, /* HashAlgId */
522 1, /* MajorVersion */
523 0, /* MinorVersion */
525 0, /* RevisionNumber */
531 /* MANIFESTRESTABLE */
536 0 /* Implementation */
541 "\0<Module>\0wine.dll\0wine\0wine.resources\0\0",
545 { 0x86EF, 0x5B5A, 0x2C5E, 0x4F6D, 0xC2AB, 0x0A94, 0xD658, 0x31DA },
547 { 0x8000, 0x00A0, 0x0024, 0x0400, 0x0080, 0x9400, 0x0000, 0x0600,
548 0x0002, 0x0000, 0x0024, 0x5200, 0x4153, 0x0031, 0x0004, 0x0100,
549 0x0100, 0x2F00, 0x60E0, 0x4D76, 0x5E5C, 0x430A, 0x6FF3, 0x77D6,
550 0x04CA, 0xF6AD, 0xF54D, 0x0AD2, 0x9FB6, 0x39C2, 0x2E66, 0xD30F,
551 0x916F, 0x1826, 0xFB52, 0x78A0, 0x8262, 0x6902, 0xBD47, 0xAF30,
552 0xBAB1, 0x29DA, 0xAA6D, 0xF189, 0x296A, 0x0F13, 0x4982, 0x531D,
553 0x8283, 0x1343, 0x5A33, 0x5D36, 0xEB3F, 0x0863, 0xA771, 0x0679,
554 0x4DFF, 0xD30A, 0xBEAD, 0x2A9F, 0x12A8, 0x4319, 0x5706, 0x333D,
555 0x0CAC, 0xE80A, 0xFD99, 0xC82D, 0x3D3B, 0xBFFE, 0xF256, 0x25E3,
556 0x1A12, 0xC116, 0x8936, 0xF237, 0x5F26, 0xC68A, 0x1E42, 0xCE41,
559 /* IMAGE_IMPORT_DESCRIPTOR */
561 { 0x2364 }, /* OriginalFirstThunk */
562 0, /* TimeDateStamp */
563 0, /* ForwarderChain */
565 0x2000, /* FirstThunk */
569 /* IMPORTLOOKUPTABLE */
571 0x2370, /* HintNameTableRVA */
577 "_CorDllMain", /* Name */
578 "mscoree.dll", /* Module */
580 0x25FF, /* EntryPoint */
585 /* IMAGE_RESOURCE_DIRECTORY */
587 0, /* Characteristics */
588 0, /* TimeDateStamp */
589 0, /* MajorVersion */
590 0, /* MinorVersion */
591 0, /* NumberOfNamedEntries */
592 1, /* NumberOfIdEntries */
594 /* IMAGE_RESOURCE_DIRECTORY_ENTRY */
595 { { { 0 } }, { 0 } }, /* nameless unions initialized later */
596 /* IMAGE_RESOURCE_DIRECTORY */
598 0, /* Characteristics */
599 0, /* TimeDateStamp */
600 0, /* MajorVersion */
601 0, /* MinorVersion */
602 0, /* NumberOfNamedEntries */
603 1, /* NumberOfIdEntries */
605 /* IMAGE_RESOURCE_DIRECTORY_ENTRY */
606 { { { 0 } }, { 0 } }, /* nameless unions initialized later */
607 /* IMAGE_RESOURCE_DIRECTORY */
609 0, /* Characteristics */
610 0, /* TimeDateStamp */
611 0, /* MajorVersion */
612 0, /* MinorVersion */
613 0, /* NumberOfNamedEntries */
614 1, /* NumberOfIdEntries */
616 /* IMAGE_RESOURCE_DIRECTORY_ENTRY */
617 { { { 0 } }, { 0 } }, /* nameless unions initialized later */
618 /* IMAGE_RESOURCE_DATA_ENTRY */
620 0x4058, /* OffsetToData */
628 0x34, /* wValueLength */
630 { 'V','S','_','V','E','R','S','I','O','N','_','I','N','F','O',0,0 }, /* szKey */
631 /* VS_FIXEDFILEINFO */
633 VS_FFI_SIGNATURE
, /* dwSignature */
634 VS_FFI_STRUCVERSION
, /* dwStrucVersion */
635 0x10000, /* dwFileVersionMS */
636 0x00000, /* dwFileVersionLS */
637 0x10000, /* dwProductVersionMS */
638 0x00000, /* dwProductVersionLS */
639 VS_FFI_FILEFLAGSMASK
, /* dwFileFlagsMask */
640 0x0, /* dwFileFlags */
641 VOS__WINDOWS32
, /* dwFileOS */
642 VFT_DLL
, /* dwFileType */
643 VFT2_UNKNOWN
, /* dwFileSubtype */
644 0, /* dwFileDateMS */
645 0, /* dwFileDateLS */
651 0, /* wValueLength */
653 { 'V','a','r','F','i','l','e','I','n','f','o',0,0 } /* szKey */
658 0x4, /* wValueLength */
660 { 'T','r','a','n','s','l','a','t','i','o','n',0,0 }, /* szKey */
661 0x4B00000, /* Value */
666 0, /* wValueLength */
668 { 'S','t','r','i','n','g','F','i','l','e','I','n','f','o',0 }, /* szKey */
673 0, /* wValueLength */
675 { '0','0','0','0','0','4','b','0',0 }, /* szKey */
680 2, /* wValueLength */
683 { 'F','i','l','e','D','e','s','c','r','i','p','t','i','o','n',0,0 }, /* szKey */
684 { ' ',0 }, /* szValue */
688 8, /* wValueLength */
691 { 'F','i','l','e','V','e','r','s','i','o','n',0,0 }, /* szKey */
692 { '1','.','0','.','0','.','0',0 }, /* szValue */
696 9, /* wValueLength */
699 { 'I','n','t','e','r','n','a','l','N','a','m','e',0 }, /* szKey */
700 { 'w','i','n','e','.','d','l','l',0 }, /* szValue */
704 2, /* wValueLength */
707 { 'L','e','g','a','l','C','o','p','y','r','i','g','h','t',0 }, /* szKey */
708 { ' ',0 }, /* szValue */
712 9, /* wValueLength */
715 { 'O','r','i','g','i','n','a','l','F','i','l','e','n','a','m','e',0 }, /* szKey */
716 { 'w','i','n','e','.','d','l','l',0,0 }, /* szValue */
720 8, /* wValueLength */
723 { 'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0 }, /* szKey */
724 { '1','.','0','.','0','.','0',0 }, /* szValue */
728 8, /* wValueLength */
731 { 'A','s','s','e','m','b','l','y',' ','V','e','r','s','i','o','n',0 }, /* szKey */
732 { '1','.','0','.','0','.','0',0 }, /* szValue */
736 0x2000, /* PageRVA */
738 0x3390, /* Relocation */
744 static HRESULT (WINAPI
*pCreateAssemblyCache
)(IAssemblyCache
**ppAsmCache
,
746 static HRESULT (WINAPI
*pGetCachePath
)(ASM_CACHE_FLAGS dwCacheFlags
,
747 LPWSTR pwzCachePath
, PDWORD pcchPath
);
748 static HRESULT (WINAPI
*pLoadLibraryShim
)(LPCWSTR szDllName
, LPCWSTR szVersion
,
749 LPVOID pvReserved
, HMODULE
*phModDll
);
751 static BOOL
init_functionpointers(void)
757 static const WCHAR szFusion
[] = {'f','u','s','i','o','n','.','d','l','l',0};
759 hmscoree
= LoadLibraryA("mscoree.dll");
762 skip("mscoree.dll not available\n");
766 pLoadLibraryShim
= (void *)GetProcAddress(hmscoree
, "LoadLibraryShim");
767 if (!pLoadLibraryShim
)
769 skip("LoadLibraryShim not available\n");
770 FreeLibrary(hmscoree
);
774 hr
= pLoadLibraryShim(szFusion
, NULL
, NULL
, &hfusion
);
777 skip("fusion.dll not available\n");
778 FreeLibrary(hmscoree
);
782 pCreateAssemblyCache
= (void *)GetProcAddress(hfusion
, "CreateAssemblyCache");
783 pGetCachePath
= (void *)GetProcAddress(hfusion
, "GetCachePath");
785 if (!pCreateAssemblyCache
|| !pGetCachePath
)
787 skip("fusion.dll not implemented\n");
791 FreeLibrary(hmscoree
);
795 static void create_file_data(LPCSTR name
, LPCSTR data
, DWORD size
)
800 file
= CreateFileA(name
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, 0, NULL
);
801 ok(file
!= INVALID_HANDLE_VALUE
, "Failure to open file %s\n", name
);
802 WriteFile(file
, data
, strlen(data
), &written
, NULL
);
806 SetFilePointer(file
, size
, NULL
, FILE_BEGIN
);
813 #define create_file(name, size) create_file_data(name, name, size)
815 static void create_assembly(LPCSTR file
)
820 /* nameless unions initialized here */
821 assembly
.tableshdr
.MaskValid
.u
.HighPart
= 0x101;
822 assembly
.tableshdr
.MaskValid
.u
.LowPart
= 0x00000005;
823 assembly
.tableshdr
.MaskSorted
.u
.HighPart
= 0x1600;
824 assembly
.tableshdr
.MaskSorted
.u
.LowPart
= 0x3301FA00;
825 U1(assembly
.labelres
).Name
= 0x10;
826 U2(assembly
.labelres
).OffsetToData
= 0x80000018;
827 U1(assembly
.label11res
).Name
= 0x1;
828 U2(assembly
.label11res
).OffsetToData
= 0x80000030;
829 U1(assembly
.label10res
).Name
= 0x0;
830 U2(assembly
.label10res
).OffsetToData
= 0x48;
832 hfile
= CreateFileA(file
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, 0, 0);
834 WriteFile(hfile
, &assembly
, sizeof(ASSEMBLY
), &written
, NULL
);
838 static BOOL
check_dotnet20(void)
840 IAssemblyCache
*cache
;
844 static const WCHAR winedll
[] = {'w','i','n','e','.','d','l','l',0};
846 create_assembly("wine.dll");
848 hr
= pCreateAssemblyCache(&cache
, 0);
849 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
851 hr
= IAssemblyCache_InstallAssembly(cache
, 0, winedll
, NULL
);
854 else if (hr
== CLDB_E_FILE_OLDVER
)
855 win_skip("Tests can't be run on older .NET version (.NET 1.1)\n");
856 else if (hr
== E_ACCESSDENIED
)
857 skip("Not enough rights to install an assembly\n");
859 ok(0, "Expected S_OK, got %08x\n", hr
);
861 DeleteFileA("wine.dll");
862 IAssemblyCache_Release(cache
);
866 static void test_CreateAssemblyCache(void)
868 IAssemblyCache
*cache
;
871 /* NULL ppAsmCache */
872 hr
= pCreateAssemblyCache(NULL
, 0);
873 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
875 /* dwReserved is non-zero */
876 hr
= pCreateAssemblyCache(&cache
, 42);
877 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
879 IAssemblyCache_Release(cache
);
882 static void test_InstallAssembly(void)
884 IAssemblyCache
*cache
;
889 static const WCHAR empty
[] = {0};
890 static const WCHAR noext
[] = {'f','i','l','e',0};
891 static const WCHAR badext
[] = {'f','i','l','e','.','b','a','d',0};
892 static const WCHAR dllext
[] = {'f','i','l','e','.','d','l','l',0};
893 static const WCHAR exeext
[] = {'f','i','l','e','.','e','x','e',0};
894 static const WCHAR testdll
[] = {'t','e','s','t','.','d','l','l',0};
895 static const WCHAR winedll
[] = {'w','i','n','e','.','d','l','l',0};
896 static const WCHAR wine
[] = {'w','i','n','e',0};
898 create_file("test.dll", 100);
899 create_assembly("wine.dll");
901 hr
= pCreateAssemblyCache(&cache
, 0);
902 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
904 /* NULL pszManifestFilePath */
905 hr
= IAssemblyCache_InstallAssembly(cache
, 0, NULL
, NULL
);
906 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
908 /* empty pszManifestFilePath */
909 hr
= IAssemblyCache_InstallAssembly(cache
, 0, empty
, NULL
);
910 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
912 /* pszManifestFilePath has no extension */
913 hr
= IAssemblyCache_InstallAssembly(cache
, 0, noext
, NULL
);
914 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
),
915 "Expected HRESULT_FROM_WIN32(ERROR_INVALID_NAME), got %08x\n", hr
);
917 /* pszManifestFilePath has bad extension */
918 hr
= IAssemblyCache_InstallAssembly(cache
, 0, badext
, NULL
);
919 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
),
920 "Expected HRESULT_FROM_WIN32(ERROR_INVALID_NAME), got %08x\n", hr
);
922 /* pszManifestFilePath has dll extension */
923 hr
= IAssemblyCache_InstallAssembly(cache
, 0, dllext
, NULL
);
924 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
925 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
927 /* pszManifestFilePath has exe extension */
928 hr
= IAssemblyCache_InstallAssembly(cache
, 0, exeext
, NULL
);
929 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
930 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
933 hr
= IAssemblyCache_InstallAssembly(cache
, 0, testdll
, NULL
);
934 ok(hr
== COR_E_ASSEMBLYEXPECTED
,
935 "Expected COR_E_ASSEMBLYEXPECTED, got %08x\n", hr
);
938 hr
= IAssemblyCache_InstallAssembly(cache
, 0, winedll
, NULL
);
939 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
941 attr
= GetFileAttributes("C:\\windows\\assembly\\GAC_MSIL\\wine\\"
942 "1.0.0.0__2d03617b1c31e2f5/wine.dll");
943 ok(attr
!= INVALID_FILE_ATTRIBUTES
, "Expected assembly to exist\n");
945 /* uninstall the assembly from the GAC */
947 hr
= IAssemblyCache_UninstallAssembly(cache
, 0, wine
, NULL
, &disp
);
950 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
951 ok(disp
== IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED
,
952 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp
);
955 /* FIXME: remove once UninstallAssembly is implemented */
956 DeleteFileA("C:\\windows\\assembly\\GAC_MSIL\\wine\\"
957 "1.0.0.0__2d03617b1c31e2f5\\wine.dll");
958 RemoveDirectoryA("C:\\windows\\assembly\\GAC_MSIL\\wine\\1.0.0.0__2d03617b1c31e2f5");
959 RemoveDirectoryA("C:\\windows\\assembly\\GAC_MSIL\\wine");
961 DeleteFileA("test.dll");
962 DeleteFileA("wine.dll");
963 IAssemblyCache_Release(cache
);
966 #define INIT_ASM_INFO() \
967 ZeroMemory(&info, sizeof(ASSEMBLY_INFO)); \
968 info.cbAssemblyInfo = sizeof(ASSEMBLY_INFO); \
969 info.pszCurrentAssemblyPathBuf = path; \
970 info.cchBuf = MAX_PATH; \
973 static void test_QueryAssemblyInfo(void)
975 IAssemblyCache
*cache
;
977 WCHAR path
[MAX_PATH
];
978 WCHAR asmpath
[MAX_PATH
];
979 WCHAR name
[MAX_PATH
];
984 static const WCHAR empty
[] = {0};
985 static const WCHAR commasep
[] = {',',' ',0};
986 static const WCHAR winedll
[] = {'w','i','n','e','.','d','l','l',0};
987 static const WCHAR wine
[] = {'w','i','n','e',0};
988 static const WCHAR ver
[] = {
989 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0};
990 static const WCHAR badver
[] = {
991 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','1',0};
992 static const WCHAR culture
[] = {
993 'C','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
994 static const WCHAR badculture
[] = {
995 'C','u','l','t','u','r','e','=','e','n',0};
996 static const WCHAR pubkey
[] = {
997 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
998 '2','d','0','3','6','1','7','b','1','c','3','1','e','2','f','5',0};
999 static const WCHAR badpubkey
[] = {
1000 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
1001 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',0};
1002 static const WCHAR badprop
[] = {'B','a','d','P','r','o','p','=','b','u','h',0};
1003 static const WCHAR msil
[] = {
1004 '_','M','S','I','L','\\','w','i','n','e','\\',
1005 '1','.','0','.','0','.','0','_','_','2','d','0','3','6','1','7','b',
1006 '1','c','3','1','e','2','f','5','\\',0};
1009 hr
= pGetCachePath(ASM_CACHE_GAC
, asmpath
, &size
);
1010 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1012 lstrcatW(asmpath
, msil
);
1013 lstrcatW(asmpath
, winedll
);
1015 create_assembly("wine.dll");
1017 hr
= pCreateAssemblyCache(&cache
, 0);
1018 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1020 /* assembly not installed yet */
1022 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, 0, wine
, &info
);
1025 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1026 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1028 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1029 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1030 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1031 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1032 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1033 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1034 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1035 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1036 "Assembly path was changed\n");
1037 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1039 hr
= IAssemblyCache_InstallAssembly(cache
, 0, winedll
, NULL
);
1040 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1042 /* NULL pszAssemblyName */
1044 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1048 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
1050 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1051 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1052 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1053 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1054 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1055 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1056 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1057 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1058 "Assembly path was changed\n");
1059 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1061 /* empty pszAssemblyName */
1063 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1067 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
1069 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1070 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1071 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1072 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1073 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1074 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1075 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1076 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1077 "Assembly path was changed\n");
1078 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1082 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, 0, wine
, &info
);
1083 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1084 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1085 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1086 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1087 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1088 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1091 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1092 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1093 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1094 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1095 "Wrong assembly path returned\n");
1096 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1097 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1100 /* pwzCachePath is full filename */
1102 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, 0, winedll
, &info
);
1105 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1106 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1108 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1109 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1110 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1111 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1112 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1113 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1114 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1115 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1116 "Assembly path was changed\n");
1117 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1119 /* NULL pAsmInfo, QUERYASMINFO_FLAG_VALIDATE */
1120 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1124 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1127 /* NULL pAsmInfo, QUERYASMINFO_FLAG_GETSIZE */
1128 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1132 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1135 /* info.cbAssemblyInfo is 0 */
1137 info
.cbAssemblyInfo
= 0;
1138 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1140 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1141 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1142 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1143 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1146 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1147 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1148 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1149 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1150 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1151 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1152 "Wrong assembly path returned\n");
1153 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1154 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1157 /* info.cbAssemblyInfo is 1 */
1159 info
.cbAssemblyInfo
= 1;
1160 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1164 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
1166 ok(info
.cbAssemblyInfo
== 1, "Expected 1, got %d\n", info
.cbAssemblyInfo
);
1167 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1168 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1169 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1170 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1171 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1172 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1173 "Assembly path was changed\n");
1174 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1176 /* info.cbAssemblyInfo is > sizeof(ASSEMBLY_INFO) */
1178 info
.cbAssemblyInfo
= sizeof(ASSEMBLY_INFO
) * 2;
1179 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1183 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
1185 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
) * 2,
1186 "Expected sizeof(ASSEMBLY_INFO) * 2, got %d\n", info
.cbAssemblyInfo
);
1187 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1188 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1189 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1190 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1191 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1192 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1193 "Assembly path was changed\n");
1194 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1196 /* QUERYASMINFO_FLAG_GETSIZE */
1198 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1200 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1201 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1202 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1203 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1206 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1207 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1208 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1209 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 4,
1210 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1211 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1212 "Wrong assembly path returned\n");
1213 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1214 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1217 /* QUERYASMINFO_FLAG_GETSIZE and QUERYASMINFO_FLAG_VALIDATE */
1219 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
|
1220 QUERYASMINFO_FLAG_VALIDATE
,wine
, &info
);
1221 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1222 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1223 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1224 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1227 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1228 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1229 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1230 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 4,
1231 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1232 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1233 "Wrong assembly path returned\n");
1234 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1235 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1238 /* info.pszCurrentAssemblyPathBuf is NULL */
1240 info
.pszCurrentAssemblyPathBuf
= NULL
;
1241 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1243 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1244 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1245 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1246 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1249 ok(hr
== HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER
),
1250 "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got %08x\n", hr
);
1251 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1252 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1253 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 4,
1254 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1255 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1256 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1259 /* info.cchBuf is exactly size of asmpath */
1261 info
.cchBuf
= lstrlenW(asmpath
);
1262 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1264 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1265 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1266 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1267 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1268 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1269 "Assembly path was changed\n");
1272 ok(hr
== HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER
),
1273 "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got %08x\n", hr
);
1274 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1275 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1276 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 4,
1277 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1278 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1279 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1282 /* info.cchBuf has room for NULL-terminator */
1284 info
.cchBuf
= lstrlenW(asmpath
) + 1;
1285 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1287 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1288 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1289 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1290 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1291 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1292 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1295 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1296 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1297 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1298 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 4,
1299 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1300 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1301 "Wrong assembly path returned\n");
1304 /* display name is "wine, Version=1.0.0.0" */
1306 lstrcpyW(name
, wine
);
1307 lstrcatW(name
, commasep
);
1308 lstrcatW(name
, ver
);
1309 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1311 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1312 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1313 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1314 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1317 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1318 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1319 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1320 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 4,
1321 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1322 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1323 "Wrong assembly path returned\n");
1324 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1325 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1328 /* display name is "wine, Version=1.0.0.1", versions don't match */
1330 lstrcpyW(name
, wine
);
1331 lstrcatW(name
, commasep
);
1332 lstrcatW(name
, badver
);
1333 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1337 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1338 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1340 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1341 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1342 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1343 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1344 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1345 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1346 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1347 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1348 "Assembly path was changed\n");
1349 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1351 /* display name is "wine, Culture=neutral" */
1353 lstrcpyW(name
, wine
);
1354 lstrcatW(name
, commasep
);
1355 lstrcatW(name
, culture
);
1356 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1358 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1359 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1360 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1361 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1364 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1365 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1366 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1367 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 4,
1368 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1369 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1370 "Wrong assembly path returned\n");
1371 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1372 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1375 /* display name is "wine, Culture=en", cultures don't match */
1377 lstrcpyW(name
, wine
);
1378 lstrcatW(name
, commasep
);
1379 lstrcatW(name
, badculture
);
1380 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1384 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1385 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1387 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1388 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1389 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1390 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1391 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1392 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1393 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1394 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1395 "Assembly path was changed\n");
1396 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1398 /* display name is "wine, PublicKeyTokens=2d03617b1c31e2f5" */
1400 lstrcpyW(name
, wine
);
1401 lstrcatW(name
, commasep
);
1402 lstrcatW(name
, pubkey
);
1403 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1405 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1406 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1407 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1408 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1411 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1412 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1413 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1414 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 4,
1415 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1416 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1417 "Wrong assembly path returned\n");
1418 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1419 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1422 /* display name is "wine, PublicKeyToken=aaaaaaaaaaaaaaaa", pubkeys don't match */
1424 lstrcpyW(name
, wine
);
1425 lstrcatW(name
, commasep
);
1426 lstrcatW(name
, badpubkey
);
1427 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1431 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1432 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1434 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1435 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1436 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1437 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1438 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1439 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1440 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1441 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1442 "Assembly path was changed\n");
1443 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1445 /* display name is "wine, BadProp=buh", bad property */
1447 lstrcpyW(name
, wine
);
1448 lstrcatW(name
, commasep
);
1449 lstrcatW(name
, badprop
);
1450 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1452 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1453 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1454 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1455 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1458 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1459 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 4,
1460 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1461 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1462 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1463 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1464 "Wrong assembly path returned\n");
1465 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1466 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1469 /* uninstall the assembly from the GAC */
1471 hr
= IAssemblyCache_UninstallAssembly(cache
, 0, wine
, NULL
, &disp
);
1474 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1475 ok(disp
== IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED
,
1476 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp
);
1479 /* FIXME: remove once UninstallAssembly is implemented */
1480 DeleteFileA("C:\\windows\\assembly\\GAC_MSIL\\wine\\"
1481 "1.0.0.0__2d03617b1c31e2f5\\wine.dll");
1482 RemoveDirectoryA("C:\\windows\\assembly\\GAC_MSIL\\wine\\1.0.0.0__2d03617b1c31e2f5");
1483 RemoveDirectoryA("C:\\windows\\assembly\\GAC_MSIL\\wine");
1485 DeleteFileA("test.dll");
1486 DeleteFileA("wine.dll");
1487 IAssemblyCache_Release(cache
);
1490 START_TEST(asmcache
)
1492 if (!init_functionpointers())
1495 if (!check_dotnet20())
1498 test_CreateAssemblyCache();
1499 test_InstallAssembly();
1500 test_QueryAssemblyInfo();