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 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
;
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_InstallAssembly(void)
886 IAssemblyCache
*cache
;
890 char dllpath
[MAX_PATH
];
893 static const WCHAR empty
[] = {0};
894 static const WCHAR noext
[] = {'f','i','l','e',0};
895 static const WCHAR badext
[] = {'f','i','l','e','.','b','a','d',0};
896 static const WCHAR dllext
[] = {'f','i','l','e','.','d','l','l',0};
897 static const WCHAR exeext
[] = {'f','i','l','e','.','e','x','e',0};
898 static const WCHAR testdll
[] = {'t','e','s','t','.','d','l','l',0};
899 static const WCHAR winedll
[] = {'w','i','n','e','.','d','l','l',0};
900 static const WCHAR wine
[] = {'w','i','n','e',0};
902 create_file("test.dll", 100);
903 create_assembly("wine.dll");
905 hr
= pCreateAssemblyCache(&cache
, 0);
906 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
908 /* NULL pszManifestFilePath */
909 hr
= IAssemblyCache_InstallAssembly(cache
, 0, NULL
, NULL
);
910 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
912 /* empty pszManifestFilePath */
913 hr
= IAssemblyCache_InstallAssembly(cache
, 0, empty
, NULL
);
914 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
916 /* pszManifestFilePath has no extension */
917 hr
= IAssemblyCache_InstallAssembly(cache
, 0, noext
, NULL
);
918 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
),
919 "Expected HRESULT_FROM_WIN32(ERROR_INVALID_NAME), got %08x\n", hr
);
921 /* pszManifestFilePath has bad extension */
922 hr
= IAssemblyCache_InstallAssembly(cache
, 0, badext
, NULL
);
923 ok(hr
== HRESULT_FROM_WIN32(ERROR_INVALID_NAME
),
924 "Expected HRESULT_FROM_WIN32(ERROR_INVALID_NAME), got %08x\n", hr
);
926 /* pszManifestFilePath has dll extension */
927 hr
= IAssemblyCache_InstallAssembly(cache
, 0, dllext
, NULL
);
928 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
929 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
931 /* pszManifestFilePath has exe extension */
932 hr
= IAssemblyCache_InstallAssembly(cache
, 0, exeext
, NULL
);
933 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
934 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
937 hr
= IAssemblyCache_InstallAssembly(cache
, 0, testdll
, NULL
);
938 ok(hr
== COR_E_ASSEMBLYEXPECTED
,
939 "Expected COR_E_ASSEMBLYEXPECTED, got %08x\n", hr
);
942 hr
= IAssemblyCache_InstallAssembly(cache
, 0, winedll
, NULL
);
943 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
945 size
= GetWindowsDirectoryA(dllpath
, MAX_PATH
);
946 strcat(dllpath
, "\\assembly\\GAC_MSIL\\wine\\\\1.0.0.0__2d03617b1c31e2f5\\wine.dll");
948 attr
= GetFileAttributes(dllpath
);
949 ok(attr
!= INVALID_FILE_ATTRIBUTES
, "Expected assembly to exist\n");
951 /* uninstall the assembly from the GAC */
953 hr
= IAssemblyCache_UninstallAssembly(cache
, 0, wine
, NULL
, &disp
);
956 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
957 ok(disp
== IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED
,
958 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp
);
961 /* FIXME: remove once UninstallAssembly is implemented */
962 DeleteFileA(dllpath
);
963 dllpath
[size
+ sizeof("\\assembly\\GAC_MSIL\\wine\\1.0.0.0__2d03617b1c31e2f5")] = '\0';
964 RemoveDirectoryA(dllpath
);
965 dllpath
[size
+ sizeof("\\assembly\\GAC_MSIL\\wine")] = '\0';
966 RemoveDirectoryA(dllpath
);
968 DeleteFileA("test.dll");
969 DeleteFileA("wine.dll");
970 IAssemblyCache_Release(cache
);
973 #define INIT_ASM_INFO() \
974 ZeroMemory(&info, sizeof(ASSEMBLY_INFO)); \
975 info.cbAssemblyInfo = sizeof(ASSEMBLY_INFO); \
976 info.pszCurrentAssemblyPathBuf = path; \
977 info.cchBuf = MAX_PATH; \
980 static void test_QueryAssemblyInfo(void)
982 IAssemblyCache
*cache
;
984 WCHAR path
[MAX_PATH
];
985 WCHAR asmpath
[MAX_PATH
];
986 WCHAR name
[MAX_PATH
];
990 char dllpath
[MAX_PATH
];
993 static const WCHAR empty
[] = {0};
994 static const WCHAR commasep
[] = {',',' ',0};
995 static const WCHAR winedll
[] = {'w','i','n','e','.','d','l','l',0};
996 static const WCHAR wine
[] = {'w','i','n','e',0};
997 static const WCHAR ver
[] = {
998 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0};
999 static const WCHAR otherver
[] = {
1000 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','0','0','0','0','0',0};
1001 static const WCHAR badver
[] = {
1002 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','1',0};
1003 static const WCHAR culture
[] = {
1004 'C','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
1005 static const WCHAR badculture
[] = {
1006 'C','u','l','t','u','r','e','=','e','n',0};
1007 static const WCHAR pubkey
[] = {
1008 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
1009 '2','d','0','3','6','1','7','b','1','c','3','1','e','2','f','5',0};
1010 static const WCHAR badpubkey
[] = {
1011 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
1012 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',0};
1013 static const WCHAR badprop
[] = {'B','a','d','P','r','o','p','=','b','u','h',0};
1014 static const WCHAR msil
[] = {
1015 '_','M','S','I','L','\\','w','i','n','e','\\',
1016 '1','.','0','.','0','.','0','_','_','2','d','0','3','6','1','7','b',
1017 '1','c','3','1','e','2','f','5','\\',0};
1020 hr
= pGetCachePath(ASM_CACHE_GAC
, asmpath
, &size
);
1021 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1023 lstrcatW(asmpath
, msil
);
1024 lstrcatW(asmpath
, winedll
);
1026 create_assembly("wine.dll");
1028 hr
= pCreateAssemblyCache(&cache
, 0);
1029 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1031 /* assembly not installed yet */
1033 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, 0, wine
, &info
);
1034 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1035 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1036 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1037 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1038 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1039 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1040 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1041 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1042 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1043 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1044 "Assembly path was changed\n");
1045 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1047 hr
= IAssemblyCache_InstallAssembly(cache
, 0, winedll
, NULL
);
1048 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1050 /* NULL pszAssemblyName */
1052 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1054 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
1055 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1056 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1057 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1058 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1059 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1060 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1061 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1062 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1063 "Assembly path was changed\n");
1064 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1066 /* empty pszAssemblyName */
1068 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1070 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
1071 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1072 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1073 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1074 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1075 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1076 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1077 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1078 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1079 "Assembly path was changed\n");
1080 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1084 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, 0, wine
, &info
);
1085 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1086 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1087 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1088 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1089 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1090 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1091 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1092 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1093 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
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
);
1099 /* pwzCachePath is full filename */
1101 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, 0, winedll
, &info
);
1102 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1103 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1104 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1105 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1106 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1107 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1108 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1109 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1110 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1111 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1112 "Assembly path was changed\n");
1113 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1115 /* NULL pAsmInfo, QUERYASMINFO_FLAG_VALIDATE */
1116 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1118 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1120 /* NULL pAsmInfo, QUERYASMINFO_FLAG_GETSIZE */
1121 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1123 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1125 /* info.cbAssemblyInfo is 0 */
1127 info
.cbAssemblyInfo
= 0;
1128 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
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 /* info.cbAssemblyInfo is 1 */
1146 info
.cbAssemblyInfo
= 1;
1147 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_VALIDATE
,
1149 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
1150 ok(info
.cbAssemblyInfo
== 1, "Expected 1, 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 /* info.cbAssemblyInfo is > sizeof(ASSEMBLY_INFO) */
1162 info
.cbAssemblyInfo
= sizeof(ASSEMBLY_INFO
) * 2;
1163 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1165 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
1166 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
) * 2,
1167 "Expected sizeof(ASSEMBLY_INFO) * 2, got %d\n", info
.cbAssemblyInfo
);
1168 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1169 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1170 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1171 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1172 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1173 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1174 "Assembly path was changed\n");
1175 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1177 /* QUERYASMINFO_FLAG_GETSIZE */
1179 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1181 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1182 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1183 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1184 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1185 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1186 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1187 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1191 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4) ||
1192 broken(info
.uliAssemblySizeInKB
.u
.LowPart
== 32),
1193 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1195 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1196 "Wrong assembly path returned\n");
1197 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1198 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1200 /* QUERYASMINFO_FLAG_GETSIZE and QUERYASMINFO_FLAG_VALIDATE */
1202 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
|
1203 QUERYASMINFO_FLAG_VALIDATE
,wine
, &info
);
1204 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1205 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1206 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1207 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1208 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1209 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1210 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1214 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4) ||
1215 broken(info
.uliAssemblySizeInKB
.u
.LowPart
== 32),
1216 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1218 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1219 "Wrong assembly path returned\n");
1220 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1221 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1223 /* info.pszCurrentAssemblyPathBuf is NULL */
1225 info
.pszCurrentAssemblyPathBuf
= NULL
;
1226 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1228 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1229 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1230 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1231 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1232 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1233 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1234 ok(hr
== HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER
),
1235 "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got %08x\n", hr
);
1239 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4) ||
1240 broken(info
.uliAssemblySizeInKB
.u
.LowPart
== 32),
1241 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1243 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1244 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1246 /* info.cchBuf is exactly size of asmpath */
1248 info
.cchBuf
= lstrlenW(asmpath
);
1249 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1251 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1252 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1253 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1254 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1255 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1256 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1257 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1258 "Assembly path was changed\n");
1259 ok(hr
== HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER
),
1260 "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got %08x\n", hr
);
1264 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4) ||
1265 broken(info
.uliAssemblySizeInKB
.u
.LowPart
== 32),
1266 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1268 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1269 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1271 /* info.cchBuf has room for NULL-terminator */
1273 info
.cchBuf
= lstrlenW(asmpath
) + 1;
1274 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1276 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1277 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1278 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1279 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1280 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1281 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1282 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1283 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1284 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1288 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4) ||
1289 broken(info
.uliAssemblySizeInKB
.u
.LowPart
== 32),
1290 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1292 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1293 "Wrong assembly path returned\n");
1295 /* display name is "wine, Version=1.0.0.0" */
1297 lstrcpyW(name
, wine
);
1298 lstrcatW(name
, commasep
);
1299 lstrcatW(name
, ver
);
1300 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1302 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1303 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1304 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1305 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1306 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1307 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1308 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1312 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4) ||
1313 broken(info
.uliAssemblySizeInKB
.u
.LowPart
== 32),
1314 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1316 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1317 "Wrong assembly path returned\n");
1318 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1319 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1321 /* display name is "wine, Version=1.0.0.00000" */
1323 lstrcpyW(name
, wine
);
1324 lstrcatW(name
, commasep
);
1325 lstrcatW(name
, otherver
);
1326 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1328 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1329 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1330 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1331 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1332 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1333 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1334 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1338 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4) ||
1339 broken(info
.uliAssemblySizeInKB
.u
.LowPart
== 32),
1340 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1342 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1343 "Wrong assembly path returned\n");
1344 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1345 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1347 /* display name is "wine, Version=1.0.0.1", versions don't match */
1349 lstrcpyW(name
, wine
);
1350 lstrcatW(name
, commasep
);
1351 lstrcatW(name
, badver
);
1352 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1354 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1355 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1356 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1357 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1358 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1359 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1360 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1361 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1362 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1363 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1364 "Assembly path was changed\n");
1365 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1367 /* display name is "wine, Culture=neutral" */
1369 lstrcpyW(name
, wine
);
1370 lstrcatW(name
, commasep
);
1371 lstrcatW(name
, culture
);
1372 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1374 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1375 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1376 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1377 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1378 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1379 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1380 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1384 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4) ||
1385 broken(info
.uliAssemblySizeInKB
.u
.LowPart
== 32),
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, Culture=en", cultures don't match */
1395 lstrcpyW(name
, wine
);
1396 lstrcatW(name
, commasep
);
1397 lstrcatW(name
, badculture
);
1398 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1402 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1403 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1404 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1406 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1407 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1408 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1409 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1410 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1411 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1414 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1415 "Assembly path was changed\n");
1416 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1419 /* display name is "wine, PublicKeyTokens=2d03617b1c31e2f5" */
1421 lstrcpyW(name
, wine
);
1422 lstrcatW(name
, commasep
);
1423 lstrcatW(name
, pubkey
);
1424 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1426 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1427 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1428 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1429 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1430 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1431 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1432 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1436 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4) ||
1437 broken(info
.uliAssemblySizeInKB
.u
.LowPart
== 32),
1438 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1440 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1441 "Wrong assembly path returned\n");
1442 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1443 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1445 /* display name is "wine, PublicKeyToken=aaaaaaaaaaaaaaaa", pubkeys don't match */
1447 lstrcpyW(name
, wine
);
1448 lstrcatW(name
, commasep
);
1449 lstrcatW(name
, badpubkey
);
1450 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1452 ok(hr
== HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
),
1453 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr
);
1454 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1455 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1456 ok(info
.dwAssemblyFlags
== 0, "Expected 0, got %08x\n", info
.dwAssemblyFlags
);
1457 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1458 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1459 ok(info
.uliAssemblySizeInKB
.u
.LowPart
== 0,
1460 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1461 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, empty
),
1462 "Assembly path was changed\n");
1463 ok(info
.cchBuf
== MAX_PATH
, "Expected MAX_PATH, got %d\n", info
.cchBuf
);
1465 /* display name is "wine, BadProp=buh", bad property */
1467 lstrcpyW(name
, wine
);
1468 lstrcatW(name
, commasep
);
1469 lstrcatW(name
, badprop
);
1470 hr
= IAssemblyCache_QueryAssemblyInfo(cache
, QUERYASMINFO_FLAG_GETSIZE
,
1472 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1473 ok(info
.cbAssemblyInfo
== sizeof(ASSEMBLY_INFO
),
1474 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info
.cbAssemblyInfo
);
1475 ok(info
.dwAssemblyFlags
== ASSEMBLYINFO_FLAG_INSTALLED
,
1476 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info
.dwAssemblyFlags
);
1477 ok(info
.uliAssemblySizeInKB
.u
.HighPart
== 0,
1478 "Expected 0, got %d\n", info
.uliAssemblySizeInKB
.u
.HighPart
);
1482 ok((info
.uliAssemblySizeInKB
.u
.LowPart
== 4) ||
1483 broken(info
.uliAssemblySizeInKB
.u
.LowPart
== 32),
1484 "Expected 4, got %d\n", info
.uliAssemblySizeInKB
.u
.LowPart
);
1486 ok(!lstrcmpW(info
.pszCurrentAssemblyPathBuf
, asmpath
),
1487 "Wrong assembly path returned\n");
1488 ok(info
.cchBuf
== lstrlenW(asmpath
) + 1,
1489 "Expected %d, got %d\n", lstrlenW(asmpath
) + 1, info
.cchBuf
);
1491 /* uninstall the assembly from the GAC */
1493 hr
= IAssemblyCache_UninstallAssembly(cache
, 0, wine
, NULL
, &disp
);
1496 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1497 ok(disp
== IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED
,
1498 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp
);
1501 /* FIXME: remove once UninstallAssembly is implemented */
1502 len
= GetWindowsDirectoryA(dllpath
, MAX_PATH
);
1503 strcat(dllpath
, "\\assembly\\GAC_MSIL\\wine\\\\1.0.0.0__2d03617b1c31e2f5\\wine.dll");
1504 DeleteFileA(dllpath
);
1505 dllpath
[len
+ sizeof("\\assembly\\GAC_MSIL\\wine\\1.0.0.0__2d03617b1c31e2f5")] = '\0';
1506 RemoveDirectoryA(dllpath
);
1507 dllpath
[len
+ sizeof("\\assembly\\GAC_MSIL\\wine")] = '\0';
1508 RemoveDirectoryA(dllpath
);
1510 DeleteFileA("test.dll");
1511 DeleteFileA("wine.dll");
1512 IAssemblyCache_Release(cache
);
1515 START_TEST(asmcache
)
1517 if (!init_functionpointers())
1520 if (!check_dotnet20())
1523 test_CreateAssemblyCache();
1524 test_InstallAssembly();
1525 test_QueryAssemblyInfo();