include: Make IMAGE_COR20_HEADER declaration compatible with PSDK headers.
[wine.git] / dlls / fusion / tests / asmcache.c
blobe97cfbe023cbc9b2c50ee2047011f9f76715c44f
1 /*
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
19 #define COBJMACROS
20 #define INITGUID
22 #include <stdio.h>
24 #include <windows.h>
25 #include <mscoree.h>
26 #include <fusion.h>
27 #include <corerror.h>
29 #include "wine/test.h"
31 typedef struct _tagASSEMBLY ASSEMBLY;
33 typedef struct
35 ULONG Signature;
36 USHORT MajorVersion;
37 USHORT MinorVersion;
38 ULONG Reserved;
39 ULONG VersionLength;
40 BYTE Version[12];
41 BYTE Flags;
42 WORD Streams;
43 } METADATAHDR;
45 #include <pshpack1.h>
47 typedef struct
49 DWORD Offset;
50 DWORD Size;
51 } METADATASTREAMHDR;
53 typedef struct
55 DWORD Reserved1;
56 BYTE MajorVersion;
57 BYTE MinorVersion;
58 BYTE HeapOffsetSizes;
59 BYTE Reserved2;
60 LARGE_INTEGER MaskValid;
61 LARGE_INTEGER MaskSorted;
62 } METADATATABLESHDR;
64 typedef struct
66 WORD Generation;
67 WORD Name;
68 WORD Mvid;
69 WORD EncId;
70 WORD EncBaseId;
71 } MODULETABLE;
73 typedef struct
75 DWORD Flags;
76 WORD Name;
77 WORD Namespace;
78 WORD Extends;
79 WORD FieldList;
80 WORD MethodList;
81 } TYPEDEFTABLE;
83 typedef struct
85 DWORD HashAlgId;
86 WORD MajorVersion;
87 WORD MinorVersion;
88 WORD BuildNumber;
89 WORD RevisionNumber;
90 DWORD Flags;
91 WORD PublicKey;
92 WORD Name;
93 WORD Culture;
94 } ASSEMBLYTABLE;
96 typedef struct
98 DWORD Offset;
99 DWORD Flags;
100 WORD Name;
101 WORD Implementation;
102 } MANIFESTRESTABLE;
104 typedef struct
106 DWORD ImportLookupTable;
107 DWORD DateTimeStamp;
108 DWORD ForwarderChain;
109 DWORD Name;
110 DWORD ImportAddressTable;
111 BYTE pad[20];
112 } IMPORTTABLE;
114 typedef struct
116 DWORD HintNameTableRVA;
117 BYTE pad[8];
118 } IMPORTLOOKUPTABLE;
120 typedef struct
122 WORD Hint;
123 BYTE Name[12];
124 BYTE Module[12];
125 DWORD Reserved;
126 WORD EntryPoint;
127 DWORD RVA;
128 } HINTNAMETABLE;
130 typedef struct
132 DWORD PageRVA;
133 DWORD Size;
134 DWORD Relocation;
135 } RELOCATION;
137 typedef struct
139 WORD wLength;
140 WORD wValueLength;
141 WORD wType;
142 WCHAR szKey[17];
143 VS_FIXEDFILEINFO Value;
144 } VS_VERSIONINFO;
146 typedef struct
148 WORD wLength;
149 WORD wValueLength;
150 WORD wType;
151 WCHAR szKey[13];
152 } VARFILEINFO;
154 typedef struct
156 WORD wLength;
157 WORD wValueLength;
158 WORD wType;
159 WCHAR szKey[13];
160 DWORD Value;
161 } VAR;
163 typedef struct
165 WORD wLength;
166 WORD wValueLength;
167 WORD wType;
168 WCHAR szKey[15];
169 } STRINGFILEINFO;
171 typedef struct
173 WORD wLength;
174 WORD wValueLength;
175 WORD wType;
176 WCHAR szKey[9];
177 } STRINGTABLE;
179 typedef struct
181 WORD wLength;
182 WORD wValueLength;
183 WORD wType;
184 } STRINGHDR;
186 typedef struct
188 DWORD Size;
189 DWORD Signature;
190 DWORD HeaderVersion;
191 DWORD SkipBytes;
192 BYTE Data[168];
193 } RESOURCE;
195 #include <poppack.h>
197 static struct _tagASSEMBLY
199 IMAGE_DOS_HEADER doshdr;
200 WORD unknown[32];
201 IMAGE_NT_HEADERS32 nthdrs;
202 IMAGE_SECTION_HEADER text;
203 IMAGE_SECTION_HEADER rsrc;
204 IMAGE_SECTION_HEADER reloc;
205 BYTE pad[16];
206 IMAGE_IMPORT_BY_NAME iat;
207 BYTE pad2[3];
208 IMAGE_COR20_HEADER clrhdr;
209 WORD strongname[64];
210 RESOURCE resource;
211 METADATAHDR metadatahdr;
212 METADATASTREAMHDR roothdr;
213 BYTE rootname[4];
214 METADATASTREAMHDR stringshdr;
215 BYTE stringsname[12];
216 METADATASTREAMHDR ushdr;
217 BYTE usname[4];
218 METADATASTREAMHDR guidhdr;
219 BYTE guidname[8];
220 METADATASTREAMHDR blobhdr;
221 BYTE blobname[8];
222 METADATATABLESHDR tableshdr;
223 DWORD numrows[4];
224 MODULETABLE modtable;
225 TYPEDEFTABLE tdtable;
226 ASSEMBLYTABLE asmtable;
227 MANIFESTRESTABLE manifestrestable;
228 WORD pad3;
229 BYTE stringheap[40];
230 WORD usheap[4];
231 WORD guidheap[8];
232 WORD blobheap[82];
233 IMAGE_IMPORT_DESCRIPTOR importdesc;
234 BYTE pad4[20];
235 IMPORTLOOKUPTABLE importlookup;
236 HINTNAMETABLE hintnametable;
237 BYTE pad5[108];
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;
247 VAR translation;
248 STRINGFILEINFO strfileinfo;
249 STRINGTABLE strtable;
250 STRINGHDR filedeschdr;
251 WCHAR filedesckey[17];
252 WCHAR filedescval[2];
253 STRINGHDR fileverhdr;
254 WCHAR fileverkey[13];
255 WCHAR fileverval[8];
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];
267 WCHAR prodverval[8];
268 STRINGHDR asmverhdr;
269 WCHAR asmverkey[17];
270 WCHAR asmverval[8];
271 WORD pad6[182];
272 RELOCATION relocation;
273 WORD pad7[250];
274 } assembly =
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 */
335 0, /* LoaderFlags */
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 */
345 { 0 }, /* Debug */
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 */
354 { 0 } /* Reserved */
358 /* IMAGE_SECTION_HEADER */
360 ".text", /* Name */
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 */
374 ".rsrc", /* Name */
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 */
387 ".reloc", /* Name */
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 */
399 /* fill */
400 { 0 },
401 /* IMAGE_IMPORT_BY_NAME */
403 0x2370, /* Hint */
404 { 0 } /* Name */
406 /* fill */
407 { 0 },
408 /* IMAGE_COR20_HEADER */
410 0x48, /* Cb */
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
432 /* RESOURCE */
434 0xB4, /* Size */
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
449 /* METADATAHDR */
451 0x424A5342, /* Signature */
452 1, /* MajorVersion */
453 1, /* MinorVersion */
454 0, /* Reserved */
455 0xC, /* VersionLength */
456 "v2.0.50727", /* Version */
457 0, /* Flags */
458 5 /* Streams */
460 /* METADATASTREAMHDR */
462 0x6C, /* Offset */
463 0x64, /* Size */
465 "#~\0\0",
466 /* METADATASTREAMHDR */
468 0xD0, /* Offset */
469 0x28, /* Size */
471 "#Strings\0\0\0\0",
472 /* METADATASTREAMHDR */
474 0xF8, /* Offset */
475 0x8, /* Size */
477 "#US\0",
478 /* METADATASTREAMHDR */
480 0x100, /* Offset */
481 0x10, /* Size */
483 "#GUID\0\0\0",
484 /* METADATASTREAMHDR */
486 0x110, /* Offset */
487 0xA4, /* Size */
489 "#Blob\0\0\0",
490 /* METADATATABLESHDR */
492 0, /* Reserved1 */
493 2, /* MajorVersion */
494 0, /* MinorVersion */
495 0, /* HeapOffsetSizes */
496 1, /* Reserved2 */
497 { { 0 } }, /* MaskValid */
498 { { 0 } } /* MaskSorted */
500 /* numrows */
501 { 1, 1, 1, 1 },
502 /* MODULETABLE */
504 0, /* Generation */
505 0xA, /* Name */
506 1, /* Mvid */
507 0, /* EncId */
508 0 /* EncBaseId */
510 /* TYPEDEFTABLE */
512 0, /* Flags */
513 0x1, /* Name */
514 0, /* Namespace */
515 0, /* Extends */
516 1, /* FieldList */
517 1 /* MethodList */
519 /* ASSEMBLYTABLE */
521 0x8004, /* HashAlgId */
522 1, /* MajorVersion */
523 0, /* MinorVersion */
524 0, /* BuildNumber */
525 0, /* RevisionNumber */
526 1, /* Flags */
527 1, /* PublicKey */
528 0x13, /* Name */
529 0 /* Culture */
531 /* MANIFESTRESTABLE */
533 0, /* Offset */
534 0x2, /* Flags */
535 0x18, /* Name */
536 0 /* Implementation */
538 /* pad */
540 /* String heap */
541 "\0<Module>\0wine.dll\0wine\0wine.resources\0\0",
542 /* US heap */
543 { 0x0300, 0x0020 },
544 /* GUID heap */
545 { 0x86EF, 0x5B5A, 0x2C5E, 0x4F6D, 0xC2AB, 0x0A94, 0xD658, 0x31DA },
546 /* BLOB heap */
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,
557 0xC17C, 0x00C4
559 /* IMAGE_IMPORT_DESCRIPTOR */
561 { 0x2364 }, /* OriginalFirstThunk */
562 0, /* TimeDateStamp */
563 0, /* ForwarderChain */
564 0x237E, /* Name */
565 0x2000, /* FirstThunk */
567 /* pad */
568 { 0 },
569 /* IMPORTLOOKUPTABLE */
571 0x2370, /* HintNameTableRVA */
572 { 0 }, /* pad */
574 /* HINTNAMETABLE */
576 0, /* Hint */
577 "_CorDllMain", /* Name */
578 "mscoree.dll", /* Module */
579 0, /* Reserved */
580 0x25FF, /* EntryPoint */
581 0x402000 /* RVA */
583 /* pad to 0x600 */
584 { 0 },
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 */
621 0x23C, /* Size */
622 0, /* CodePage */
623 0, /* Reserved */
625 /* VS_VERSIONINFO */
627 0x23C, /* wLength */
628 0x34, /* wValueLength */
629 0, /* wType */
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 */
648 /* VARFILEINFO */
650 0x44, /* wLength */
651 0, /* wValueLength */
652 1, /* wType */
653 { 'V','a','r','F','i','l','e','I','n','f','o',0,0 } /* szKey */
655 /* VAR */
657 0x24, /* wLength */
658 0x4, /* wValueLength */
659 0, /* wType */
660 { 'T','r','a','n','s','l','a','t','i','o','n',0,0 }, /* szKey */
661 0x4B00000, /* Value */
663 /* STRINGFILEINFO */
665 0x19C, /* wLength */
666 0, /* wValueLength */
667 1, /* wType */
668 { 'S','t','r','i','n','g','F','i','l','e','I','n','f','o',0 }, /* szKey */
670 /* STRINGTABLE */
672 0x178, /* wLength */
673 0, /* wValueLength */
674 1, /* wType */
675 { '0','0','0','0','0','4','b','0',0 }, /* szKey */
677 /* STRINGHDR */
679 0x2C, /* wLength */
680 2, /* wValueLength */
681 1, /* wType */
683 { 'F','i','l','e','D','e','s','c','r','i','p','t','i','o','n',0,0 }, /* szKey */
684 { ' ',0 }, /* szValue */
685 /* STRINGHDR */
687 0x30, /* wLength */
688 8, /* wValueLength */
689 1, /* wType */
691 { 'F','i','l','e','V','e','r','s','i','o','n',0,0 }, /* szKey */
692 { '1','.','0','.','0','.','0',0 }, /* szValue */
693 /* STRINGHDR */
695 0x34, /* wLength */
696 9, /* wValueLength */
697 1, /* wType */
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 */
701 /* STRINGHDR */
703 0x28, /* wLength */
704 2, /* wValueLength */
705 1, /* wType */
707 { 'L','e','g','a','l','C','o','p','y','r','i','g','h','t',0 }, /* szKey */
708 { ' ',0 }, /* szValue */
709 /* STRINGHDR */
711 0x3C, /* wLength */
712 9, /* wValueLength */
713 1, /* wType */
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 */
717 /* STRINGHDR */
719 0x34, /* wLength */
720 8, /* wValueLength */
721 1, /* wType */
723 { 'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0 }, /* szKey */
724 { '1','.','0','.','0','.','0',0 }, /* szValue */
725 /* STRINGHDR */
727 0x38, /* wLength */
728 8, /* wValueLength */
729 1, /* wType */
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 */
733 { 0 }, /* pad */
734 /* RELOCATION */
736 0x2000, /* PageRVA */
737 0xC, /* Size */
738 0x3390, /* Relocation */
740 { 0 }
744 static HRESULT (WINAPI *pCreateAssemblyCache)(IAssemblyCache **ppAsmCache,
745 DWORD dwReserved);
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)
753 HRESULT hr;
754 HMODULE hfusion;
755 HMODULE hmscoree;
757 static const WCHAR szFusion[] = {'f','u','s','i','o','n','.','d','l','l',0};
759 hmscoree = LoadLibraryA("mscoree.dll");
760 if (!hmscoree)
762 win_skip("mscoree.dll not available\n");
763 return FALSE;
766 pLoadLibraryShim = (void *)GetProcAddress(hmscoree, "LoadLibraryShim");
767 if (!pLoadLibraryShim)
769 win_skip("LoadLibraryShim not available\n");
770 FreeLibrary(hmscoree);
771 return FALSE;
774 hr = pLoadLibraryShim(szFusion, NULL, NULL, &hfusion);
775 if (FAILED(hr))
777 win_skip("fusion.dll not available\n");
778 FreeLibrary(hmscoree);
779 return FALSE;
782 pCreateAssemblyCache = (void *)GetProcAddress(hfusion, "CreateAssemblyCache");
783 pGetCachePath = (void *)GetProcAddress(hfusion, "GetCachePath");
785 if (!pCreateAssemblyCache || !pGetCachePath)
787 win_skip("fusion.dll not implemented\n");
788 return FALSE;
791 FreeLibrary(hmscoree);
792 return TRUE;
795 static void create_file_data(LPCSTR name, LPCSTR data, DWORD size)
797 HANDLE file;
798 DWORD written;
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);
804 if (size)
806 SetFilePointer(file, size, NULL, FILE_BEGIN);
807 SetEndOfFile(file);
810 CloseHandle(file);
813 #define create_file(name, size) create_file_data(name, name, size)
815 static void create_assembly(LPCSTR file)
817 HANDLE hfile;
818 DWORD written;
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);
835 CloseHandle(hfile);
838 static BOOL check_dotnet20(void)
840 IAssemblyCache *cache;
841 HRESULT hr;
842 BOOL ret = FALSE;
843 ULONG disp;
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);
853 if (hr == S_OK)
854 ret = TRUE;
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");
859 else
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);
865 return ret;
868 static void test_CreateAssemblyCache(void)
870 IAssemblyCache *cache;
871 HRESULT hr;
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;
887 HRESULT hr;
888 ULONG disp;
889 DWORD attr;
890 char dllpath[MAX_PATH];
892 static const WCHAR empty[] = {0};
893 static const WCHAR noext[] = {'f','i','l','e',0};
894 static const WCHAR badext[] = {'f','i','l','e','.','b','a','d',0};
895 static const WCHAR dllext[] = {'f','i','l','e','.','d','l','l',0};
896 static const WCHAR exeext[] = {'f','i','l','e','.','e','x','e',0};
897 static const WCHAR testdll[] = {'t','e','s','t','.','d','l','l',0};
898 static const WCHAR winedll[] = {'w','i','n','e','.','d','l','l',0};
899 static const WCHAR wine[] = {'w','i','n','e',0};
901 create_file("test.dll", 100);
902 create_assembly("wine.dll");
904 hr = pCreateAssemblyCache(&cache, 0);
905 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
907 /* NULL pszManifestFilePath */
908 hr = IAssemblyCache_InstallAssembly(cache, 0, NULL, NULL);
909 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
911 /* empty pszManifestFilePath */
912 hr = IAssemblyCache_InstallAssembly(cache, 0, empty, NULL);
913 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
915 /* pszManifestFilePath has no extension */
916 hr = IAssemblyCache_InstallAssembly(cache, 0, noext, NULL);
917 ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_NAME),
918 "Expected HRESULT_FROM_WIN32(ERROR_INVALID_NAME), got %08x\n", hr);
920 /* pszManifestFilePath has bad extension */
921 hr = IAssemblyCache_InstallAssembly(cache, 0, badext, NULL);
922 ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_NAME),
923 "Expected HRESULT_FROM_WIN32(ERROR_INVALID_NAME), got %08x\n", hr);
925 /* pszManifestFilePath has dll extension */
926 hr = IAssemblyCache_InstallAssembly(cache, 0, dllext, NULL);
927 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
928 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
930 /* pszManifestFilePath has exe extension */
931 hr = IAssemblyCache_InstallAssembly(cache, 0, exeext, NULL);
932 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
933 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
935 /* empty file */
936 hr = IAssemblyCache_InstallAssembly(cache, 0, testdll, NULL);
937 ok(hr == COR_E_ASSEMBLYEXPECTED,
938 "Expected COR_E_ASSEMBLYEXPECTED, got %08x\n", hr);
940 /* wine assembly */
941 hr = IAssemblyCache_InstallAssembly(cache, 0, winedll, NULL);
942 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
944 GetWindowsDirectoryA(dllpath, MAX_PATH);
945 strcat(dllpath, "\\assembly\\GAC_MSIL\\wine\\\\1.0.0.0__2d03617b1c31e2f5\\wine.dll");
947 attr = GetFileAttributes(dllpath);
948 ok(attr != INVALID_FILE_ATTRIBUTES, "Expected assembly to exist\n");
950 /* uninstall the assembly from the GAC */
951 disp = 0xf00dbad;
952 hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp);
953 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
954 ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED,
955 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp);
957 attr = GetFileAttributes(dllpath);
958 ok(attr == INVALID_FILE_ATTRIBUTES, "Expected assembly not to exist\n");
960 disp = 0xf00dbad;
961 hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp);
962 ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr);
963 ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED,
964 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED, got %d\n", disp);
966 DeleteFileA("test.dll");
967 DeleteFileA("wine.dll");
968 IAssemblyCache_Release(cache);
971 #define INIT_ASM_INFO() \
972 ZeroMemory(&info, sizeof(ASSEMBLY_INFO)); \
973 info.cbAssemblyInfo = sizeof(ASSEMBLY_INFO); \
974 info.pszCurrentAssemblyPathBuf = path; \
975 info.cchBuf = MAX_PATH; \
976 path[0] = '\0';
978 static void test_QueryAssemblyInfo(void)
980 IAssemblyCache *cache;
981 ASSEMBLY_INFO info;
982 WCHAR path[MAX_PATH];
983 WCHAR asmpath[MAX_PATH];
984 WCHAR name[MAX_PATH];
985 HRESULT hr;
986 DWORD size;
987 ULONG disp;
989 static const WCHAR empty[] = {0};
990 static const WCHAR commasep[] = {',',' ',0};
991 static const WCHAR winedll[] = {'w','i','n','e','.','d','l','l',0};
992 static const WCHAR wine[] = {'w','i','n','e',0};
993 static const WCHAR ver[] = {
994 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0};
995 static const WCHAR otherver[] = {
996 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','0','0','0','0','0',0};
997 static const WCHAR badver[] = {
998 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','1',0};
999 static const WCHAR culture[] = {
1000 'C','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
1001 static const WCHAR badculture[] = {
1002 'C','u','l','t','u','r','e','=','e','n',0};
1003 static const WCHAR pubkey[] = {
1004 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
1005 '2','d','0','3','6','1','7','b','1','c','3','1','e','2','f','5',0};
1006 static const WCHAR badpubkey[] = {
1007 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
1008 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',0};
1009 static const WCHAR badprop[] = {'B','a','d','P','r','o','p','=','b','u','h',0};
1010 static const WCHAR msil[] = {
1011 '_','M','S','I','L','\\','w','i','n','e','\\',
1012 '1','.','0','.','0','.','0','_','_','2','d','0','3','6','1','7','b',
1013 '1','c','3','1','e','2','f','5','\\',0};
1014 static const WCHAR wine2[] = {
1015 'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','1',',',
1016 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
1017 '2','d','0','3','6','1','7','b','1','c','3','1','e','2','f','5',',',
1018 'c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
1020 size = MAX_PATH;
1021 hr = pGetCachePath(ASM_CACHE_GAC, asmpath, &size);
1022 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1024 lstrcatW(asmpath, msil);
1025 lstrcatW(asmpath, winedll);
1027 create_assembly("wine.dll");
1029 hr = pCreateAssemblyCache(&cache, 0);
1030 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1032 /* assembly not installed yet */
1033 INIT_ASM_INFO();
1034 hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, wine, &info);
1035 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
1036 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
1037 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1038 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1039 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1040 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1041 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1042 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1043 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1044 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1045 "Assembly path was changed\n");
1046 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1048 hr = IAssemblyCache_InstallAssembly(cache, 0, winedll, NULL);
1049 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1051 /* NULL pszAssemblyName */
1052 INIT_ASM_INFO();
1053 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE,
1054 NULL, &info);
1055 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
1056 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1057 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1058 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1059 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1060 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1061 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1062 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1063 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1064 "Assembly path was changed\n");
1065 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1067 /* empty pszAssemblyName */
1068 INIT_ASM_INFO();
1069 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE,
1070 empty, &info);
1071 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
1072 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1073 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1074 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1075 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1076 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1077 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1078 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1079 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1080 "Assembly path was changed\n");
1081 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1083 /* no dwFlags */
1084 INIT_ASM_INFO();
1085 hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, wine, &info);
1086 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1087 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1088 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1089 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1090 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1091 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1092 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1093 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1094 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1095 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1096 "Wrong assembly path returned\n");
1097 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1098 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1100 /* pwzCachePath is full filename */
1101 INIT_ASM_INFO();
1102 hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, winedll, &info);
1103 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
1104 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
1105 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1106 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1107 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1108 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1109 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1110 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1111 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1112 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1113 "Assembly path was changed\n");
1114 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1116 /* NULL pAsmInfo, QUERYASMINFO_FLAG_VALIDATE */
1117 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE,
1118 wine, NULL);
1119 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1121 /* NULL pAsmInfo, QUERYASMINFO_FLAG_GETSIZE */
1122 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1123 wine, NULL);
1124 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1126 /* info.cbAssemblyInfo is 0 */
1127 INIT_ASM_INFO();
1128 info.cbAssemblyInfo = 0;
1129 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE,
1130 wine, &info);
1131 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1132 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1133 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1134 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1135 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1136 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1137 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1138 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1139 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1140 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1141 "Wrong assembly path returned\n");
1142 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1143 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1145 /* info.cbAssemblyInfo is 1 */
1146 INIT_ASM_INFO();
1147 info.cbAssemblyInfo = 1;
1148 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE,
1149 wine, &info);
1150 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
1151 ok(info.cbAssemblyInfo == 1, "Expected 1, got %d\n", info.cbAssemblyInfo);
1152 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1153 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1154 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1155 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1156 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1157 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1158 "Assembly path was changed\n");
1159 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1161 /* info.cbAssemblyInfo is > sizeof(ASSEMBLY_INFO) */
1162 INIT_ASM_INFO();
1163 info.cbAssemblyInfo = sizeof(ASSEMBLY_INFO) * 2;
1164 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1165 wine, &info);
1166 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
1167 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO) * 2,
1168 "Expected sizeof(ASSEMBLY_INFO) * 2, got %d\n", info.cbAssemblyInfo);
1169 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1170 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1171 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1172 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1173 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1174 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1175 "Assembly path was changed\n");
1176 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1178 /* QUERYASMINFO_FLAG_GETSIZE */
1179 INIT_ASM_INFO();
1180 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1181 wine, &info);
1182 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1183 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1184 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1185 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1186 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1187 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1188 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1189 todo_wine
1191 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1192 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1194 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1195 "Wrong assembly path returned\n");
1196 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1197 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1199 /* QUERYASMINFO_FLAG_GETSIZE and QUERYASMINFO_FLAG_VALIDATE */
1200 INIT_ASM_INFO();
1201 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE |
1202 QUERYASMINFO_FLAG_VALIDATE,wine, &info);
1203 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1204 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1205 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1206 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1207 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1208 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1209 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1210 todo_wine
1212 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1213 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1215 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1216 "Wrong assembly path returned\n");
1217 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1218 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1220 /* info.pszCurrentAssemblyPathBuf is NULL */
1221 INIT_ASM_INFO();
1222 info.pszCurrentAssemblyPathBuf = NULL;
1223 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1224 wine, &info);
1225 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1226 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1227 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1228 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1229 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1230 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1231 ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
1232 "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got %08x\n", hr);
1233 todo_wine
1235 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1236 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1238 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1239 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1241 /* info.cchBuf is exactly size of asmpath */
1242 INIT_ASM_INFO();
1243 info.cchBuf = lstrlenW(asmpath);
1244 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1245 wine, &info);
1246 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1247 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1248 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1249 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1250 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1251 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1252 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1253 "Assembly path was changed\n");
1254 ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
1255 "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got %08x\n", hr);
1256 todo_wine
1258 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1259 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1261 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1262 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1264 /* info.cchBuf has room for NULL-terminator */
1265 INIT_ASM_INFO();
1266 info.cchBuf = lstrlenW(asmpath) + 1;
1267 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1268 wine, &info);
1269 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1270 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1271 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1272 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1273 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1274 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1275 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1276 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1277 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1278 todo_wine
1280 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1281 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1283 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1284 "Wrong assembly path returned\n");
1286 /* display name is "wine, Version=1.0.0.0" */
1287 INIT_ASM_INFO();
1288 lstrcpyW(name, wine);
1289 lstrcatW(name, commasep);
1290 lstrcatW(name, ver);
1291 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1292 name, &info);
1293 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1294 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1295 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1296 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1297 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1298 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1299 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1300 todo_wine
1302 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1303 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1305 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1306 "Wrong assembly path returned\n");
1307 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1308 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1310 /* short buffer, QUERYASMINFO_FLAG_VALIDATE */
1311 memset(&info, 0, sizeof(info));
1312 lstrcpyW(name, wine);
1313 lstrcatW(name, commasep);
1314 lstrcatW(name, otherver);
1315 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE,
1316 name, &info);
1317 ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "got %08x\n", hr);
1318 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, "got %08x\n", info.dwAssemblyFlags);
1320 /* short buffer, QUERYASMINFO_FLAG_GETSIZE */
1321 memset(&info, 0, sizeof(info));
1322 lstrcpyW(name, wine);
1323 lstrcatW(name, commasep);
1324 lstrcatW(name, otherver);
1325 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1326 name, &info);
1327 ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "got %08x\n", hr);
1328 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, "got %08x\n", info.dwAssemblyFlags);
1330 /* display name is "wine, Version=1.0.0.00000" */
1331 INIT_ASM_INFO();
1332 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1333 name, &info);
1334 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1335 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1336 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1337 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1338 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1339 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1340 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1341 todo_wine
1343 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1344 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1346 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1347 "Wrong assembly path returned\n");
1348 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1349 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1351 /* display name is "wine, Version=1.0.0.1", versions don't match */
1352 INIT_ASM_INFO();
1353 lstrcpyW(name, wine);
1354 lstrcatW(name, commasep);
1355 lstrcatW(name, badver);
1356 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1357 name, &info);
1358 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
1359 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
1360 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1361 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1362 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1363 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1364 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1365 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1366 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1367 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1368 "Assembly path was changed\n");
1369 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1371 /* display name is "wine,version=1.0.0.1,publicKeyToken=2d03617b1c31e2f5,culture=neutral" */
1372 INIT_ASM_INFO();
1373 lstrcpyW(name, wine2);
1374 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1375 name, &info);
1376 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
1377 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
1378 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1379 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1380 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1381 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1382 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1383 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1384 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1385 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1386 "Assembly path was changed\n");
1387 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1389 /* display name is "wine, Culture=neutral" */
1390 INIT_ASM_INFO();
1391 lstrcpyW(name, wine);
1392 lstrcatW(name, commasep);
1393 lstrcatW(name, culture);
1394 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1395 name, &info);
1396 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1397 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1398 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1399 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1400 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1401 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1402 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1403 todo_wine
1405 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1406 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1408 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1409 "Wrong assembly path returned\n");
1410 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1411 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1413 /* display name is "wine, Culture=en", cultures don't match */
1414 INIT_ASM_INFO();
1415 lstrcpyW(name, wine);
1416 lstrcatW(name, commasep);
1417 lstrcatW(name, badculture);
1418 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1419 name, &info);
1420 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
1421 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
1422 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1423 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1424 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1425 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1426 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1427 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1428 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1429 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1430 "Assembly path was changed\n");
1431 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1433 /* display name is "wine, PublicKeyTokens=2d03617b1c31e2f5" */
1434 INIT_ASM_INFO();
1435 lstrcpyW(name, wine);
1436 lstrcatW(name, commasep);
1437 lstrcatW(name, pubkey);
1438 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1439 name, &info);
1440 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1441 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1442 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1443 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1444 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1445 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1446 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1447 todo_wine
1449 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1450 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1452 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1453 "Wrong assembly path returned\n");
1454 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1455 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1457 /* display name is "wine, PublicKeyToken=aaaaaaaaaaaaaaaa", pubkeys don't match */
1458 INIT_ASM_INFO();
1459 lstrcpyW(name, wine);
1460 lstrcatW(name, commasep);
1461 lstrcatW(name, badpubkey);
1462 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1463 name, &info);
1464 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
1465 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
1466 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1467 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1468 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1469 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1470 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1471 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1472 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1473 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1474 "Assembly path was changed\n");
1475 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1477 /* display name is "wine, BadProp=buh", bad property */
1478 INIT_ASM_INFO();
1479 lstrcpyW(name, wine);
1480 lstrcatW(name, commasep);
1481 lstrcatW(name, badprop);
1482 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1483 name, &info);
1484 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1485 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1486 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1487 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1488 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1489 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1490 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1491 todo_wine
1493 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1494 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1496 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1497 "Wrong assembly path returned\n");
1498 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1499 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1501 /* no flags, display name is "wine, Version=1.0.0.0" */
1502 INIT_ASM_INFO();
1503 info.pszCurrentAssemblyPathBuf = NULL;
1504 info.cchBuf = 0;
1505 lstrcpyW(name, wine);
1506 lstrcatW(name, commasep);
1507 lstrcatW(name, ver);
1508 hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, name, &info);
1509 ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
1510 "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got %08x\n", hr);
1511 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1512 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1513 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1514 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1516 /* uninstall the assembly from the GAC */
1517 disp = 0xf00dbad;
1518 hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp);
1519 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1520 ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED,
1521 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp);
1523 DeleteFileA("test.dll");
1524 DeleteFileA("wine.dll");
1525 IAssemblyCache_Release(cache);
1528 START_TEST(asmcache)
1530 if (!init_functionpointers())
1531 return;
1533 if (!check_dotnet20())
1534 return;
1536 test_CreateAssemblyCache();
1537 test_InstallAssembly();
1538 test_QueryAssemblyInfo();