public bool Read(CLIFile pFile) { Signature = pFile.ReadUInt32(); MajorVersion = pFile.ReadUInt16(); MinorVersion = pFile.ReadUInt16(); Reserved = pFile.ReadUInt32(); VersionLength = pFile.ReadUInt32(); Version = pFile.ReadBytes((int)VersionLength); Flags = pFile.ReadUInt16(); StreamCount = pFile.ReadUInt16(); Streams = new CLIMetadataStreamHeader[StreamCount]; for (int index = 0; index < Streams.Length; ++index) { Streams[index] = new CLIMetadataStreamHeader(); Streams[index].Read(pFile); } return true; }
public CLIFile(string pReferenceName, byte[] pData) { ReferenceName = pReferenceName; mData = pData; DOS.Read(this); mCursor = (int)DOS.NextHeaderOffset; PE.Read(this); Optional.Read(this); Sections = new SectionHeader[PE.NumberOfSections]; for (int index = 0; index < Sections.Length; ++index) { Sections[index] = new SectionHeader(); Sections[index].Read(this); } DataDirectory headerDataDirectory = Optional.DataDirectories[14]; SectionHeader headerSectionHeader = GetSection(headerDataDirectory.VirtualAddress); mCursor = (int)(headerSectionHeader.PointerToRawData + (headerDataDirectory.VirtualAddress - headerSectionHeader.VirtualAddress)); CLI.Read(this); SectionHeader metadataSectionHeader = GetSection(CLI.Metadata.VirtualAddress); CLIMetadataHeaderOffset = metadataSectionHeader.PointerToRawData + (CLI.Metadata.VirtualAddress - metadataSectionHeader.VirtualAddress); mCursor = (int)CLIMetadataHeaderOffset; CLIMetadata.Read(this); mCursor = (int)CLIMetadataHeaderOffset; foreach (CLIMetadataStreamHeader streamHeader in CLIMetadata.Streams) { switch (streamHeader.Name) { case "#~": Tables = streamHeader; break; case "#Strings": Strings = streamHeader; break; case "#US": US = streamHeader; break; case "#GUID": GUID = streamHeader; break; case "#Blob": Blob = streamHeader; break; default: throw new BadImageFormatException("Invalid CLIMetadataHeader Stream"); } } mCursor = (int)(CLIMetadataHeaderOffset + Tables.Offset); CLIMetadataTables.Read(this); Array.ForEach(sMetadataLoaders, l => l.Initializer(this)); Array.ForEach(sMetadataLoaders, l => l.Loader(this)); Array.ForEach(sMetadataLoaders, l => l.Linker(this)); Array.ForEach(MethodDefTable, m => { if (m.Body != null) m.Body.LinkData(m); }); Array.ForEach(TypeDefTable, t => t.GenericParamList.Sort((p1, p2) => p1.Number.CompareTo(p2.Number))); Array.ForEach(MethodDefTable, m => m.GenericParamList.Sort((p1, p2) => p1.Number.CompareTo(p2.Number))); }