| /* |
| * Copyright 2008 James Hawkins |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #define COBJMACROS |
| #define INITGUID |
| |
| #include <stdio.h> |
| |
| #include <windows.h> |
| #include <mscoree.h> |
| #include <fusion.h> |
| #include <corerror.h> |
| |
| #include "wine/test.h" |
| |
| typedef struct _tagASSEMBLY ASSEMBLY; |
| |
| typedef struct |
| { |
| ULONG Signature; |
| USHORT MajorVersion; |
| USHORT MinorVersion; |
| ULONG Reserved; |
| ULONG VersionLength; |
| BYTE Version[12]; |
| BYTE Flags; |
| WORD Streams; |
| } METADATAHDR; |
| |
| #include <pshpack1.h> |
| |
| typedef struct |
| { |
| DWORD Offset; |
| DWORD Size; |
| } METADATASTREAMHDR; |
| |
| typedef struct |
| { |
| DWORD Reserved1; |
| BYTE MajorVersion; |
| BYTE MinorVersion; |
| BYTE HeapOffsetSizes; |
| BYTE Reserved2; |
| LARGE_INTEGER MaskValid; |
| LARGE_INTEGER MaskSorted; |
| } METADATATABLESHDR; |
| |
| typedef struct |
| { |
| WORD Generation; |
| WORD Name; |
| WORD Mvid; |
| WORD EncId; |
| WORD EncBaseId; |
| } MODULETABLE; |
| |
| typedef struct |
| { |
| DWORD Flags; |
| WORD Name; |
| WORD Namespace; |
| WORD Extends; |
| WORD FieldList; |
| WORD MethodList; |
| } TYPEDEFTABLE; |
| |
| typedef struct |
| { |
| DWORD HashAlgId; |
| WORD MajorVersion; |
| WORD MinorVersion; |
| WORD BuildNumber; |
| WORD RevisionNumber; |
| DWORD Flags; |
| WORD PublicKey; |
| WORD Name; |
| WORD Culture; |
| } ASSEMBLYTABLE; |
| |
| typedef struct |
| { |
| DWORD Offset; |
| DWORD Flags; |
| WORD Name; |
| WORD Implementation; |
| } MANIFESTRESTABLE; |
| |
| typedef struct |
| { |
| DWORD ImportLookupTable; |
| DWORD DateTimeStamp; |
| DWORD ForwarderChain; |
| DWORD Name; |
| DWORD ImportAddressTable; |
| BYTE pad[20]; |
| } IMPORTTABLE; |
| |
| typedef struct |
| { |
| DWORD HintNameTableRVA; |
| BYTE pad[8]; |
| } IMPORTLOOKUPTABLE; |
| |
| typedef struct |
| { |
| WORD Hint; |
| BYTE Name[12]; |
| BYTE Module[12]; |
| DWORD Reserved; |
| WORD EntryPoint; |
| DWORD RVA; |
| } HINTNAMETABLE; |
| |
| typedef struct |
| { |
| DWORD PageRVA; |
| DWORD Size; |
| DWORD Relocation; |
| } RELOCATION; |
| |
| typedef struct |
| { |
| WORD wLength; |
| WORD wValueLength; |
| WORD wType; |
| WCHAR szKey[17]; |
| VS_FIXEDFILEINFO Value; |
| } VS_VERSIONINFO; |
| |
| typedef struct |
| { |
| WORD wLength; |
| WORD wValueLength; |
| WORD wType; |
| WCHAR szKey[13]; |
| } VARFILEINFO; |
| |
| typedef struct |
| { |
| WORD wLength; |
| WORD wValueLength; |
| WORD wType; |
| WCHAR szKey[13]; |
| DWORD Value; |
| } VAR; |
| |
| typedef struct |
| { |
| WORD wLength; |
| WORD wValueLength; |
| WORD wType; |
| WCHAR szKey[15]; |
| } STRINGFILEINFO; |
| |
| typedef struct |
| { |
| WORD wLength; |
| WORD wValueLength; |
| WORD wType; |
| WCHAR szKey[9]; |
| } STRINGTABLE; |
| |
| typedef struct |
| { |
| WORD wLength; |
| WORD wValueLength; |
| WORD wType; |
| } STRINGHDR; |
| |
| typedef struct |
| { |
| DWORD Size; |
| DWORD Signature; |
| DWORD HeaderVersion; |
| DWORD SkipBytes; |
| BYTE Data[168]; |
| } RESOURCE; |
| |
| #include <poppack.h> |
| |
| static struct _tagASSEMBLY |
| { |
| IMAGE_DOS_HEADER doshdr; |
| WORD unknown[32]; |
| IMAGE_NT_HEADERS32 nthdrs; |
| IMAGE_SECTION_HEADER text; |
| IMAGE_SECTION_HEADER rsrc; |
| IMAGE_SECTION_HEADER reloc; |
| BYTE pad[16]; |
| IMAGE_IMPORT_BY_NAME iat; |
| BYTE pad2[3]; |
| IMAGE_COR20_HEADER clrhdr; |
| WORD strongname[64]; |
| RESOURCE resource; |
| METADATAHDR metadatahdr; |
| METADATASTREAMHDR roothdr; |
| BYTE rootname[4]; |
| METADATASTREAMHDR stringshdr; |
| BYTE stringsname[12]; |
| METADATASTREAMHDR ushdr; |
| BYTE usname[4]; |
| METADATASTREAMHDR guidhdr; |
| BYTE guidname[8]; |
| METADATASTREAMHDR blobhdr; |
| BYTE blobname[8]; |
| METADATATABLESHDR tableshdr; |
| DWORD numrows[4]; |
| MODULETABLE modtable; |
| TYPEDEFTABLE tdtable; |
| ASSEMBLYTABLE asmtable; |
| MANIFESTRESTABLE manifestrestable; |
| WORD pad3; |
| BYTE stringheap[40]; |
| WORD usheap[4]; |
| WORD guidheap[8]; |
| WORD blobheap[82]; |
| IMAGE_IMPORT_DESCRIPTOR importdesc; |
| BYTE pad4[20]; |
| IMPORTLOOKUPTABLE importlookup; |
| HINTNAMETABLE hintnametable; |
| BYTE pad5[108]; |
| IMAGE_RESOURCE_DIRECTORY topresdir; |
| IMAGE_RESOURCE_DIRECTORY_ENTRY labelres; |
| IMAGE_RESOURCE_DIRECTORY res11dir; |
| IMAGE_RESOURCE_DIRECTORY_ENTRY label11res; |
| IMAGE_RESOURCE_DIRECTORY res10dir; |
| IMAGE_RESOURCE_DIRECTORY_ENTRY label10res; |
| IMAGE_RESOURCE_DATA_ENTRY resdata; |
| VS_VERSIONINFO verinfo; |
| VARFILEINFO varfileinfo; |
| VAR translation; |
| STRINGFILEINFO strfileinfo; |
| STRINGTABLE strtable; |
| STRINGHDR filedeschdr; |
| WCHAR filedesckey[17]; |
| WCHAR filedescval[2]; |
| STRINGHDR fileverhdr; |
| WCHAR fileverkey[13]; |
| WCHAR fileverval[8]; |
| STRINGHDR intnamehdr; |
| WCHAR intnamekey[13]; |
| WCHAR intnameval[10]; |
| STRINGHDR copyrighthdr; |
| WCHAR copyrightkey[15]; |
| WCHAR copyrightval[2]; |
| STRINGHDR orignamehdr; |
| WCHAR orignamekey[17]; |
| WCHAR orignameval[10]; |
| STRINGHDR prodverhdr; |
| WCHAR prodverkey[15]; |
| WCHAR prodverval[8]; |
| STRINGHDR asmverhdr; |
| WCHAR asmverkey[17]; |
| WCHAR asmverval[8]; |
| WORD pad6[182]; |
| RELOCATION relocation; |
| WORD pad7[250]; |
| } assembly = |
| { |
| /* IMAGE_DOS_HEADER */ |
| { |
| IMAGE_DOS_SIGNATURE, 144, 3, 0, 4, 0, 0xFFFF, 0, 0xB8, 0, 0, 0, 0x40, |
| 0, { 0 }, 0, 0, { 0 }, 0x80 |
| }, |
| /* binary to print "This program cannot be run in DOS mode." */ |
| { |
| 0x1F0E, 0x0EBA, 0xB400, 0xCD09, 0xB821, 0x4C01, 0x21CD, 0x6854, 0x7369, |
| 0x7020, 0x6F72, 0x7267, 0x6D61, 0x6320, 0x6E61, 0x6F6E, 0x2074, 0x6562, |
| 0x7220, 0x6E75, 0x6920, 0x206E, 0x4F44, 0x2053, 0x6F6D, 0x6564, 0x0D2E, |
| 0x0A0D, 0x0024, 0x0000, 0x0000, 0x0000 |
| }, |
| /* IMAGE_NT_HEADERS32 */ |
| { |
| IMAGE_NT_SIGNATURE, /* Signature */ |
| /* IMAGE_FILE_HEADER */ |
| { |
| IMAGE_FILE_MACHINE_I386, /* Machine */ |
| 3, /* NumberOfSections */ |
| 0x47EFDF09, /* TimeDateStamp */ |
| 0, /* PointerToSymbolTable */ |
| 0, /* NumberOfSymbols */ |
| 0xE0, /* SizeOfOptionalHeader */ |
| IMAGE_FILE_32BIT_MACHINE | IMAGE_FILE_LOCAL_SYMS_STRIPPED | |
| IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE | |
| IMAGE_FILE_DLL, /* Characteristics */ |
| }, |
| /* IMAGE_OPTIONAL_HEADER32 */ |
| { |
| IMAGE_NT_OPTIONAL_HDR32_MAGIC, /* Magic */ |
| 8, /* MajorLinkerVersion */ |
| 0, /* MinorLinkerVersion */ |
| 0x400, /* SizeOfCode */ |
| 0x600, /* SizeOfInitializedData */ |
| 0, /* SizeOfUninitializedData */ |
| 0x238E, /* AddressOfEntryPoint */ |
| 0x2000, /* BaseOfCode */ |
| 0x4000, /* BaseOfData */ |
| 0x400000, /* ImageBase */ |
| 0x2000, /* SectionAlignment */ |
| 0x200, /* FileAlignment */ |
| 4, /* MajorOperatingSystemVersion */ |
| 0, /* MinorOperatingSystemVersion */ |
| 0, /* MajorImageVersion */ |
| 0, /* MinorImageVersion */ |
| 4, /* MajorSubsystemVersion */ |
| 0, /* MinorSubsystemVersion */ |
| 0, /* Win32VersionValue */ |
| 0x8000, /* SizeOfImage */ |
| 0x200, /* SizeOfHeaders */ |
| 0xB576, /* CheckSum */ |
| IMAGE_SUBSYSTEM_WINDOWS_CUI, /* Subsystem */ |
| IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE | |
| IMAGE_DLLCHARACTERISTICS_NO_SEH | |
| IMAGE_DLLCHARACTERISTICS_NX_COMPAT, /* DllCharacteristics */ |
| 0x100000, /* SizeOfStackReserve */ |
| 0x1000, /* SizeOfStackCommit */ |
| 0x100000, /* SizeOfHeapReserve */ |
| 0x1000, /* SizeOfHeapCommit */ |
| 0, /* LoaderFlags */ |
| 0x10, /* NumberOfRvaAndSizes */ |
| /* IMAGE_DATA_DIRECTORY */ |
| { |
| { 0 }, /* Export Table */ |
| { 0x233C, 0x4F }, /* Import Table */ |
| { 0x4000, 0x298 }, /* Resource Table */ |
| { 0 }, /* Exception Table */ |
| { 0 }, /* Certificate Table */ |
| { 0x6000, 0xC }, /* Base Relocation Table */ |
| { 0 }, /* Debug */ |
| { 0 }, /* Copyright */ |
| { 0 }, /* Global Ptr */ |
| { 0 }, /* TLS Table */ |
| { 0 }, /* Load Config Table */ |
| { 0 }, /* Bound Import */ |
| { 0x2000, 8 }, /* IAT */ |
| { 0 }, /* Delay Import Descriptor */ |
| { 0x2008, 0x48 }, /* CLI Header */ |
| { 0 } /* Reserved */ |
| } |
| } |
| }, |
| /* IMAGE_SECTION_HEADER */ |
| { |
| ".text", /* Name */ |
| { 0x394 }, /* Misc.VirtualSize */ |
| 0x2000, /* VirtualAddress */ |
| 0x400, /* SizeOfRawData */ |
| 0x200, /* PointerToRawData */ |
| 0, /* PointerToRelocations */ |
| 0, /* PointerToLinenumbers */ |
| 0, /* NumberOfRelocations */ |
| 0, /* NumberOfLinenumbers */ |
| IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE | |
| IMAGE_SCN_CNT_CODE, /* Characteristics */ |
| }, |
| /* IMAGE_SECTION_HEADER */ |
| { |
| ".rsrc", /* Name */ |
| { 0x298 }, /* Misc.VirtualSize */ |
| 0x4000, /* VirtualAddress */ |
| 0x400, /* SizeOfRawData */ |
| 0x600, /* PointerToRawData */ |
| 0, /* PointerToRelocations */ |
| 0, /* PointerToLinenumbers */ |
| 0, /* NumberOfRelocations */ |
| 0, /* NumberOfLinenumbers */ |
| IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ, /* Characteristics */ |
| }, |
| /* IMAGE_SECTION_HEADER */ |
| { |
| ".reloc", /* Name */ |
| { 0xC }, /* Misc.VirtualSize */ |
| 0x6000, /* VirtualAddress */ |
| 0x200, /* SizeOfRawData */ |
| 0xA00, /* PointerToRawData */ |
| 0, /* PointerToRelocations */ |
| 0, /* PointerToLinenumbers */ |
| 0, /* NumberOfRelocations */ |
| 0, /* NumberOfLinenumbers */ |
| IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | |
| IMAGE_SCN_MEM_DISCARDABLE, /* Characteristics */ |
| }, |
| /* fill */ |
| { 0 }, |
| /* IMAGE_IMPORT_BY_NAME */ |
| { |
| 0x2370, /* Hint */ |
| { 0 } /* Name */ |
| }, |
| /* fill */ |
| { 0 }, |
| /* IMAGE_COR20_HEADER */ |
| { |
| 0x48, /* Cb */ |
| 2, /* MajorRuntimeVersion */ |
| 5, /* MinorRuntimeVersion */ |
| { 0x2188, 0x1B4 }, /* MetaData */ |
| COMIMAGE_FLAGS_ILONLY | COMIMAGE_FLAGS_STRONGNAMESIGNED, /* Flags */ |
| { 0 }, /* EntryPointToken */ |
| { 0x20D0, 0xB8 }, /* Resources */ |
| { 0x2050, 0x80 }, /* StrongNameSignature */ |
| { 0 }, /* CodeManagerTable */ |
| { 0 }, /* VTableFixups */ |
| { 0 }, /* ExportAddressTableJumps */ |
| { 0 } /* ManagedNativeHeader */ |
| }, |
| { 0xE496, 0x9A6E, 0xD95E, 0xA2A1, 0x5D72, 0x9CEF, 0x41E3, 0xD483, |
| 0xCB5C, 0x329A, 0x887C, 0xE18E, 0xE664, 0x2E1C, 0x0E61, 0xB361, |
| 0x8B88, 0xC8D0, 0x47A5, 0x9260, 0x6CC5, 0xE60F, 0x1F61, 0x1E3E, |
| 0xAFEE, 0x925A, 0xA084, 0x6B44, 0x2DC6, 0x8126, 0xEBC9, 0xD812, |
| 0xF3E9, 0xA3F3, 0xD0D5, 0x2C7F, 0x4592, 0xA0AF, 0x8B15, 0xD91E, |
| 0x693E, 0x7A4F, 0x5567, 0xC466, 0xC410, 0x3D29, 0xB25F, 0xCD6C, |
| 0x53EF, 0x0D29, 0x085A, 0xEC39, 0xE3BD, 0x58E0, 0x78F5, 0x0587, |
| 0xF8D8, 0x14E4, 0x77CE, 0xCCC9, 0x4DCF, 0x8A18, 0x90E8, 0x1A52 |
| }, |
| /* RESOURCE */ |
| { |
| 0xB4, /* Size */ |
| 0xBEEFCACE, /* Signature */ |
| 1, /* HeaderVersion */ |
| 0x91, /* SkipBytes */ |
| { 'l','S','y','s','t','e','m','.','R','e','s','o','u','r','c','e','s','.', |
| 'R','e','s','o','u','r','c','e','R','e','a','d','e','r',',',' ', |
| 'm','s','c','o','r','l','i','b',',',' ','V','e','r','s','i','o','n','=', |
| '2','.','0','.','0','.','0',',',' ','C','u','l','t','u','r','e','=', |
| 'n','e','u','t','r','a','l',',',' ','P','u','b','l','i','c','K','e','y','T','o','k','e','n','=', |
| 'b','7','7','a','5','c','5','6','1','9','3','4','e','0','8','9', |
| '#','S','y','s','t','e','m','.','R','e','s','o','u','r','c','e','s','.', |
| 'R','u','n','t','i','m','e','R','e','s','o','u','r','c','e','S','e','t', |
| 2,0,0,0,0,0,0,0,0,0,0,0,'P','A','D','P','A','D','P',180,0,0,0 |
| } |
| }, |
| /* METADATAHDR */ |
| { |
| 0x424A5342, /* Signature */ |
| 1, /* MajorVersion */ |
| 1, /* MinorVersion */ |
| 0, /* Reserved */ |
| 0xC, /* VersionLength */ |
| "v2.0.50727", /* Version */ |
| 0, /* Flags */ |
| 5 /* Streams */ |
| }, |
| /* METADATASTREAMHDR */ |
| { |
| 0x6C, /* Offset */ |
| 0x64, /* Size */ |
| }, |
| "#~\0\0", |
| /* METADATASTREAMHDR */ |
| { |
| 0xD0, /* Offset */ |
| 0x28, /* Size */ |
| }, |
| "#Strings\0\0\0\0", |
| /* METADATASTREAMHDR */ |
| { |
| 0xF8, /* Offset */ |
| 0x8, /* Size */ |
| }, |
| "#US\0", |
| /* METADATASTREAMHDR */ |
| { |
| 0x100, /* Offset */ |
| 0x10, /* Size */ |
| }, |
| "#GUID\0\0\0", |
| /* METADATASTREAMHDR */ |
| { |
| 0x110, /* Offset */ |
| 0xA4, /* Size */ |
| }, |
| "#Blob\0\0\0", |
| /* METADATATABLESHDR */ |
| { |
| 0, /* Reserved1 */ |
| 2, /* MajorVersion */ |
| 0, /* MinorVersion */ |
| 0, /* HeapOffsetSizes */ |
| 1, /* Reserved2 */ |
| { { 0 } }, /* MaskValid */ |
| { { 0 } } /* MaskSorted */ |
| }, |
| /* numrows */ |
| { 1, 1, 1, 1 }, |
| /* MODULETABLE */ |
| { |
| 0, /* Generation */ |
| 0xA, /* Name */ |
| 1, /* Mvid */ |
| 0, /* EncId */ |
| 0 /* EncBaseId */ |
| }, |
| /* TYPEDEFTABLE */ |
| { |
| 0, /* Flags */ |
| 0x1, /* Name */ |
| 0, /* Namespace */ |
| 0, /* Extends */ |
| 1, /* FieldList */ |
| 1 /* MethodList */ |
| }, |
| /* ASSEMBLYTABLE */ |
| { |
| 0x8004, /* HashAlgId */ |
| 1, /* MajorVersion */ |
| 0, /* MinorVersion */ |
| 0, /* BuildNumber */ |
| 0, /* RevisionNumber */ |
| 1, /* Flags */ |
| 1, /* PublicKey */ |
| 0x13, /* Name */ |
| 0 /* Culture */ |
| }, |
| /* MANIFESTRESTABLE */ |
| { |
| 0, /* Offset */ |
| 0x2, /* Flags */ |
| 0x18, /* Name */ |
| 0 /* Implementation */ |
| }, |
| /* pad */ |
| 0, |
| /* String heap */ |
| "\0<Module>\0wine.dll\0wine\0wine.resources\0\0", |
| /* US heap */ |
| { 0x0300, 0x0020 }, |
| /* GUID heap */ |
| { 0x86EF, 0x5B5A, 0x2C5E, 0x4F6D, 0xC2AB, 0x0A94, 0xD658, 0x31DA }, |
| /* BLOB heap */ |
| { 0x8000, 0x00A0, 0x0024, 0x0400, 0x0080, 0x9400, 0x0000, 0x0600, |
| 0x0002, 0x0000, 0x0024, 0x5200, 0x4153, 0x0031, 0x0004, 0x0100, |
| 0x0100, 0x2F00, 0x60E0, 0x4D76, 0x5E5C, 0x430A, 0x6FF3, 0x77D6, |
| 0x04CA, 0xF6AD, 0xF54D, 0x0AD2, 0x9FB6, 0x39C2, 0x2E66, 0xD30F, |
| 0x916F, 0x1826, 0xFB52, 0x78A0, 0x8262, 0x6902, 0xBD47, 0xAF30, |
| 0xBAB1, 0x29DA, 0xAA6D, 0xF189, 0x296A, 0x0F13, 0x4982, 0x531D, |
| 0x8283, 0x1343, 0x5A33, 0x5D36, 0xEB3F, 0x0863, 0xA771, 0x0679, |
| 0x4DFF, 0xD30A, 0xBEAD, 0x2A9F, 0x12A8, 0x4319, 0x5706, 0x333D, |
| 0x0CAC, 0xE80A, 0xFD99, 0xC82D, 0x3D3B, 0xBFFE, 0xF256, 0x25E3, |
| 0x1A12, 0xC116, 0x8936, 0xF237, 0x5F26, 0xC68A, 0x1E42, 0xCE41, |
| 0xC17C, 0x00C4 |
| }, |
| /* IMAGE_IMPORT_DESCRIPTOR */ |
| { |
| { 0x2364 }, /* OriginalFirstThunk */ |
| 0, /* TimeDateStamp */ |
| 0, /* ForwarderChain */ |
| 0x237E, /* Name */ |
| 0x2000, /* FirstThunk */ |
| }, |
| /* pad */ |
| { 0 }, |
| /* IMPORTLOOKUPTABLE */ |
| { |
| 0x2370, /* HintNameTableRVA */ |
| { 0 }, /* pad */ |
| }, |
| /* HINTNAMETABLE */ |
| { |
| 0, /* Hint */ |
| "_CorDllMain", /* Name */ |
| "mscoree.dll", /* Module */ |
| 0, /* Reserved */ |
| 0x25FF, /* EntryPoint */ |
| 0x402000 /* RVA */ |
| }, |
| /* pad to 0x600 */ |
| { 0 }, |
| /* IMAGE_RESOURCE_DIRECTORY */ |
| { |
| 0, /* Characteristics */ |
| 0, /* TimeDateStamp */ |
| 0, /* MajorVersion */ |
| 0, /* MinorVersion */ |
| 0, /* NumberOfNamedEntries */ |
| 1, /* NumberOfIdEntries */ |
| }, |
| /* IMAGE_RESOURCE_DIRECTORY_ENTRY */ |
| { { { 0 } }, { 0 } }, /* nameless unions initialized later */ |
| /* IMAGE_RESOURCE_DIRECTORY */ |
| { |
| 0, /* Characteristics */ |
| 0, /* TimeDateStamp */ |
| 0, /* MajorVersion */ |
| 0, /* MinorVersion */ |
| 0, /* NumberOfNamedEntries */ |
| 1, /* NumberOfIdEntries */ |
| }, |
| /* IMAGE_RESOURCE_DIRECTORY_ENTRY */ |
| { { { 0 } }, { 0 } }, /* nameless unions initialized later */ |
| /* IMAGE_RESOURCE_DIRECTORY */ |
| { |
| 0, /* Characteristics */ |
| 0, /* TimeDateStamp */ |
| 0, /* MajorVersion */ |
| 0, /* MinorVersion */ |
| 0, /* NumberOfNamedEntries */ |
| 1, /* NumberOfIdEntries */ |
| }, |
| /* IMAGE_RESOURCE_DIRECTORY_ENTRY */ |
| { { { 0 } }, { 0 } }, /* nameless unions initialized later */ |
| /* IMAGE_RESOURCE_DATA_ENTRY */ |
| { |
| 0x4058, /* OffsetToData */ |
| 0x23C, /* Size */ |
| 0, /* CodePage */ |
| 0, /* Reserved */ |
| }, |
| /* VS_VERSIONINFO */ |
| { |
| 0x23C, /* wLength */ |
| 0x34, /* wValueLength */ |
| 0, /* wType */ |
| { 'V','S','_','V','E','R','S','I','O','N','_','I','N','F','O',0,0 }, /* szKey */ |
| /* VS_FIXEDFILEINFO */ |
| { |
| VS_FFI_SIGNATURE, /* dwSignature */ |
| VS_FFI_STRUCVERSION, /* dwStrucVersion */ |
| 0x10000, /* dwFileVersionMS */ |
| 0x00000, /* dwFileVersionLS */ |
| 0x10000, /* dwProductVersionMS */ |
| 0x00000, /* dwProductVersionLS */ |
| VS_FFI_FILEFLAGSMASK, /* dwFileFlagsMask */ |
| 0x0, /* dwFileFlags */ |
| VOS__WINDOWS32, /* dwFileOS */ |
| VFT_DLL, /* dwFileType */ |
| VFT2_UNKNOWN, /* dwFileSubtype */ |
| 0, /* dwFileDateMS */ |
| 0, /* dwFileDateLS */ |
| }, |
| }, |
| /* VARFILEINFO */ |
| { |
| 0x44, /* wLength */ |
| 0, /* wValueLength */ |
| 1, /* wType */ |
| { 'V','a','r','F','i','l','e','I','n','f','o',0,0 } /* szKey */ |
| }, |
| /* VAR */ |
| { |
| 0x24, /* wLength */ |
| 0x4, /* wValueLength */ |
| 0, /* wType */ |
| { 'T','r','a','n','s','l','a','t','i','o','n',0,0 }, /* szKey */ |
| 0x4B00000, /* Value */ |
| }, |
| /* STRINGFILEINFO */ |
| { |
| 0x19C, /* wLength */ |
| 0, /* wValueLength */ |
| 1, /* wType */ |
| { 'S','t','r','i','n','g','F','i','l','e','I','n','f','o',0 }, /* szKey */ |
| }, |
| /* STRINGTABLE */ |
| { |
| 0x178, /* wLength */ |
| 0, /* wValueLength */ |
| 1, /* wType */ |
| { '0','0','0','0','0','4','b','0',0 }, /* szKey */ |
| }, |
| /* STRINGHDR */ |
| { |
| 0x2C, /* wLength */ |
| 2, /* wValueLength */ |
| 1, /* wType */ |
| }, |
| { 'F','i','l','e','D','e','s','c','r','i','p','t','i','o','n',0,0 }, /* szKey */ |
| { ' ',0 }, /* szValue */ |
| /* STRINGHDR */ |
| { |
| 0x30, /* wLength */ |
| 8, /* wValueLength */ |
| 1, /* wType */ |
| }, |
| { 'F','i','l','e','V','e','r','s','i','o','n',0,0 }, /* szKey */ |
| { '1','.','0','.','0','.','0',0 }, /* szValue */ |
| /* STRINGHDR */ |
| { |
| 0x34, /* wLength */ |
| 9, /* wValueLength */ |
| 1, /* wType */ |
| }, |
| { 'I','n','t','e','r','n','a','l','N','a','m','e',0 }, /* szKey */ |
| { 'w','i','n','e','.','d','l','l',0 }, /* szValue */ |
| /* STRINGHDR */ |
| { |
| 0x28, /* wLength */ |
| 2, /* wValueLength */ |
| 1, /* wType */ |
| }, |
| { 'L','e','g','a','l','C','o','p','y','r','i','g','h','t',0 }, /* szKey */ |
| { ' ',0 }, /* szValue */ |
| /* STRINGHDR */ |
| { |
| 0x3C, /* wLength */ |
| 9, /* wValueLength */ |
| 1, /* wType */ |
| }, |
| { 'O','r','i','g','i','n','a','l','F','i','l','e','n','a','m','e',0 }, /* szKey */ |
| { 'w','i','n','e','.','d','l','l',0,0 }, /* szValue */ |
| /* STRINGHDR */ |
| { |
| 0x34, /* wLength */ |
| 8, /* wValueLength */ |
| 1, /* wType */ |
| }, |
| { 'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0 }, /* szKey */ |
| { '1','.','0','.','0','.','0',0 }, /* szValue */ |
| /* STRINGHDR */ |
| { |
| 0x38, /* wLength */ |
| 8, /* wValueLength */ |
| 1, /* wType */ |
| }, |
| { 'A','s','s','e','m','b','l','y',' ','V','e','r','s','i','o','n',0 }, /* szKey */ |
| { '1','.','0','.','0','.','0',0 }, /* szValue */ |
| { 0 }, /* pad */ |
| /* RELOCATION */ |
| { |
| 0x2000, /* PageRVA */ |
| 0xC, /* Size */ |
| 0x3390, /* Relocation */ |
| }, |
| { 0 } |
| }; |
| |
| |
| static HRESULT (WINAPI *pCreateAssemblyCache)(IAssemblyCache **ppAsmCache, |
| DWORD dwReserved); |
| static HRESULT (WINAPI *pGetCachePath)(ASM_CACHE_FLAGS dwCacheFlags, |
| LPWSTR pwzCachePath, PDWORD pcchPath); |
| static HRESULT (WINAPI *pLoadLibraryShim)(LPCWSTR szDllName, LPCWSTR szVersion, |
| LPVOID pvReserved, HMODULE *phModDll); |
| |
| static BOOL init_functionpointers(void) |
| { |
| HRESULT hr; |
| HMODULE hfusion; |
| HMODULE hmscoree; |
| |
| static const WCHAR szFusion[] = {'f','u','s','i','o','n','.','d','l','l',0}; |
| |
| hmscoree = LoadLibraryA("mscoree.dll"); |
| if (!hmscoree) |
| { |
| win_skip("mscoree.dll not available\n"); |
| return FALSE; |
| } |
| |
| pLoadLibraryShim = (void *)GetProcAddress(hmscoree, "LoadLibraryShim"); |
| if (!pLoadLibraryShim) |
| { |
| win_skip("LoadLibraryShim not available\n"); |
| FreeLibrary(hmscoree); |
| return FALSE; |
| } |
| |
| hr = pLoadLibraryShim(szFusion, NULL, NULL, &hfusion); |
| if (FAILED(hr)) |
| { |
| win_skip("fusion.dll not available\n"); |
| FreeLibrary(hmscoree); |
| return FALSE; |
| } |
| |
| pCreateAssemblyCache = (void *)GetProcAddress(hfusion, "CreateAssemblyCache"); |
| pGetCachePath = (void *)GetProcAddress(hfusion, "GetCachePath"); |
| |
| if (!pCreateAssemblyCache || !pGetCachePath) |
| { |
| win_skip("fusion.dll not implemented\n"); |
| return FALSE; |
| } |
| |
| FreeLibrary(hmscoree); |
| return TRUE; |
| } |
| |
| static void create_file_data(LPCSTR name, LPCSTR data, DWORD size) |
| { |
| HANDLE file; |
| DWORD written; |
| |
| file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); |
| ok(file != INVALID_HANDLE_VALUE, "Failure to open file %s\n", name); |
| WriteFile(file, data, strlen(data), &written, NULL); |
| |
| if (size) |
| { |
| SetFilePointer(file, size, NULL, FILE_BEGIN); |
| SetEndOfFile(file); |
| } |
| |
| CloseHandle(file); |
| } |
| |
| #define create_file(name, size) create_file_data(name, name, size) |
| |
| static void create_assembly(LPCSTR file) |
| { |
| HANDLE hfile; |
| DWORD written; |
| |
| /* nameless unions initialized here */ |
| assembly.tableshdr.MaskValid.u.HighPart = 0x101; |
| assembly.tableshdr.MaskValid.u.LowPart = 0x00000005; |
| assembly.tableshdr.MaskSorted.u.HighPart = 0x1600; |
| assembly.tableshdr.MaskSorted.u.LowPart = 0x3301FA00; |
| U(assembly.labelres).Name = 0x10; |
| U2(assembly.labelres).OffsetToData = 0x80000018; |
| U(assembly.label11res).Name = 0x1; |
| U2(assembly.label11res).OffsetToData = 0x80000030; |
| U(assembly.label10res).Name = 0x0; |
| U2(assembly.label10res).OffsetToData = 0x48; |
| |
| hfile = CreateFileA(file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); |
| |
| WriteFile(hfile, &assembly, sizeof(ASSEMBLY), &written, NULL); |
| CloseHandle(hfile); |
| } |
| |
| static BOOL check_dotnet20(void) |
| { |
| IAssemblyCache *cache; |
| HRESULT hr; |
| BOOL ret = FALSE; |
| ULONG disp; |
| |
| static const WCHAR winedll[] = {'w','i','n','e','.','d','l','l',0}; |
| |
| create_assembly("wine.dll"); |
| |
| hr = pCreateAssemblyCache(&cache, 0); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| |
| hr = IAssemblyCache_InstallAssembly(cache, 0, winedll, NULL); |
| if (hr == S_OK) |
| ret = TRUE; |
| else if (hr == CLDB_E_FILE_OLDVER) |
| win_skip("Tests can't be run on older .NET version (.NET 1.1)\n"); |
| else if (hr == E_ACCESSDENIED) |
| skip("Not enough rights to install an assembly\n"); |
| else |
| ok(0, "Expected S_OK, got %08x\n", hr); |
| |
| DeleteFileA("wine.dll"); |
| IAssemblyCache_UninstallAssembly(cache, 0, winedll, NULL, &disp); |
| IAssemblyCache_Release(cache); |
| return ret; |
| } |
| |
| static void test_CreateAssemblyCache(void) |
| { |
| IAssemblyCache *cache; |
| HRESULT hr; |
| |
| /* NULL ppAsmCache */ |
| hr = pCreateAssemblyCache(NULL, 0); |
| ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); |
| |
| /* dwReserved is non-zero */ |
| hr = pCreateAssemblyCache(&cache, 42); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| |
| IAssemblyCache_Release(cache); |
| } |
| |
| static void test_CreateAssemblyCacheItem(void) |
| { |
| IAssemblyCache *cache; |
| IAssemblyCacheItem *item; |
| HRESULT hr; |
| |
| static const WCHAR wine[] = {'w','i','n','e',0}; |
| |
| hr = pCreateAssemblyCache(&cache, 0); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| |
| hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 0, NULL, NULL, NULL); |
| ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); |
| |
| hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 0, NULL, &item, NULL); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| IAssemblyCacheItem_Release(item); |
| |
| hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 0, NULL, &item, wine); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| IAssemblyCacheItem_Release(item); |
| |
| hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 1, (void *)0xdeadbeef, &item, NULL); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| IAssemblyCacheItem_Release(item); |
| |
| hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 1, NULL, &item, NULL); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| IAssemblyCacheItem_Release(item); |
| |
| hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 0, (void *)0xdeadbeef, &item, NULL); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| IAssemblyCacheItem_Release(item); |
| |
| IAssemblyCache_Release(cache); |
| } |
| |
| static void test_InstallAssembly(void) |
| { |
| IAssemblyCache *cache; |
| HRESULT hr; |
| ULONG disp; |
| DWORD attr; |
| char dllpath[MAX_PATH]; |
| |
| static const WCHAR empty[] = {0}; |
| static const WCHAR noext[] = {'f','i','l','e',0}; |
| static const WCHAR badext[] = {'f','i','l','e','.','b','a','d',0}; |
| static const WCHAR dllext[] = {'f','i','l','e','.','d','l','l',0}; |
| static const WCHAR exeext[] = {'f','i','l','e','.','e','x','e',0}; |
| static const WCHAR testdll[] = {'t','e','s','t','.','d','l','l',0}; |
| static const WCHAR winedll[] = {'w','i','n','e','.','d','l','l',0}; |
| static const WCHAR wine[] = {'w','i','n','e',0}; |
| |
| create_file("test.dll", 100); |
| create_assembly("wine.dll"); |
| |
| hr = pCreateAssemblyCache(&cache, 0); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| |
| /* NULL pszManifestFilePath */ |
| hr = IAssemblyCache_InstallAssembly(cache, 0, NULL, NULL); |
| ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); |
| |
| /* empty pszManifestFilePath */ |
| hr = IAssemblyCache_InstallAssembly(cache, 0, empty, NULL); |
| ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); |
| |
| /* pszManifestFilePath has no extension */ |
| hr = IAssemblyCache_InstallAssembly(cache, 0, noext, NULL); |
| ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_NAME), |
| "Expected HRESULT_FROM_WIN32(ERROR_INVALID_NAME), got %08x\n", hr); |
| |
| /* pszManifestFilePath has bad extension */ |
| hr = IAssemblyCache_InstallAssembly(cache, 0, badext, NULL); |
| ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_NAME), |
| "Expected HRESULT_FROM_WIN32(ERROR_INVALID_NAME), got %08x\n", hr); |
| |
| /* pszManifestFilePath has dll extension */ |
| hr = IAssemblyCache_InstallAssembly(cache, 0, dllext, NULL); |
| ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), |
| "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr); |
| |
| /* pszManifestFilePath has exe extension */ |
| hr = IAssemblyCache_InstallAssembly(cache, 0, exeext, NULL); |
| ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), |
| "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr); |
| |
| /* empty file */ |
| hr = IAssemblyCache_InstallAssembly(cache, 0, testdll, NULL); |
| ok(hr == COR_E_ASSEMBLYEXPECTED, |
| "Expected COR_E_ASSEMBLYEXPECTED, got %08x\n", hr); |
| |
| /* wine assembly */ |
| hr = IAssemblyCache_InstallAssembly(cache, 0, winedll, NULL); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| |
| GetWindowsDirectoryA(dllpath, MAX_PATH); |
| strcat(dllpath, "\\assembly\\GAC_MSIL\\wine\\\\1.0.0.0__2d03617b1c31e2f5\\wine.dll"); |
| |
| attr = GetFileAttributesA(dllpath); |
| ok(attr != INVALID_FILE_ATTRIBUTES, "Expected assembly to exist\n"); |
| |
| /* uninstall the assembly from the GAC */ |
| disp = 0xf00dbad; |
| hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, |
| "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp); |
| |
| attr = GetFileAttributesA(dllpath); |
| ok(attr == INVALID_FILE_ATTRIBUTES, "Expected assembly not to exist\n"); |
| |
| disp = 0xf00dbad; |
| hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp); |
| ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); |
| ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED, |
| "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED, got %d\n", disp); |
| |
| DeleteFileA("test.dll"); |
| DeleteFileA("wine.dll"); |
| IAssemblyCache_Release(cache); |
| } |
| |
| #define INIT_ASM_INFO() \ |
| ZeroMemory(&info, sizeof(ASSEMBLY_INFO)); \ |
| info.cbAssemblyInfo = sizeof(ASSEMBLY_INFO); \ |
| info.pszCurrentAssemblyPathBuf = path; \ |
| info.cchBuf = MAX_PATH; \ |
| path[0] = '\0'; |
| |
| static void test_QueryAssemblyInfo(void) |
| { |
| IAssemblyCache *cache; |
| ASSEMBLY_INFO info; |
| WCHAR path[MAX_PATH]; |
| WCHAR asmpath[MAX_PATH]; |
| WCHAR name[MAX_PATH]; |
| HRESULT hr; |
| DWORD size; |
| ULONG disp; |
| |
| static const WCHAR empty[] = {0}; |
| static const WCHAR commasep[] = {',',' ',0}; |
| static const WCHAR winedll[] = {'w','i','n','e','.','d','l','l',0}; |
| static const WCHAR wine[] = {'w','i','n','e',0}; |
| static const WCHAR ver[] = { |
| 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0}; |
| static const WCHAR otherver[] = { |
| 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','0','0','0','0','0',0}; |
| static const WCHAR badver[] = { |
| 'V','e','r','s','i','o','n','=','1','.','0','.','0','.','1',0}; |
| static const WCHAR culture[] = { |
| 'C','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0}; |
| static const WCHAR badculture[] = { |
| 'C','u','l','t','u','r','e','=','e','n',0}; |
| static const WCHAR pubkey[] = { |
| 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=', |
| '2','d','0','3','6','1','7','b','1','c','3','1','e','2','f','5',0}; |
| static const WCHAR badpubkey[] = { |
| 'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=', |
| 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',0}; |
| static const WCHAR badprop[] = {'B','a','d','P','r','o','p','=','b','u','h',0}; |
| static const WCHAR msil[] = { |
| '_','M','S','I','L','\\','w','i','n','e','\\', |
| '1','.','0','.','0','.','0','_','_','2','d','0','3','6','1','7','b', |
| '1','c','3','1','e','2','f','5','\\',0}; |
| static const WCHAR wine2[] = { |
| 'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','1',',', |
| 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=', |
| '2','d','0','3','6','1','7','b','1','c','3','1','e','2','f','5',',', |
| 'c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0}; |
| static const WCHAR nullpublickey[] = { |
| 'm','s','c','o','r','l','i','b','.','d','l','l',',','v','e','r','s','i','o','n','=','0','.','0','.', |
| '0','.','0',',','c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',',', |
| 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','n','u','l','l',0}; |
| static const WCHAR nullpublickey1[] = { |
| 'm','s','c','o','r','l','i','b','.','d','l','l',',', |
| 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','n','u','L','l',0}; |
| |
| size = MAX_PATH; |
| hr = pGetCachePath(ASM_CACHE_GAC, asmpath, &size); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| |
| lstrcatW(asmpath, msil); |
| lstrcatW(asmpath, winedll); |
| |
| create_assembly("wine.dll"); |
| |
| hr = pCreateAssemblyCache(&cache, 0); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| |
| /* assembly not installed yet */ |
| INIT_ASM_INFO(); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, wine, &info); |
| ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), |
| "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.uliAssemblySizeInKB.u.LowPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), |
| "Assembly path was changed\n"); |
| ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf); |
| |
| hr = IAssemblyCache_InstallAssembly(cache, 0, winedll, NULL); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| |
| /* NULL pszAssemblyName */ |
| INIT_ASM_INFO(); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE, |
| NULL, &info); |
| ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.uliAssemblySizeInKB.u.LowPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), |
| "Assembly path was changed\n"); |
| ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf); |
| |
| /* empty pszAssemblyName */ |
| INIT_ASM_INFO(); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE, |
| empty, &info); |
| ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.uliAssemblySizeInKB.u.LowPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), |
| "Assembly path was changed\n"); |
| ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf); |
| |
| /* no dwFlags */ |
| INIT_ASM_INFO(); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, wine, &info); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.uliAssemblySizeInKB.u.LowPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), |
| "Wrong assembly path returned\n"); |
| ok(info.cchBuf == lstrlenW(asmpath) + 1, |
| "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); |
| |
| /* pwzCachePath is full filename */ |
| INIT_ASM_INFO(); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, winedll, &info); |
| ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), |
| "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.uliAssemblySizeInKB.u.LowPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), |
| "Assembly path was changed\n"); |
| ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf); |
| |
| /* NULL pAsmInfo, QUERYASMINFO_FLAG_VALIDATE */ |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE, |
| wine, NULL); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| |
| /* NULL pAsmInfo, QUERYASMINFO_FLAG_GETSIZE */ |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| wine, NULL); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| |
| /* info.cbAssemblyInfo is 0 */ |
| INIT_ASM_INFO(); |
| info.cbAssemblyInfo = 0; |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE, |
| wine, &info); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.uliAssemblySizeInKB.u.LowPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), |
| "Wrong assembly path returned\n"); |
| ok(info.cchBuf == lstrlenW(asmpath) + 1, |
| "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); |
| |
| /* info.cbAssemblyInfo is 1 */ |
| INIT_ASM_INFO(); |
| info.cbAssemblyInfo = 1; |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE, |
| wine, &info); |
| ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == 1, "Expected 1, got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.uliAssemblySizeInKB.u.LowPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), |
| "Assembly path was changed\n"); |
| ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf); |
| |
| /* info.cbAssemblyInfo is > sizeof(ASSEMBLY_INFO) */ |
| INIT_ASM_INFO(); |
| info.cbAssemblyInfo = sizeof(ASSEMBLY_INFO) * 2; |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| wine, &info); |
| ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO) * 2, |
| "Expected sizeof(ASSEMBLY_INFO) * 2, got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.uliAssemblySizeInKB.u.LowPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), |
| "Assembly path was changed\n"); |
| ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf); |
| |
| /* QUERYASMINFO_FLAG_GETSIZE */ |
| INIT_ASM_INFO(); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| wine, &info); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| todo_wine |
| { |
| ok((info.uliAssemblySizeInKB.u.LowPart == 4), |
| "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| } |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), |
| "Wrong assembly path returned\n"); |
| ok(info.cchBuf == lstrlenW(asmpath) + 1, |
| "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); |
| |
| /* QUERYASMINFO_FLAG_GETSIZE and QUERYASMINFO_FLAG_VALIDATE */ |
| INIT_ASM_INFO(); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE | |
| QUERYASMINFO_FLAG_VALIDATE,wine, &info); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| todo_wine |
| { |
| ok((info.uliAssemblySizeInKB.u.LowPart == 4), |
| "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| } |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), |
| "Wrong assembly path returned\n"); |
| ok(info.cchBuf == lstrlenW(asmpath) + 1, |
| "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); |
| |
| /* info.pszCurrentAssemblyPathBuf is NULL */ |
| INIT_ASM_INFO(); |
| info.pszCurrentAssemblyPathBuf = NULL; |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| wine, &info); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(hr == E_NOT_SUFFICIENT_BUFFER, "Expected E_NOT_SUFFICIENT_BUFFER, got %08x\n", hr); |
| todo_wine |
| { |
| ok((info.uliAssemblySizeInKB.u.LowPart == 4), |
| "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| } |
| ok(info.cchBuf == lstrlenW(asmpath) + 1, |
| "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); |
| |
| /* info.cchBuf is exactly size of asmpath */ |
| INIT_ASM_INFO(); |
| info.cchBuf = lstrlenW(asmpath); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| wine, &info); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), |
| "Assembly path was changed\n"); |
| ok(hr == E_NOT_SUFFICIENT_BUFFER, "Expected E_NOT_SUFFICIENT_BUFFER, got %08x\n", hr); |
| todo_wine |
| { |
| ok((info.uliAssemblySizeInKB.u.LowPart == 4), |
| "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| } |
| ok(info.cchBuf == lstrlenW(asmpath) + 1, |
| "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); |
| |
| /* info.cchBuf has room for NULL-terminator */ |
| INIT_ASM_INFO(); |
| info.cchBuf = lstrlenW(asmpath) + 1; |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| wine, &info); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.cchBuf == lstrlenW(asmpath) + 1, |
| "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); |
| todo_wine |
| { |
| ok((info.uliAssemblySizeInKB.u.LowPart == 4), |
| "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| } |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), |
| "Wrong assembly path returned\n"); |
| |
| /* display name is "wine, Version=1.0.0.0" */ |
| INIT_ASM_INFO(); |
| lstrcpyW(name, wine); |
| lstrcatW(name, commasep); |
| lstrcatW(name, ver); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| name, &info); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| todo_wine |
| { |
| ok((info.uliAssemblySizeInKB.u.LowPart == 4), |
| "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| } |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), |
| "Wrong assembly path returned\n"); |
| ok(info.cchBuf == lstrlenW(asmpath) + 1, |
| "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); |
| |
| /* short buffer, QUERYASMINFO_FLAG_VALIDATE */ |
| memset(&info, 0, sizeof(info)); |
| lstrcpyW(name, wine); |
| lstrcatW(name, commasep); |
| lstrcatW(name, otherver); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE, |
| name, &info); |
| ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, "got %08x\n", info.dwAssemblyFlags); |
| |
| /* short buffer, QUERYASMINFO_FLAG_GETSIZE */ |
| memset(&info, 0, sizeof(info)); |
| lstrcpyW(name, wine); |
| lstrcatW(name, commasep); |
| lstrcatW(name, otherver); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| name, &info); |
| ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, "got %08x\n", info.dwAssemblyFlags); |
| |
| /* display name is "wine, Version=1.0.0.00000" */ |
| INIT_ASM_INFO(); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| name, &info); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| todo_wine |
| { |
| ok((info.uliAssemblySizeInKB.u.LowPart == 4), |
| "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| } |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), |
| "Wrong assembly path returned\n"); |
| ok(info.cchBuf == lstrlenW(asmpath) + 1, |
| "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); |
| |
| /* display name is "wine, Version=1.0.0.1", versions don't match */ |
| INIT_ASM_INFO(); |
| lstrcpyW(name, wine); |
| lstrcatW(name, commasep); |
| lstrcatW(name, badver); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| name, &info); |
| ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), |
| "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.uliAssemblySizeInKB.u.LowPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), |
| "Assembly path was changed\n"); |
| ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf); |
| |
| /* display name is "wine,version=1.0.0.1,publicKeyToken=2d03617b1c31e2f5,culture=neutral" */ |
| INIT_ASM_INFO(); |
| lstrcpyW(name, wine2); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| name, &info); |
| ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), |
| "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.uliAssemblySizeInKB.u.LowPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), |
| "Assembly path was changed\n"); |
| ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf); |
| |
| /* display name is "mscorlib.dll,version=0.0.0.0,culture=neutral,publicKeyToken=null" */ |
| INIT_ASM_INFO(); |
| lstrcpyW(name, nullpublickey); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, name, &info); |
| ok(hr == FUSION_E_PRIVATE_ASM_DISALLOWED, "got %08x\n", hr); |
| |
| /* display name is "mscorlib.dll,publicKeyToken=nuLl" */ |
| INIT_ASM_INFO(); |
| lstrcpyW(name, nullpublickey1); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, name, &info); |
| ok(hr == FUSION_E_PRIVATE_ASM_DISALLOWED, "got %08x\n", hr); |
| |
| /* display name is "wine, Culture=neutral" */ |
| INIT_ASM_INFO(); |
| lstrcpyW(name, wine); |
| lstrcatW(name, commasep); |
| lstrcatW(name, culture); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| name, &info); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| todo_wine |
| { |
| ok((info.uliAssemblySizeInKB.u.LowPart == 4), |
| "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| } |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), |
| "Wrong assembly path returned\n"); |
| ok(info.cchBuf == lstrlenW(asmpath) + 1, |
| "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); |
| |
| /* display name is "wine, Culture=en", cultures don't match */ |
| INIT_ASM_INFO(); |
| lstrcpyW(name, wine); |
| lstrcatW(name, commasep); |
| lstrcatW(name, badculture); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| name, &info); |
| ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), |
| "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr); |
| ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.uliAssemblySizeInKB.u.LowPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), |
| "Assembly path was changed\n"); |
| ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf); |
| |
| /* display name is "wine, PublicKeyTokens=2d03617b1c31e2f5" */ |
| INIT_ASM_INFO(); |
| lstrcpyW(name, wine); |
| lstrcatW(name, commasep); |
| lstrcatW(name, pubkey); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| name, &info); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| todo_wine |
| { |
| ok((info.uliAssemblySizeInKB.u.LowPart == 4), |
| "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| } |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), |
| "Wrong assembly path returned\n"); |
| ok(info.cchBuf == lstrlenW(asmpath) + 1, |
| "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); |
| |
| /* display name is "wine, PublicKeyToken=aaaaaaaaaaaaaaaa", pubkeys don't match */ |
| INIT_ASM_INFO(); |
| lstrcpyW(name, wine); |
| lstrcatW(name, commasep); |
| lstrcatW(name, badpubkey); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| name, &info); |
| ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), |
| "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == 0, "Expected 0, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| ok(info.uliAssemblySizeInKB.u.LowPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), |
| "Assembly path was changed\n"); |
| ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf); |
| |
| /* display name is "wine, BadProp=buh", bad property */ |
| INIT_ASM_INFO(); |
| lstrcpyW(name, wine); |
| lstrcatW(name, commasep); |
| lstrcatW(name, badprop); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, |
| name, &info); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| ok(info.uliAssemblySizeInKB.u.HighPart == 0, |
| "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); |
| todo_wine |
| { |
| ok((info.uliAssemblySizeInKB.u.LowPart == 4), |
| "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); |
| } |
| ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), |
| "Wrong assembly path returned\n"); |
| ok(info.cchBuf == lstrlenW(asmpath) + 1, |
| "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); |
| |
| /* no flags, display name is "wine, Version=1.0.0.0" */ |
| INIT_ASM_INFO(); |
| info.pszCurrentAssemblyPathBuf = NULL; |
| info.cchBuf = 0; |
| lstrcpyW(name, wine); |
| lstrcatW(name, commasep); |
| lstrcatW(name, ver); |
| hr = IAssemblyCache_QueryAssemblyInfo(cache, 0, name, &info); |
| ok(hr == E_NOT_SUFFICIENT_BUFFER, "Expected E_NOT_SUFFICIENT_BUFFER, got %08x\n", hr); |
| ok(info.cbAssemblyInfo == sizeof(ASSEMBLY_INFO), |
| "Expected sizeof(ASSEMBLY_INFO), got %d\n", info.cbAssemblyInfo); |
| ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, |
| "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); |
| |
| /* uninstall the assembly from the GAC */ |
| disp = 0xf00dbad; |
| hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp); |
| ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); |
| ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, |
| "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp); |
| |
| DeleteFileA("test.dll"); |
| DeleteFileA("wine.dll"); |
| IAssemblyCache_Release(cache); |
| } |
| |
| START_TEST(asmcache) |
| { |
| if (!init_functionpointers()) |
| return; |
| |
| if (!check_dotnet20()) |
| return; |
| |
| test_CreateAssemblyCache(); |
| test_CreateAssemblyCacheItem(); |
| test_InstallAssembly(); |
| test_QueryAssemblyInfo(); |
| } |