예제 #1
0
			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;
			}
예제 #2
0
		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)));
		}