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_HDR32_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 win_skip("mscoree.dll not available\n");
766 pLoadLibraryShim
= (void *)GetProcAddress(hmscoree
, "LoadLibraryShim");
767 if (!pLoadLibraryShim
)
769 win_skip("LoadLibraryShim not available\n");
770 FreeLibrary(hmscoree
);
774 hr
= pLoadLibraryShim(szFusion
, NULL
, NULL
, &hfusion
);
777 win_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 win_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 U(assembly
.labelres
).Name
= 0x10;
826 U2(assembly
.labelres
).OffsetToData
= 0x80000018;
827 U(assembly
.label11res
).Name
= 0x1;
828 U2(assembly
.label11res
).OffsetToData
= 0x80000030;
829 U(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
;
845 static const WCHAR winedll
[] = {'w','i','n','e','.','d','l','l',0};
847 create_assembly("wine.dll");
849 hr
= pCreateAssemblyCache(&cache
, 0);
850 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
852 hr
= IAssemblyCache_InstallAssembly(cache
, 0, winedll
, NULL
);
855 else if (hr
== CLDB_E_FILE_OLDVER
)
856 win_skip("Tests can't be run on older .NET version (.NET 1.1)\n");
857 else if (hr
== E_ACCESSDENIED
)
858 skip("Not enough rights to install an assembly\n");
860 ok(0, "Expected S_OK, got %08x\n", hr
);
862 DeleteFileA("wine.dll");
863 IAssemblyCache_UninstallAssembly(cache
, 0, winedll
, NULL
, &disp
);
864 IAssemblyCache_Release(cache
);
868 static void test_CreateAssemblyCache(void)
870 IAssemblyCache
*cache
;
873 /* NULL ppAsmCache */
874 hr
= pCreateAssemblyCache(NULL
, 0);
875 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
877 /* dwReserved is non-zero */
878 hr
= pCreateAssemblyCache(&cache
, 42);
879 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
881 IAssemblyCache_Release(cache
);
884 static void test_CreateAssemblyCacheItem(void)
886 IAssemblyCache
*cache
;
887 IAssemblyCacheItem
*item
;
890 static const WCHAR wine
[] = {'w','i','n','e',0};
892 hr
= pCreateAssemblyCache(&cache
, 0);
893 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
895 hr
= IAssemblyCache_CreateAssemblyCacheItem(cache
, 0, NULL
, NULL
, NULL
);
896 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
898 hr
= IAssemblyCache_CreateAssemblyCacheItem(cache
, 0, NULL
, &item
, NULL
);
899 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
900 IAssemblyCacheItem_Release(item
);
902 hr
= IAssemblyCache_CreateAssemblyCacheItem(cache
, 0, NULL
, &item
, wine
);
903 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
904 IAssemblyCacheItem_Release(item
);
906 hr
= IAssemblyCache_CreateAssemblyCacheItem(cache
, 1, (void *)0xdeadbeef, &item
, NULL
);
907 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
908 IAssemblyCacheItem_Release(item
);
910 hr
= IAssemblyCache_CreateAssemblyCacheItem(cache
, 1, NULL
, &item
, NULL
);
911 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
912 IAssemblyCacheItem_Release(item
);
914 hr
= IAssemblyCache_CreateAssemblyCacheItem(cache
, 0, (void *)0xdeadbeef, &item
, NULL
);
915 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
916 IAssemblyCacheItem_Release(item
);
918 IAssemblyCache_Release(cache
);
921 static void test_InstallAssembly(void)
923 IAssemblyCache
*cache
;
927 char dllpath
[MAX_PATH
];
929 static const WCHAR empty
[] = {0};
930 static const WCHAR noext
[] = {'f','i','l','e',0};
931 static const WCHAR badext
[] = {'f','i','l','e','.','b','a','d',0};
932 static const WCHAR dllext
[] = {'f','i','l','e','.','d','l','l',0};
933 static const WCHAR exeext
[] = {'f','i','l','e','.','e','x','e',0};
934 static const WCHAR testdll
[] = {'t','e','s','t','.','d','l','l',0};
935 static const WCHAR winedll
[] = {'w','i','n','e','.','d','l','l',0};
936 static const WCHAR wine
[] = {'w','i','n','e',0};
938 create_file("test.dll", 100);
939 create_assembly("wine.dll");
941 hr
= pCreateAssemblyCache(&cache
, 0);
942 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
944 /* NULL pszManifestFilePath */
945 hr
= IAssemblyCache_InstallAssembly(cache
, 0, NULL
, NULL
);
946 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
948 /* empty pszManifestFilePath */
949 hr
= IAssemblyCache_InstallAssembly(cache
, 0, empty
, NULL
);
950 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
952 /* pszManifestFilePath has no extension */
953 hr
= IAssemblyCache_InstallAssembly(cache
, 0, noext
, NULL
);
954 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
),
955 "Expected HRESULT_FROM_WIN32(ERROR_INVALID_NAME), got %08x\n", hr
);
957 /* pszManifestFilePath has bad extension */
958 hr
= IAssemblyCache_InstallAssembly(cache
, 0, badext
, NULL
);
959 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
),
960 "Expected HRESULT_FROM_WIN32(ERROR_INVALID_NAME), got %08x\n", hr
);
962 /* pszManifestFilePath has dll extension */
963 hr
= IAssemblyCache_InstallAssembly(cache
, 0, dllext
, NULL
);
964 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
965 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
967 /* pszManifestFilePath has exe extension */
968 hr
= IAssemblyCache_InstallAssembly(cache
, 0, exeext
, NULL
);
969 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
970 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
973 hr
= IAssemblyCache_InstallAssembly(cache
, 0, testdll
, NULL
);
974 ok(hr
== COR_E_ASSEMBLYEXPECTED
,
975 "Expected COR_E_ASSEMBLYEXPECTED, got %08x\n", hr
);
978 hr
= IAssemblyCache_InstallAssembly(cache
, 0, winedll
, NULL
);
979 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
981 GetWindowsDirectoryA(dllpath
, MAX_PATH
);
982 strcat(dllpath
, "\\assembly\\GAC_MSIL\\wine\\\\1.0.0.0__2d03617b1c31e2f5\\wine.dll");
984 attr
= GetFileAttributesA(dllpath
);
985 ok(attr
!= INVALID_FILE_ATTRIBUTES
, "Expected assembly to exist\n");
987 /* uninstall the assembly from the GAC */
989 hr
= IAssemblyCache_UninstallAssembly(cache
, 0, wine
, NULL
, &disp
);
990 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
991 ok(disp
== IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED
,
992 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp
);
994 attr
= GetFileAttributesA(dllpath
);
995 ok(attr
== INVALID_FILE_ATTRIBUTES
, "Expected assembly not to exist\n");
998 hr
= IAssemblyCache_UninstallAssembly(cache
, 0, wine
, NULL
, &disp
);
999 ok(hr
== S_FALSE
, "Expected S_FALSE, got %08x\n", hr
);
1000 ok(disp
== IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED
,
1001 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED, got %d\n", disp
);
1003 DeleteFileA("test.dll");
1004 DeleteFileA("wine.dll");
1005 IAssemblyCache_Release(cache
);
1008 #define INIT_ASM_INFO() \
1009 ZeroMemory(&info, sizeof(ASSEMBLY_INFO)); \
1010 info.cbAssemblyInfo = sizeof(ASSEMBLY_INFO); \
1011 info.pszCurrentAssemblyPathBuf = path; \
1012 info.cchBuf = MAX_PATH; \
1015 static void test_QueryAssemblyInfo(void)
1017 IAssemblyCache
*cache
;
1019 WCHAR path
[MAX_PATH
];
1020 WCHAR asmpath
[MAX_PATH
];
1021 WCHAR name
[MAX_PATH
];
1026 static const WCHAR empty
[] = {0};
1027 static const WCHAR commasep
[] = {',',' ',0};
1028 static const WCHAR winedll
[] = {'w','i','n','e','.','d','l','l',0};
1029 static const WCHAR wine
[] = {'w','i','n','e',0};
1030 static const WCHAR ver
[] = {
1031 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0};
1032 static const WCHAR otherver
[] = {
1033 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','0','0','0','0','0',0};
1034 static const WCHAR badver
[] = {
1035 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','1',0};
1036 static const WCHAR culture
[] = {
1037 'C','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
1038 static const WCHAR badculture
[] = {
1039 'C','u','l','t','u','r','e','=','e','n',0};
1040 static const WCHAR pubkey
[] = {
1041 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
1042 '2','d','0','3','6','1','7','b','1','c','3','1','e','2','f','5',0};
1043 static const WCHAR badpubkey
[] = {
1044 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
1045 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',0};
1046 static const WCHAR badprop
[] = {'B','a','d','P','r','o','p','=','b','u','h',0};
1047 static const WCHAR msil
[] = {
1048 '_','M','S','I','L','\\','w','i','n','e','\\',
1049 '1','.','0','.','0','.','0','_','_','2','d','0','3','6','1','7','b',
1050 '1','c','3','1','e','2','f','5','\\',0};
1051 static const WCHAR wine2
[] = {
1052 'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','1',',',
1053 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
1054 '2','d','0','3','6','1','7','b','1','c','3','1','e','2','f','5',',',
1055 'c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
1056 static const WCHAR nullpublickey
[] = {
1057 'm','s','c','o','r','l','i','b','.','d','l','l',',','v','e','r','s','i','o','n','=','0','.','0','.',
1058 '0','.','0',',','c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',',',
1059 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','n','u','l','l',0};
1060 static const WCHAR nullpublickey1
[] = {
1061 'm','s','c','o','r','l','i','b','.','d','l','l',',',
1062 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','n','u','L','l',0};
1065 hr
= pGetCachePath(ASM_CACHE_GAC
, asmpath
, &size
);
1066 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1068 lstrcatW(asmpath
, msil
);
1069 lstrcatW(asmpath
, winedll
);
1071 create_assembly("wine.dll");
1073 hr
= pCreateAssemblyCache(&cache
, 0);
1074 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1076 /* assembly not installed yet */
1078 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, 0, wine
, &info
);
1079 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1080 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1081 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1082 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1083 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1084 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1085 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1086 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1087 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1088 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1089 "Assembly path was changed\n");
1090 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1092 hr
= IAssemblyCache_InstallAssembly(cache
, 0, winedll
, NULL
);
1093 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1095 /* NULL pszAssemblyName */
1097 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1099 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
1100 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1101 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1102 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1103 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1104 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1105 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1106 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1107 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1108 "Assembly path was changed\n");
1109 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1111 /* empty pszAssemblyName */
1113 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1115 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
1116 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1117 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1118 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1119 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1120 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1121 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1122 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1123 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1124 "Assembly path was changed\n");
1125 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1129 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, 0, wine
, &info
);
1130 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1131 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1132 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1133 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1134 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1135 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1136 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1137 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1138 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1139 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1140 "Wrong assembly path returned\n");
1141 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1142 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1144 /* pwzCachePath is full filename */
1146 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, 0, winedll
, &info
);
1147 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1148 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1149 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1150 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1151 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1152 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1153 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1154 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1155 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1156 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1157 "Assembly path was changed\n");
1158 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1160 /* NULL pAsmInfo, QUERYASMINFO_FLAG_VALIDATE */
1161 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1163 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1165 /* NULL pAsmInfo, QUERYASMINFO_FLAG_GETSIZE */
1166 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1168 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1170 /* info.cbAssemblyInfo is 0 */
1172 info
.cbAssemblyInfo
= 0;
1173 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1175 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1176 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1177 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1178 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1179 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1180 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1181 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1182 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1183 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1184 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1185 "Wrong assembly path returned\n");
1186 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1187 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1189 /* info.cbAssemblyInfo is 1 */
1191 info
.cbAssemblyInfo
= 1;
1192 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1194 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
1195 ok(info
.cbAssemblyInfo
== 1, "Expected 1, got %d\n", info
.cbAssemblyInfo
);
1196 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1197 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1198 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1199 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1200 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1201 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1202 "Assembly path was changed\n");
1203 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1205 /* info.cbAssemblyInfo is > sizeof(ASSEMBLY_INFO) */
1207 info
.cbAssemblyInfo
= sizeof(ASSEMBLY_INFO
) * 2;
1208 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1210 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
1211 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
) * 2,
1212 "Expected sizeof(ASSEMBLY_INFO) * 2, got %d\n", info
.cbAssemblyInfo
);
1213 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1214 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1215 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1216 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1217 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1218 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1219 "Assembly path was changed\n");
1220 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1222 /* QUERYASMINFO_FLAG_GETSIZE */
1224 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1226 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1227 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1228 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1229 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1230 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1231 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1232 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1235 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4),
1236 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1238 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1239 "Wrong assembly path returned\n");
1240 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1241 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1243 /* QUERYASMINFO_FLAG_GETSIZE and QUERYASMINFO_FLAG_VALIDATE */
1245 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
|
1246 QUERYASMINFO_FLAG_VALIDATE
,wine
, &info
);
1247 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1248 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1249 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1250 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1251 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1252 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1253 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1256 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4),
1257 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1259 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1260 "Wrong assembly path returned\n");
1261 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1262 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1264 /* info.pszCurrentAssemblyPathBuf is NULL */
1266 info
.pszCurrentAssemblyPathBuf
= NULL
;
1267 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1269 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1270 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1271 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1272 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1273 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1274 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1275 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "Expected E_NOT_SUFFICIENT_BUFFER, got %08x\n", hr
);
1278 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4),
1279 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1281 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1282 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1284 /* info.cchBuf is exactly size of asmpath */
1286 info
.cchBuf
= lstrlenW(asmpath
);
1287 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1289 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1290 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1291 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1292 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1293 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1294 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1295 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1296 "Assembly path was changed\n");
1297 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "Expected E_NOT_SUFFICIENT_BUFFER, got %08x\n", hr
);
1300 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4),
1301 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1303 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1304 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1306 /* info.cchBuf has room for NULL-terminator */
1308 info
.cchBuf
= lstrlenW(asmpath
) + 1;
1309 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1311 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1312 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1313 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1314 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1315 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1316 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1317 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1318 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1319 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1322 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4),
1323 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1325 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1326 "Wrong assembly path returned\n");
1328 /* display name is "wine, Version=1.0.0.0" */
1330 lstrcpyW(name
, wine
);
1331 lstrcatW(name
, commasep
);
1332 lstrcatW(name
, ver
);
1333 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1335 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1336 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1337 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1338 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1339 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1340 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1341 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1344 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4),
1345 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1347 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1348 "Wrong assembly path returned\n");
1349 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1350 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1352 /* short buffer, QUERYASMINFO_FLAG_VALIDATE */
1353 memset(&info
, 0, sizeof(info
));
1354 lstrcpyW(name
, wine
);
1355 lstrcatW(name
, commasep
);
1356 lstrcatW(name
, otherver
);
1357 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1359 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
1360 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
, "got %08x\n", info
.dwAssemblyFlags
);
1362 /* short buffer, QUERYASMINFO_FLAG_GETSIZE */
1363 memset(&info
, 0, sizeof(info
));
1364 lstrcpyW(name
, wine
);
1365 lstrcatW(name
, commasep
);
1366 lstrcatW(name
, otherver
);
1367 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1369 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "got %08x\n", hr
);
1370 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
, "got %08x\n", info
.dwAssemblyFlags
);
1372 /* display name is "wine, Version=1.0.0.00000" */
1374 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1376 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1377 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1378 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1379 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1380 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1381 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1382 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1385 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4),
1386 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1388 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1389 "Wrong assembly path returned\n");
1390 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1391 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1393 /* display name is "wine, Version=1.0.0.1", versions don't match */
1395 lstrcpyW(name
, wine
);
1396 lstrcatW(name
, commasep
);
1397 lstrcatW(name
, badver
);
1398 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1400 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1401 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1402 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1403 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1404 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1405 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1406 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1407 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1408 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1409 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1410 "Assembly path was changed\n");
1411 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1413 /* display name is "wine,version=1.0.0.1,publicKeyToken=2d03617b1c31e2f5,culture=neutral" */
1415 lstrcpyW(name
, wine2
);
1416 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1418 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1419 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1420 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1421 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1422 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1423 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1424 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1425 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1426 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1427 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1428 "Assembly path was changed\n");
1429 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1431 /* display name is "mscorlib.dll,version=0.0.0.0,culture=neutral,publicKeyToken=null" */
1433 lstrcpyW(name
, nullpublickey
);
1434 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, 0, name
, &info
);
1435 ok(hr
== FUSION_E_PRIVATE_ASM_DISALLOWED
, "got %08x\n", hr
);
1437 /* display name is "mscorlib.dll,publicKeyToken=nuLl" */
1439 lstrcpyW(name
, nullpublickey1
);
1440 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, 0, name
, &info
);
1441 ok(hr
== FUSION_E_PRIVATE_ASM_DISALLOWED
, "got %08x\n", hr
);
1443 /* display name is "wine, Culture=neutral" */
1445 lstrcpyW(name
, wine
);
1446 lstrcatW(name
, commasep
);
1447 lstrcatW(name
, culture
);
1448 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1450 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1451 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1452 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1453 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1454 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1455 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1456 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1459 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4),
1460 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1462 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1463 "Wrong assembly path returned\n");
1464 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1465 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1467 /* display name is "wine, Culture=en", cultures don't match */
1469 lstrcpyW(name
, wine
);
1470 lstrcatW(name
, commasep
);
1471 lstrcatW(name
, badculture
);
1472 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1474 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1475 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1476 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1477 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1478 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1479 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1480 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1481 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1482 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1483 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1484 "Assembly path was changed\n");
1485 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1487 /* display name is "wine, PublicKeyTokens=2d03617b1c31e2f5" */
1489 lstrcpyW(name
, wine
);
1490 lstrcatW(name
, commasep
);
1491 lstrcatW(name
, pubkey
);
1492 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1494 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1495 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1496 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1497 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1498 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1499 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1500 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1503 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4),
1504 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1506 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1507 "Wrong assembly path returned\n");
1508 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1509 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1511 /* display name is "wine, PublicKeyToken=aaaaaaaaaaaaaaaa", pubkeys don't match */
1513 lstrcpyW(name
, wine
);
1514 lstrcatW(name
, commasep
);
1515 lstrcatW(name
, badpubkey
);
1516 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1518 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1519 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1520 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1521 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1522 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1523 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1524 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1525 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1526 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1527 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1528 "Assembly path was changed\n");
1529 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1531 /* display name is "wine, BadProp=buh", bad property */
1533 lstrcpyW(name
, wine
);
1534 lstrcatW(name
, commasep
);
1535 lstrcatW(name
, badprop
);
1536 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1538 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1539 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1540 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1541 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1542 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1543 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1544 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1547 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4),
1548 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1550 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1551 "Wrong assembly path returned\n");
1552 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1553 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1555 /* no flags, display name is "wine, Version=1.0.0.0" */
1557 info
.pszCurrentAssemblyPathBuf
= NULL
;
1559 lstrcpyW(name
, wine
);
1560 lstrcatW(name
, commasep
);
1561 lstrcatW(name
, ver
);
1562 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, 0, name
, &info
);
1563 ok(hr
== E_NOT_SUFFICIENT_BUFFER
, "Expected E_NOT_SUFFICIENT_BUFFER, got %08x\n", hr
);
1564 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1565 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1566 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1567 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1569 /* uninstall the assembly from the GAC */
1571 hr
= IAssemblyCache_UninstallAssembly(cache
, 0, wine
, NULL
, &disp
);
1572 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1573 ok(disp
== IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED
,
1574 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp
);
1576 DeleteFileA("test.dll");
1577 DeleteFileA("wine.dll");
1578 IAssemblyCache_Release(cache
);
1581 START_TEST(asmcache
)
1583 if (!init_functionpointers())
1586 if (!check_dotnet20())
1589 test_CreateAssemblyCache();
1590 test_CreateAssemblyCacheItem();
1591 test_InstallAssembly();
1592 test_QueryAssemblyInfo();