ReactOS 0.4.16-dev-401-g45b008d
asmcache.c
Go to the documentation of this file.
1/*
2 * Copyright 2008 James Hawkins
3 *
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.
8 *
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.
13 *
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
17 */
18
19#define COBJMACROS
20#define INITGUID
21
22#include <stdio.h>
23
24#include <windows.h>
25#include <mscoree.h>
26#include <fusion.h>
27#include <corerror.h>
28
29#include "wine/test.h"
30
31typedef struct _tagASSEMBLY ASSEMBLY;
32
33typedef struct
34{
39 ULONG VersionLength;
41 BYTE Flags;
42 WORD Streams;
44
45#include <pshpack1.h>
46
47typedef struct
48{
50 DWORD Size;
52
53typedef struct
54{
58 BYTE HeapOffsetSizes;
60 LARGE_INTEGER MaskValid;
61 LARGE_INTEGER MaskSorted;
63
64typedef struct
65{
66 WORD Generation;
67 WORD Name;
68 WORD Mvid;
69 WORD EncId;
70 WORD EncBaseId;
72
73typedef struct
74{
76 WORD Name;
77 WORD Namespace;
78 WORD Extends;
79 WORD FieldList;
80 WORD MethodList;
82
83typedef struct
84{
85 DWORD HashAlgId;
89 WORD RevisionNumber;
91 WORD PublicKey;
92 WORD Name;
93 WORD Culture;
95
96typedef struct
97{
100 WORD Name;
101 WORD Implementation;
103
104typedef struct
105{
106 DWORD ImportLookupTable;
107 DWORD DateTimeStamp;
108 DWORD ForwarderChain;
109 DWORD Name;
110 DWORD ImportAddressTable;
111 BYTE pad[20];
113
114typedef struct
115{
116 DWORD HintNameTableRVA;
117 BYTE pad[8];
119
120typedef struct
121{
122 WORD Hint;
123 BYTE Name[12];
124 BYTE Module[12];
126 WORD EntryPoint;
127 DWORD RVA;
129
130typedef struct
131{
132 DWORD PageRVA;
133 DWORD Size;
134 DWORD Relocation;
135} RELOCATION;
136
137typedef struct
138{
139 WORD wLength;
140 WORD wValueLength;
141 WORD wType;
142 WCHAR szKey[17];
145
146typedef struct
147{
148 WORD wLength;
149 WORD wValueLength;
150 WORD wType;
151 WCHAR szKey[13];
153
154typedef struct
155{
156 WORD wLength;
157 WORD wValueLength;
158 WORD wType;
159 WCHAR szKey[13];
160 DWORD Value;
161} VAR;
162
163typedef struct
164{
165 WORD wLength;
166 WORD wValueLength;
167 WORD wType;
168 WCHAR szKey[15];
170
171typedef struct
172{
173 WORD wLength;
174 WORD wValueLength;
175 WORD wType;
176 WCHAR szKey[9];
178
179typedef struct
180{
181 WORD wLength;
182 WORD wValueLength;
183 WORD wType;
184} STRINGHDR;
185
186typedef struct
187{
188 DWORD Size;
190 DWORD HeaderVersion;
192 BYTE Data[168];
193} RESOURCE;
194
195#include <poppack.h>
196
197static struct _tagASSEMBLY
198{
237 BYTE pad5[108];
271 WORD pad6[182];
273 WORD pad7[250];
274} assembly =
275{
276 /* IMAGE_DOS_HEADER */
277 {
278 IMAGE_DOS_SIGNATURE, 144, 3, 0, 4, 0, 0xFFFF, 0, 0xB8, 0, 0, 0, 0x40,
279 0, { 0 }, 0, 0, { 0 }, 0x80
280 },
281 /* binary to print "This program cannot be run in DOS mode." */
282 {
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
287 },
288 /* IMAGE_NT_HEADERS32 */
289 {
290 IMAGE_NT_SIGNATURE, /* Signature */
291 /* IMAGE_FILE_HEADER */
292 {
293 IMAGE_FILE_MACHINE_I386, /* Machine */
294 3, /* NumberOfSections */
295 0x47EFDF09, /* TimeDateStamp */
296 0, /* PointerToSymbolTable */
297 0, /* NumberOfSymbols */
298 0xE0, /* SizeOfOptionalHeader */
301 IMAGE_FILE_DLL, /* Characteristics */
302 },
303 /* IMAGE_OPTIONAL_HEADER32 */
304 {
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 */
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 */
338 {
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 */
355 }
356 }
357 },
358 /* IMAGE_SECTION_HEADER */
359 {
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 */
370 IMAGE_SCN_CNT_CODE, /* Characteristics */
371 },
372 /* IMAGE_SECTION_HEADER */
373 {
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 */
384 },
385 /* IMAGE_SECTION_HEADER */
386 {
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 */
397 IMAGE_SCN_MEM_DISCARDABLE, /* Characteristics */
398 },
399 /* fill */
400 { 0 },
401 /* IMAGE_IMPORT_BY_NAME */
402 {
403 0x2370, /* Hint */
404 { 0 } /* Name */
405 },
406 /* fill */
407 { 0 },
408 /* IMAGE_COR20_HEADER */
409 {
410 0x48, /* Cb */
411 2, /* MajorRuntimeVersion */
412 5, /* MinorRuntimeVersion */
413 { 0x2188, 0x1B4 }, /* MetaData */
415 { 0 }, /* EntryPointToken */
416 { 0x20D0, 0xB8 }, /* Resources */
417 { 0x2050, 0x80 }, /* StrongNameSignature */
418 { 0 }, /* CodeManagerTable */
419 { 0 }, /* VTableFixups */
420 { 0 }, /* ExportAddressTableJumps */
421 { 0 } /* ManagedNativeHeader */
422 },
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
431 },
432 /* RESOURCE */
433 {
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
447 }
448 },
449 /* METADATAHDR */
450 {
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 */
459 },
460 /* METADATASTREAMHDR */
461 {
462 0x6C, /* Offset */
463 0x64, /* Size */
464 },
465 "#~\0\0",
466 /* METADATASTREAMHDR */
467 {
468 0xD0, /* Offset */
469 0x28, /* Size */
470 },
471 "#Strings\0\0\0\0",
472 /* METADATASTREAMHDR */
473 {
474 0xF8, /* Offset */
475 0x8, /* Size */
476 },
477 "#US\0",
478 /* METADATASTREAMHDR */
479 {
480 0x100, /* Offset */
481 0x10, /* Size */
482 },
483 "#GUID\0\0\0",
484 /* METADATASTREAMHDR */
485 {
486 0x110, /* Offset */
487 0xA4, /* Size */
488 },
489 "#Blob\0\0\0",
490 /* METADATATABLESHDR */
491 {
492 0, /* Reserved1 */
493 2, /* MajorVersion */
494 0, /* MinorVersion */
495 0, /* HeapOffsetSizes */
496 1, /* Reserved2 */
497 { { 0 } }, /* MaskValid */
498 { { 0 } } /* MaskSorted */
499 },
500 /* numrows */
501 { 1, 1, 1, 1 },
502 /* MODULETABLE */
503 {
504 0, /* Generation */
505 0xA, /* Name */
506 1, /* Mvid */
507 0, /* EncId */
508 0 /* EncBaseId */
509 },
510 /* TYPEDEFTABLE */
511 {
512 0, /* Flags */
513 0x1, /* Name */
514 0, /* Namespace */
515 0, /* Extends */
516 1, /* FieldList */
517 1 /* MethodList */
518 },
519 /* ASSEMBLYTABLE */
520 {
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 */
530 },
531 /* MANIFESTRESTABLE */
532 {
533 0, /* Offset */
534 0x2, /* Flags */
535 0x18, /* Name */
536 0 /* Implementation */
537 },
538 /* pad */
539 0,
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
558 },
559 /* IMAGE_IMPORT_DESCRIPTOR */
560 {
561 { 0x2364 }, /* OriginalFirstThunk */
562 0, /* TimeDateStamp */
563 0, /* ForwarderChain */
564 0x237E, /* Name */
565 0x2000, /* FirstThunk */
566 },
567 /* pad */
568 { 0 },
569 /* IMPORTLOOKUPTABLE */
570 {
571 0x2370, /* HintNameTableRVA */
572 { 0 }, /* pad */
573 },
574 /* HINTNAMETABLE */
575 {
576 0, /* Hint */
577 "_CorDllMain", /* Name */
578 "mscoree.dll", /* Module */
579 0, /* Reserved */
580 0x25FF, /* EntryPoint */
581 0x402000 /* RVA */
582 },
583 /* pad to 0x600 */
584 { 0 },
585 /* IMAGE_RESOURCE_DIRECTORY */
586 {
587 0, /* Characteristics */
588 0, /* TimeDateStamp */
589 0, /* MajorVersion */
590 0, /* MinorVersion */
591 0, /* NumberOfNamedEntries */
592 1, /* NumberOfIdEntries */
593 },
594 /* IMAGE_RESOURCE_DIRECTORY_ENTRY */
595 { { { 0 } }, { 0 } }, /* nameless unions initialized later */
596 /* IMAGE_RESOURCE_DIRECTORY */
597 {
598 0, /* Characteristics */
599 0, /* TimeDateStamp */
600 0, /* MajorVersion */
601 0, /* MinorVersion */
602 0, /* NumberOfNamedEntries */
603 1, /* NumberOfIdEntries */
604 },
605 /* IMAGE_RESOURCE_DIRECTORY_ENTRY */
606 { { { 0 } }, { 0 } }, /* nameless unions initialized later */
607 /* IMAGE_RESOURCE_DIRECTORY */
608 {
609 0, /* Characteristics */
610 0, /* TimeDateStamp */
611 0, /* MajorVersion */
612 0, /* MinorVersion */
613 0, /* NumberOfNamedEntries */
614 1, /* NumberOfIdEntries */
615 },
616 /* IMAGE_RESOURCE_DIRECTORY_ENTRY */
617 { { { 0 } }, { 0 } }, /* nameless unions initialized later */
618 /* IMAGE_RESOURCE_DATA_ENTRY */
619 {
620 0x4058, /* OffsetToData */
621 0x23C, /* Size */
622 0, /* CodePage */
623 0, /* Reserved */
624 },
625 /* VS_VERSIONINFO */
626 {
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 */
632 {
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 */
646 },
647 },
648 /* VARFILEINFO */
649 {
650 0x44, /* wLength */
651 0, /* wValueLength */
652 1, /* wType */
653 { 'V','a','r','F','i','l','e','I','n','f','o',0,0 } /* szKey */
654 },
655 /* VAR */
656 {
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 */
662 },
663 /* STRINGFILEINFO */
664 {
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 */
669 },
670 /* STRINGTABLE */
671 {
672 0x178, /* wLength */
673 0, /* wValueLength */
674 1, /* wType */
675 { '0','0','0','0','0','4','b','0',0 }, /* szKey */
676 },
677 /* STRINGHDR */
678 {
679 0x2C, /* wLength */
680 2, /* wValueLength */
681 1, /* wType */
682 },
683 { 'F','i','l','e','D','e','s','c','r','i','p','t','i','o','n',0,0 }, /* szKey */
684 { ' ',0 }, /* szValue */
685 /* STRINGHDR */
686 {
687 0x30, /* wLength */
688 8, /* wValueLength */
689 1, /* wType */
690 },
691 { 'F','i','l','e','V','e','r','s','i','o','n',0,0 }, /* szKey */
692 { '1','.','0','.','0','.','0',0 }, /* szValue */
693 /* STRINGHDR */
694 {
695 0x34, /* wLength */
696 9, /* wValueLength */
697 1, /* wType */
698 },
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 */
702 {
703 0x28, /* wLength */
704 2, /* wValueLength */
705 1, /* wType */
706 },
707 { 'L','e','g','a','l','C','o','p','y','r','i','g','h','t',0 }, /* szKey */
708 { ' ',0 }, /* szValue */
709 /* STRINGHDR */
710 {
711 0x3C, /* wLength */
712 9, /* wValueLength */
713 1, /* wType */
714 },
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 */
718 {
719 0x34, /* wLength */
720 8, /* wValueLength */
721 1, /* wType */
722 },
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 */
726 {
727 0x38, /* wLength */
728 8, /* wValueLength */
729 1, /* wType */
730 },
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 */
735 {
736 0x2000, /* PageRVA */
737 0xC, /* Size */
738 0x3390, /* Relocation */
739 },
740 { 0 }
742
743
744static HRESULT (WINAPI *pCreateAssemblyCache)(IAssemblyCache **ppAsmCache,
746static HRESULT (WINAPI *pGetCachePath)(ASM_CACHE_FLAGS dwCacheFlags,
748static HRESULT (WINAPI *pLoadLibraryShim)(LPCWSTR szDllName, LPCWSTR szVersion,
750
752{
753 HRESULT hr;
754 HMODULE hfusion;
756
757 static const WCHAR szFusion[] = {'f','u','s','i','o','n','.','d','l','l',0};
758
759 hmscoree = LoadLibraryA("mscoree.dll");
760 if (!hmscoree)
761 {
762 win_skip("mscoree.dll not available\n");
763 return FALSE;
764 }
765
766 pLoadLibraryShim = (void *)GetProcAddress(hmscoree, "LoadLibraryShim");
767 if (!pLoadLibraryShim)
768 {
769 win_skip("LoadLibraryShim not available\n");
771 return FALSE;
772 }
773
774 hr = pLoadLibraryShim(szFusion, NULL, NULL, &hfusion);
775 if (FAILED(hr))
776 {
777 win_skip("fusion.dll not available\n");
779 return FALSE;
780 }
781
782 pCreateAssemblyCache = (void *)GetProcAddress(hfusion, "CreateAssemblyCache");
783 pGetCachePath = (void *)GetProcAddress(hfusion, "GetCachePath");
784
785 if (!pCreateAssemblyCache || !pGetCachePath)
786 {
787 win_skip("fusion.dll not implemented\n");
788 return FALSE;
789 }
790
792 return TRUE;
793}
794
796{
797 HANDLE file;
798 DWORD written;
799
801 ok(file != INVALID_HANDLE_VALUE, "Failure to open file %s\n", name);
802 WriteFile(file, data, strlen(data), &written, NULL);
803
804 if (size)
805 {
808 }
809
811}
812
813#define create_file(name, size) create_file_data(name, name, size)
814
816{
817 HANDLE hfile;
818 DWORD written;
819
820 /* nameless unions initialized here */
821 assembly.tableshdr.MaskValid.u.HighPart = 0x101;
822 assembly.tableshdr.MaskValid.u.LowPart = 0x00000005;
823 assembly.tableshdr.MaskSorted.u.HighPart = 0x1600;
824 assembly.tableshdr.MaskSorted.u.LowPart = 0x3301FA00;
825 U(assembly.labelres).Name = 0x10;
826 U2(assembly.labelres).OffsetToData = 0x80000018;
827 U(assembly.label11res).Name = 0x1;
828 U2(assembly.label11res).OffsetToData = 0x80000030;
829 U(assembly.label10res).Name = 0x0;
830 U2(assembly.label10res).OffsetToData = 0x48;
831
832 hfile = CreateFileA(file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
833
834 WriteFile(hfile, &assembly, sizeof(ASSEMBLY), &written, NULL);
835 CloseHandle(hfile);
836}
837
839{
841 HRESULT hr;
842 BOOL ret = FALSE;
843 ULONG disp;
844
845 static const WCHAR winedll[] = {'w','i','n','e','.','d','l','l',0};
846
847 create_assembly("wine.dll");
848
849 hr = pCreateAssemblyCache(&cache, 0);
850 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
851
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);
861
862 DeleteFileA("wine.dll");
863 IAssemblyCache_UninstallAssembly(cache, 0, winedll, NULL, &disp);
864 IAssemblyCache_Release(cache);
865 return ret;
866}
867
869{
871 HRESULT hr;
872
873 /* NULL ppAsmCache */
874 hr = pCreateAssemblyCache(NULL, 0);
875 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
876
877 /* dwReserved is non-zero */
878 hr = pCreateAssemblyCache(&cache, 42);
879 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
880
881 IAssemblyCache_Release(cache);
882}
883
885{
888 HRESULT hr;
889
890 static const WCHAR wine[] = {'w','i','n','e',0};
891
892 hr = pCreateAssemblyCache(&cache, 0);
893 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
894
895 hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 0, NULL, NULL, NULL);
896 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
897
898 hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 0, NULL, &item, NULL);
899 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
900 IAssemblyCacheItem_Release(item);
901
902 hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 0, NULL, &item, wine);
903 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
904 IAssemblyCacheItem_Release(item);
905
906 hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 1, (void *)0xdeadbeef, &item, NULL);
907 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
908 IAssemblyCacheItem_Release(item);
909
910 hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 1, NULL, &item, NULL);
911 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
912 IAssemblyCacheItem_Release(item);
913
914 hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 0, (void *)0xdeadbeef, &item, NULL);
915 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
916 IAssemblyCacheItem_Release(item);
917
918 IAssemblyCache_Release(cache);
919}
920
921static void test_InstallAssembly(void)
922{
924 HRESULT hr;
925 ULONG disp;
926 DWORD attr;
927 char dllpath[MAX_PATH];
928
929 static const WCHAR empty[] = {0};
930 static const WCHAR noext[] = {'f','i','l','e',0};
931 static const WCHAR badext[] = {'f','i','l','e','.','b','a','d',0};
932 static const WCHAR dllext[] = {'f','i','l','e','.','d','l','l',0};
933 static const WCHAR exeext[] = {'f','i','l','e','.','e','x','e',0};
934 static const WCHAR testdll[] = {'t','e','s','t','.','d','l','l',0};
935 static const WCHAR winedll[] = {'w','i','n','e','.','d','l','l',0};
936 static const WCHAR wine[] = {'w','i','n','e',0};
937
938 create_file("test.dll", 100);
939 create_assembly("wine.dll");
940
941 hr = pCreateAssemblyCache(&cache, 0);
942 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
943
944 /* NULL pszManifestFilePath */
945 hr = IAssemblyCache_InstallAssembly(cache, 0, NULL, NULL);
946 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
947
948 /* empty pszManifestFilePath */
949 hr = IAssemblyCache_InstallAssembly(cache, 0, empty, NULL);
950 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
951
952 /* pszManifestFilePath has no extension */
953 hr = IAssemblyCache_InstallAssembly(cache, 0, noext, NULL);
955 "Expected HRESULT_FROM_WIN32(ERROR_INVALID_NAME), got %08x\n", hr);
956
957 /* pszManifestFilePath has bad extension */
958 hr = IAssemblyCache_InstallAssembly(cache, 0, badext, NULL);
960 "Expected HRESULT_FROM_WIN32(ERROR_INVALID_NAME), got %08x\n", hr);
961
962 /* pszManifestFilePath has dll extension */
963 hr = IAssemblyCache_InstallAssembly(cache, 0, dllext, NULL);
965 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
966
967 /* pszManifestFilePath has exe extension */
968 hr = IAssemblyCache_InstallAssembly(cache, 0, exeext, NULL);
970 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
971
972 /* empty file */
973 hr = IAssemblyCache_InstallAssembly(cache, 0, testdll, NULL);
975 "Expected COR_E_ASSEMBLYEXPECTED, got %08x\n", hr);
976
977 /* wine assembly */
978 hr = IAssemblyCache_InstallAssembly(cache, 0, winedll, NULL);
979 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
980
982 strcat(dllpath, "\\assembly\\GAC_MSIL\\wine\\\\1.0.0.0__2d03617b1c31e2f5\\wine.dll");
983
985 ok(attr != INVALID_FILE_ATTRIBUTES, "Expected assembly to exist\n");
986
987 /* uninstall the assembly from the GAC */
988 disp = 0xf00dbad;
989 hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp);
990 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
991 ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED,
992 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp);
993
995 ok(attr == INVALID_FILE_ATTRIBUTES, "Expected assembly not to exist\n");
996
997 disp = 0xf00dbad;
998 hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp);
999 ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr);
1000 ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED,
1001 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED, got %d\n", disp);
1002
1003 DeleteFileA("test.dll");
1004 DeleteFileA("wine.dll");
1005 IAssemblyCache_Release(cache);
1006}
1007
1008#define INIT_ASM_INFO() \
1009 ZeroMemory(&info, sizeof(ASSEMBLY_INFO)); \
1010 info.cbAssemblyInfo = sizeof(ASSEMBLY_INFO); \
1011 info.pszCurrentAssemblyPathBuf = path; \
1012 info.cchBuf = MAX_PATH; \
1013 path[0] = '\0';
1014
1015static void test_QueryAssemblyInfo(void)
1016{
1020 WCHAR asmpath[MAX_PATH];
1022 HRESULT hr;
1023 DWORD size;
1024 ULONG disp;
1025
1026 static const WCHAR empty[] = {0};
1027 static const WCHAR commasep[] = {',',' ',0};
1028 static const WCHAR winedll[] = {'w','i','n','e','.','d','l','l',0};
1029 static const WCHAR wine[] = {'w','i','n','e',0};
1030 static const WCHAR ver[] = {
1031 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0};
1032 static const WCHAR otherver[] = {
1033 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','0','0','0','0','0',0};
1034 static const WCHAR badver[] = {
1035 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','1',0};
1036 static const WCHAR culture[] = {
1037 'C','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
1038 static const WCHAR badculture[] = {
1039 'C','u','l','t','u','r','e','=','e','n',0};
1040 static const WCHAR pubkey[] = {
1041 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
1042 '2','d','0','3','6','1','7','b','1','c','3','1','e','2','f','5',0};
1043 static const WCHAR badpubkey[] = {
1044 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
1045 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',0};
1046 static const WCHAR badprop[] = {'B','a','d','P','r','o','p','=','b','u','h',0};
1047 static const WCHAR msil[] = {
1048 '_','M','S','I','L','\\','w','i','n','e','\\',
1049 '1','.','0','.','0','.','0','_','_','2','d','0','3','6','1','7','b',
1050 '1','c','3','1','e','2','f','5','\\',0};
1051 static const WCHAR wine2[] = {
1052 'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','1',',',
1053 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=',
1054 '2','d','0','3','6','1','7','b','1','c','3','1','e','2','f','5',',',
1055 'c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
1056 static const WCHAR nullpublickey[] = {
1057 'm','s','c','o','r','l','i','b','.','d','l','l',',','v','e','r','s','i','o','n','=','0','.','0','.',
1058 '0','.','0',',','c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',',',
1059 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','n','u','l','l',0};
1060 static const WCHAR nullpublickey1[] = {
1061 'm','s','c','o','r','l','i','b','.','d','l','l',',',
1062 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','n','u','L','l',0};
1063
1064 size = MAX_PATH;
1065 hr = pGetCachePath(ASM_CACHE_GAC, asmpath, &size);
1066 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1067
1068 lstrcatW(asmpath, msil);
1069 lstrcatW(asmpath, winedll);
1070
1071 create_assembly("wine.dll");
1072
1073 hr = pCreateAssemblyCache(&cache, 0);
1074 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1075
1076 /* assembly not installed yet */
1077 INIT_ASM_INFO();
1078 hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, wine, &info);
1080 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
1081 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1082 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1083 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1084 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1085 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1086 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1087 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1088 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1089 "Assembly path was changed\n");
1090 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1091
1092 hr = IAssemblyCache_InstallAssembly(cache, 0, winedll, NULL);
1093 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1094
1095 /* NULL pszAssemblyName */
1096 INIT_ASM_INFO();
1097 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE,
1098 NULL, &info);
1099 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
1100 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1101 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1102 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1103 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1104 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1105 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1106 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1107 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1108 "Assembly path was changed\n");
1109 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1110
1111 /* empty pszAssemblyName */
1112 INIT_ASM_INFO();
1113 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE,
1114 empty, &info);
1115 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
1116 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1117 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1118 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1119 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1120 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1121 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1122 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1123 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1124 "Assembly path was changed\n");
1125 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1126
1127 /* no dwFlags */
1128 INIT_ASM_INFO();
1129 hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, wine, &info);
1130 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1131 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1132 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1133 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1134 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1135 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1136 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1137 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1138 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1139 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1140 "Wrong assembly path returned\n");
1141 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1142 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1143
1144 /* pwzCachePath is full filename */
1145 INIT_ASM_INFO();
1146 hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, winedll, &info);
1148 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
1149 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1150 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1151 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1152 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1153 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1154 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1155 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1156 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1157 "Assembly path was changed\n");
1158 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1159
1160 /* NULL pAsmInfo, QUERYASMINFO_FLAG_VALIDATE */
1161 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE,
1162 wine, NULL);
1163 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1164
1165 /* NULL pAsmInfo, QUERYASMINFO_FLAG_GETSIZE */
1166 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1167 wine, NULL);
1168 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1169
1170 /* info.cbAssemblyInfo is 0 */
1171 INIT_ASM_INFO();
1172 info.cbAssemblyInfo = 0;
1173 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE,
1174 wine, &info);
1175 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1176 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1177 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1178 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1179 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1180 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1181 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1182 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1183 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1184 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1185 "Wrong assembly path returned\n");
1186 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1187 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1188
1189 /* info.cbAssemblyInfo is 1 */
1190 INIT_ASM_INFO();
1191 info.cbAssemblyInfo = 1;
1192 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE,
1193 wine, &info);
1194 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
1195 ok(info.cbAssemblyInfo == 1, "Expected 1, got %d\n", info.cbAssemblyInfo);
1196 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1197 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1198 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1199 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1200 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1201 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1202 "Assembly path was changed\n");
1203 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1204
1205 /* info.cbAssemblyInfo is > sizeof(ASSEMBLY_INFO) */
1206 INIT_ASM_INFO();
1207 info.cbAssemblyInfo = sizeof(ASSEMBLY_INFO) * 2;
1208 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1209 wine, &info);
1210 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
1211 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO) * 2,
1212 "Expected sizeof(ASSEMBLY_INFO) * 2, got %d\n", info.cbAssemblyInfo);
1213 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1214 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1215 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1216 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1217 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1218 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1219 "Assembly path was changed\n");
1220 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1221
1222 /* QUERYASMINFO_FLAG_GETSIZE */
1223 INIT_ASM_INFO();
1224 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1225 wine, &info);
1226 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1227 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1228 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1229 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1230 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1231 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1232 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1233 todo_wine
1234 {
1235 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1236 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1237 }
1238 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1239 "Wrong assembly path returned\n");
1240 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1241 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1242
1243 /* QUERYASMINFO_FLAG_GETSIZE and QUERYASMINFO_FLAG_VALIDATE */
1244 INIT_ASM_INFO();
1245 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE |
1246 QUERYASMINFO_FLAG_VALIDATE,wine, &info);
1247 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1248 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1249 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1250 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1251 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1252 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1253 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1254 todo_wine
1255 {
1256 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1257 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1258 }
1259 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1260 "Wrong assembly path returned\n");
1261 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1262 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1263
1264 /* info.pszCurrentAssemblyPathBuf is NULL */
1265 INIT_ASM_INFO();
1266 info.pszCurrentAssemblyPathBuf = NULL;
1267 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1268 wine, &info);
1269 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1270 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1271 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1272 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1273 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1274 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1275 ok(hr == E_NOT_SUFFICIENT_BUFFER, "Expected E_NOT_SUFFICIENT_BUFFER, got %08x\n", hr);
1276 todo_wine
1277 {
1278 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1279 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1280 }
1281 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1282 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1283
1284 /* info.cchBuf is exactly size of asmpath */
1285 INIT_ASM_INFO();
1286 info.cchBuf = lstrlenW(asmpath);
1287 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1288 wine, &info);
1289 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1290 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1291 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1292 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1293 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1294 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1295 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1296 "Assembly path was changed\n");
1297 ok(hr == E_NOT_SUFFICIENT_BUFFER, "Expected E_NOT_SUFFICIENT_BUFFER, got %08x\n", hr);
1298 todo_wine
1299 {
1300 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1301 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1302 }
1303 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1304 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1305
1306 /* info.cchBuf has room for NULL-terminator */
1307 INIT_ASM_INFO();
1308 info.cchBuf = lstrlenW(asmpath) + 1;
1309 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1310 wine, &info);
1311 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1312 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1313 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1314 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1315 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1316 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1317 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1318 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1319 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1320 todo_wine
1321 {
1322 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1323 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1324 }
1325 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1326 "Wrong assembly path returned\n");
1327
1328 /* display name is "wine, Version=1.0.0.0" */
1329 INIT_ASM_INFO();
1330 lstrcpyW(name, wine);
1331 lstrcatW(name, commasep);
1332 lstrcatW(name, ver);
1333 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1334 name, &info);
1335 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1336 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1337 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1338 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1339 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1340 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1341 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1342 todo_wine
1343 {
1344 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1345 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1346 }
1347 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1348 "Wrong assembly path returned\n");
1349 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1350 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1351
1352 /* short buffer, QUERYASMINFO_FLAG_VALIDATE */
1353 memset(&info, 0, sizeof(info));
1354 lstrcpyW(name, wine);
1355 lstrcatW(name, commasep);
1356 lstrcatW(name, otherver);
1357 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE,
1358 name, &info);
1359 ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr);
1360 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, "got %08x\n", info.dwAssemblyFlags);
1361
1362 /* short buffer, QUERYASMINFO_FLAG_GETSIZE */
1363 memset(&info, 0, sizeof(info));
1364 lstrcpyW(name, wine);
1365 lstrcatW(name, commasep);
1366 lstrcatW(name, otherver);
1367 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1368 name, &info);
1369 ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr);
1370 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, "got %08x\n", info.dwAssemblyFlags);
1371
1372 /* display name is "wine, Version=1.0.0.00000" */
1373 INIT_ASM_INFO();
1374 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1375 name, &info);
1376 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1377 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1378 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1379 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1380 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1381 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1382 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1383 todo_wine
1384 {
1385 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1386 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1387 }
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);
1392
1393 /* display name is "wine, Version=1.0.0.1", versions don't match */
1394 INIT_ASM_INFO();
1395 lstrcpyW(name, wine);
1396 lstrcatW(name, commasep);
1397 lstrcatW(name, badver);
1398 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1399 name, &info);
1401 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
1402 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1403 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1404 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1405 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1406 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1407 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1408 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1409 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1410 "Assembly path was changed\n");
1411 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1412
1413 /* display name is "wine,version=1.0.0.1,publicKeyToken=2d03617b1c31e2f5,culture=neutral" */
1414 INIT_ASM_INFO();
1415 lstrcpyW(name, wine2);
1416 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1417 name, &info);
1419 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
1420 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1421 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1422 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1423 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1424 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1425 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1426 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1427 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1428 "Assembly path was changed\n");
1429 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1430
1431 /* display name is "mscorlib.dll,version=0.0.0.0,culture=neutral,publicKeyToken=null" */
1432 INIT_ASM_INFO();
1433 lstrcpyW(name, nullpublickey);
1434 hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, name, &info);
1435 ok(hr == FUSION_E_PRIVATE_ASM_DISALLOWED, "got %08x\n", hr);
1436
1437 /* display name is "mscorlib.dll,publicKeyToken=nuLl" */
1438 INIT_ASM_INFO();
1439 lstrcpyW(name, nullpublickey1);
1440 hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, name, &info);
1441 ok(hr == FUSION_E_PRIVATE_ASM_DISALLOWED, "got %08x\n", hr);
1442
1443 /* display name is "wine, Culture=neutral" */
1444 INIT_ASM_INFO();
1445 lstrcpyW(name, wine);
1446 lstrcatW(name, commasep);
1448 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1449 name, &info);
1450 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1451 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1452 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1453 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1454 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1455 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1456 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1457 todo_wine
1458 {
1459 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1460 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1461 }
1462 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1463 "Wrong assembly path returned\n");
1464 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1465 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1466
1467 /* display name is "wine, Culture=en", cultures don't match */
1468 INIT_ASM_INFO();
1469 lstrcpyW(name, wine);
1470 lstrcatW(name, commasep);
1471 lstrcatW(name, badculture);
1472 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1473 name, &info);
1475 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
1476 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1477 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1478 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1479 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1480 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1481 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1482 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1483 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1484 "Assembly path was changed\n");
1485 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1486
1487 /* display name is "wine, PublicKeyTokens=2d03617b1c31e2f5" */
1488 INIT_ASM_INFO();
1489 lstrcpyW(name, wine);
1490 lstrcatW(name, commasep);
1492 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1493 name, &info);
1494 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1495 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1496 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1497 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1498 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1499 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1500 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1501 todo_wine
1502 {
1503 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1504 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1505 }
1506 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1507 "Wrong assembly path returned\n");
1508 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1509 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1510
1511 /* display name is "wine, PublicKeyToken=aaaaaaaaaaaaaaaa", pubkeys don't match */
1512 INIT_ASM_INFO();
1513 lstrcpyW(name, wine);
1514 lstrcatW(name, commasep);
1515 lstrcatW(name, badpubkey);
1516 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1517 name, &info);
1519 "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr);
1520 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1521 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1522 ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags);
1523 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1524 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1525 ok(info.uliAssemblySizeInKB.u.LowPart == 0,
1526 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1527 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty),
1528 "Assembly path was changed\n");
1529 ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf);
1530
1531 /* display name is "wine, BadProp=buh", bad property */
1532 INIT_ASM_INFO();
1533 lstrcpyW(name, wine);
1534 lstrcatW(name, commasep);
1535 lstrcatW(name, badprop);
1536 hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE,
1537 name, &info);
1538 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1539 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1540 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1541 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1542 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1543 ok(info.uliAssemblySizeInKB.u.HighPart == 0,
1544 "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart);
1545 todo_wine
1546 {
1547 ok((info.uliAssemblySizeInKB.u.LowPart == 4),
1548 "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart);
1549 }
1550 ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath),
1551 "Wrong assembly path returned\n");
1552 ok(info.cchBuf == lstrlenW(asmpath) + 1,
1553 "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf);
1554
1555 /* no flags, display name is "wine, Version=1.0.0.0" */
1556 INIT_ASM_INFO();
1557 info.pszCurrentAssemblyPathBuf = NULL;
1558 info.cchBuf = 0;
1559 lstrcpyW(name, wine);
1560 lstrcatW(name, commasep);
1561 lstrcatW(name, ver);
1562 hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, name, &info);
1563 ok(hr == E_NOT_SUFFICIENT_BUFFER, "Expected E_NOT_SUFFICIENT_BUFFER, got %08x\n", hr);
1564 ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO),
1565 "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo);
1566 ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED,
1567 "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags);
1568
1569 /* uninstall the assembly from the GAC */
1570 disp = 0xf00dbad;
1571 hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp);
1572 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
1573 ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED,
1574 "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp);
1575
1576 DeleteFileA("test.dll");
1577 DeleteFileA("wine.dll");
1578 IAssemblyCache_Release(cache);
1579}
1580
1581START_TEST(asmcache)
1582{
1583 if (!init_functionpointers())
1584 return;
1585
1586 if (!check_dotnet20())
1587 return;
1588
1593}
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
struct NameRec_ * Name
Definition: cdprocs.h:460
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define U(x)
Definition: wordpad.c:45
#define U2(x)
Definition: wordpad.c:46
@ Reserved2
Definition: bcd.h:202
@ Reserved1
Definition: bcd.h:201
#define FUSION_E_PRIVATE_ASM_DISALLOWED
Definition: corerror.h:122
#define COR_E_ASSEMBLYEXPECTED
Definition: corerror.h:52
#define CLDB_E_FILE_OLDVER
Definition: corerror.h:125
#define E_INVALIDARG
Definition: ddrawi.h:101
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static const WCHAR szDllName[]
Definition: sip.c:61
static const WCHAR empty[]
Definition: main.c:47
#define CloseHandle
Definition: compat.h:739
#define FILE_BEGIN
Definition: compat.h:761
#define SetFilePointer
Definition: compat.h:743
#define GetProcAddress(x, y)
Definition: compat.h:753
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define FreeLibrary(x)
Definition: compat.h:748
#define MAX_PATH
Definition: compat.h:34
#define lstrcpyW
Definition: compat.h:749
#define ERROR_INVALID_NAME
Definition: compat.h:103
#define lstrlenW
Definition: compat.h:750
static const WCHAR pubkey[]
Definition: asmname.c:68
static const WCHAR culture[]
Definition: asmname.c:67
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
BOOL WINAPI SetEndOfFile(HANDLE hFile)
Definition: fileinfo.c:1004
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName)
Definition: fileinfo.c:636
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
UINT WINAPI GetWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2337
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4243
static const WCHAR Signature[]
Definition: parser.c:141
#define ASSEMBLYINFO_FLAG_INSTALLED
Definition: fusion.idl:103
ULONG BuildNumber
Definition: ros_glue.cpp:6
ULONG MajorVersion
Definition: ros_glue.cpp:4
ULONG MinorVersion
Definition: ros_glue.cpp:5
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
#define RVA(m, b)
Definition: freeldr.h:28
ASM_CACHE_FLAGS
Definition: fusion.idl:27
@ ASM_CACHE_GAC
Definition: fusion.idl:29
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
WCHAR dllpath[MAX_PATH]
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
#define CREATE_ALWAYS
Definition: disk.h:72
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static const BYTE wine[]
Definition: encode.c:696
static LPCSTR DWORD void * pvReserved
Definition: str.c:196
#define INIT_ASM_INFO()
Definition: asmcache.c:1008
static BOOL init_functionpointers(void)
Definition: asmcache.c:751
static void test_QueryAssemblyInfo(void)
Definition: asmcache.c:1015
static LPWSTR pwzCachePath
Definition: asmcache.c:747
static void test_CreateAssemblyCache(void)
Definition: asmcache.c:868
static void create_file_data(LPCSTR name, LPCSTR data, DWORD size)
Definition: asmcache.c:795
static void test_CreateAssemblyCacheItem(void)
Definition: asmcache.c:884
static void create_assembly(LPCSTR file)
Definition: asmcache.c:815
#define create_file(name, size)
Definition: asmcache.c:813
static BOOL check_dotnet20(void)
Definition: asmcache.c:838
static LPCWSTR szVersion
Definition: asmcache.c:748
static void test_InstallAssembly(void)
Definition: asmcache.c:921
static LPCWSTR LPVOID HMODULE * phModDll
Definition: asmcache.c:749
static LPWSTR PDWORD pcchPath
Definition: asmcache.c:747
static DWORD dwReserved
Definition: asmcache.c:745
static HMODULE hmscoree
Definition: fusion.c:24
#define todo_wine
Definition: custom.c:89
static ATOM item
Definition: dde.c:856
#define GENERIC_WRITE
Definition: nt_native.h:90
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
#define IMAGE_NT_OPTIONAL_HDR32_MAGIC
Definition: ntimage.h:376
#define IMAGE_SUBSYSTEM_WINDOWS_CUI
Definition: ntimage.h:438
#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT
Definition: ntimage.h:457
#define IMAGE_SCN_CNT_INITIALIZED_DATA
Definition: ntimage.h:231
#define IMAGE_SCN_CNT_CODE
Definition: ntimage.h:230
#define IMAGE_SCN_MEM_EXECUTE
Definition: ntimage.h:239
#define IMAGE_SCN_MEM_DISCARDABLE
Definition: ntimage.h:235
#define IMAGE_DLLCHARACTERISTICS_NO_SEH
Definition: ntimage.h:459
#define IMAGE_SCN_MEM_READ
Definition: ntimage.h:240
#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
Definition: ntimage.h:455
#define IMAGE_FILE_EXECUTABLE_IMAGE
Definition: pedump.c:160
#define IMAGE_FILE_MACHINE_I386
Definition: pedump.c:174
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED
Definition: pedump.c:162
DWORD * PDWORD
Definition: pedump.c:68
#define IMAGE_NT_SIGNATURE
Definition: pedump.c:93
#define IMAGE_FILE_DLL
Definition: pedump.c:169
#define IMAGE_FILE_LINE_NUMS_STRIPPED
Definition: pedump.c:161
unsigned short USHORT
Definition: pedump.c:61
#define IMAGE_DOS_SIGNATURE
Definition: pedump.c:89
#define IMAGE_FILE_32BIT_MACHINE
Definition: pedump.c:164
#define win_skip
Definition: test.h:163
#define memset(x, y, z)
Definition: compat.h:39
HRESULT hr
Definition: shlfolder.c:183
DWORD SkipBytes
Definition: asmcache.c:191
Definition: pedump.c:458
Definition: pedump.c:414
WCHAR intnameval[10]
Definition: asmcache.c:258
WCHAR asmverval[8]
Definition: asmcache.c:270
IMAGE_COR20_HEADER clrhdr
Definition: asmcache.c:208
WORD unknown[32]
Definition: asmcache.c:200
VS_VERSIONINFO verinfo
Definition: asmcache.c:245
WORD usheap[4]
Definition: asmcache.c:230
WCHAR orignameval[10]
Definition: asmcache.c:264
IMAGE_IMPORT_DESCRIPTOR importdesc
Definition: asmcache.c:233
VARFILEINFO varfileinfo
Definition: asmcache.c:246
BYTE pad4[20]
Definition: asmcache.c:234
STRINGHDR asmverhdr
Definition: asmcache.c:268
IMAGE_RESOURCE_DIRECTORY topresdir
Definition: asmcache.c:238
METADATASTREAMHDR guidhdr
Definition: asmcache.c:218
WCHAR copyrightkey[15]
Definition: asmcache.c:260
STRINGHDR intnamehdr
Definition: asmcache.c:256
BYTE rootname[4]
Definition: asmcache.c:213
TYPEDEFTABLE tdtable
Definition: asmcache.c:225
IMPORTLOOKUPTABLE importlookup
Definition: asmcache.c:235
IMAGE_RESOURCE_DIRECTORY res10dir
Definition: asmcache.c:242
WORD pad7[250]
Definition: asmcache.c:273
STRINGHDR fileverhdr
Definition: asmcache.c:253
IMAGE_SECTION_HEADER rsrc
Definition: asmcache.c:203
WORD guidheap[8]
Definition: asmcache.c:231
IMAGE_NT_HEADERS32 nthdrs
Definition: asmcache.c:201
IMAGE_RESOURCE_DIRECTORY_ENTRY label10res
Definition: asmcache.c:243
IMAGE_RESOURCE_DATA_ENTRY resdata
Definition: asmcache.c:244
BYTE guidname[8]
Definition: asmcache.c:219
WORD blobheap[82]
Definition: asmcache.c:232
ASSEMBLYTABLE asmtable
Definition: asmcache.c:226
IMAGE_RESOURCE_DIRECTORY_ENTRY label11res
Definition: asmcache.c:241
WCHAR prodverval[8]
Definition: asmcache.c:267
IMAGE_DOS_HEADER doshdr
Definition: asmcache.c:199
WCHAR orignamekey[17]
Definition: asmcache.c:263
STRINGHDR orignamehdr
Definition: asmcache.c:262
BYTE blobname[8]
Definition: asmcache.c:221
WCHAR copyrightval[2]
Definition: asmcache.c:261
STRINGHDR copyrighthdr
Definition: asmcache.c:259
WORD strongname[64]
Definition: asmcache.c:209
RESOURCE resource
Definition: asmcache.c:210
WCHAR filedesckey[17]
Definition: asmcache.c:251
BYTE pad2[3]
Definition: asmcache.c:207
METADATASTREAMHDR roothdr
Definition: asmcache.c:212
WCHAR fileverval[8]
Definition: asmcache.c:255
IMAGE_RESOURCE_DIRECTORY res11dir
Definition: asmcache.c:240
WCHAR fileverkey[13]
Definition: asmcache.c:254
STRINGHDR filedeschdr
Definition: asmcache.c:250
STRINGTABLE strtable
Definition: asmcache.c:249
METADATASTREAMHDR ushdr
Definition: asmcache.c:216
DWORD numrows[4]
Definition: asmcache.c:223
BYTE usname[4]
Definition: asmcache.c:217
VAR translation
Definition: asmcache.c:247
IMAGE_IMPORT_BY_NAME iat
Definition: asmcache.c:206
MODULETABLE modtable
Definition: asmcache.c:224
MANIFESTRESTABLE manifestrestable
Definition: asmcache.c:227
IMAGE_RESOURCE_DIRECTORY_ENTRY labelres
Definition: asmcache.c:239
BYTE stringheap[40]
Definition: asmcache.c:229
BYTE pad[16]
Definition: asmcache.c:205
HINTNAMETABLE hintnametable
Definition: asmcache.c:236
IMAGE_SECTION_HEADER reloc
Definition: asmcache.c:204
STRINGHDR prodverhdr
Definition: asmcache.c:265
STRINGFILEINFO strfileinfo
Definition: asmcache.c:248
METADATASTREAMHDR blobhdr
Definition: asmcache.c:220
IMAGE_SECTION_HEADER text
Definition: asmcache.c:202
WORD pad6[182]
Definition: asmcache.c:271
METADATATABLESHDR tableshdr
Definition: asmcache.c:222
WCHAR filedescval[2]
Definition: asmcache.c:252
METADATAHDR metadatahdr
Definition: asmcache.c:211
WCHAR intnamekey[13]
Definition: asmcache.c:257
WCHAR asmverkey[17]
Definition: asmcache.c:269
BYTE pad5[108]
Definition: asmcache.c:237
WCHAR prodverkey[15]
Definition: asmcache.c:266
METADATASTREAMHDR stringshdr
Definition: asmcache.c:214
BYTE stringsname[12]
Definition: asmcache.c:215
RELOCATION relocation
Definition: asmcache.c:272
Definition: cookie.c:202
Definition: cache.c:49
Definition: fci.c:127
Definition: name.c:39
uint32_t ULONG
Definition: typedefs.h:59
#define VFT_DLL
Definition: verrsrc.h:76
#define VFT2_UNKNOWN
Definition: verrsrc.h:84
#define VS_FFI_SIGNATURE
Definition: verrsrc.h:37
#define VS_FFI_STRUCVERSION
Definition: verrsrc.h:38
#define VOS__WINDOWS32
Definition: verrsrc.h:64
#define VS_FFI_FILEFLAGSMASK
Definition: verrsrc.h:39
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
int ret
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_Reserved_ PVOID Reserved
Definition: winddi.h:3974
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_NOT_SUFFICIENT_BUFFER
Definition: winerror.h:2345
#define E_ACCESSDENIED
Definition: winerror.h:2849
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
@ COMIMAGE_FLAGS_ILONLY
Definition: winnt_old.h:3291
@ COMIMAGE_FLAGS_STRONGNAMESIGNED
Definition: winnt_old.h:3294
struct _ASSEMBLY_INFO ASSEMBLY_INFO
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193