コード例 #1
0
ファイル: CodeReader.cs プロジェクト: fugaku/scriptsharp
		public void MoveTo (int rva)
		{
			if (!IsInSection (rva)) {
				code_section = reader.image.GetSectionAtVirtualAddress ((uint) rva);
				Reset (code_section.Data);
			}

			base.position = rva - (int) code_section.VirtualAddress;
		}
コード例 #2
0
ファイル: StringHeap.cs プロジェクト: fugaku/scriptsharp
		public StringHeap (Section section, uint start, uint size)
			: base (section, start, size)
		{
		}
コード例 #3
0
ファイル: GuidHeap.cs プロジェクト: fugaku/scriptsharp
		public GuidHeap (Section section, uint start, uint size)
			: base (section, start, size)
		{
		}
コード例 #4
0
ファイル: ImageReader.cs プロジェクト: fugaku/scriptsharp
		void ReadMetadataStream (Section section)
		{
			// Offset		4
			uint start = metadata.VirtualAddress - section.VirtualAddress + ReadUInt32 (); // relative to the section start

			// Size			4
			uint size = ReadUInt32 ();

			var name = ReadAlignedString (16);
			switch (name) {
			case "#~":
			case "#-":
				image.TableHeap = new TableHeap (section, start, size);
				break;
			case "#Strings":
				image.StringHeap = new StringHeap (section, start, size);
				break;
			case "#Blob":
				image.BlobHeap = new BlobHeap (section, start, size);
				break;
			case "#GUID":
				image.GuidHeap = new GuidHeap (section, start, size);
				break;
			case "#US":
				image.UserStringHeap = new UserStringHeap (section, start, size);
				break;
			}
		}
コード例 #5
0
ファイル: ImageReader.cs プロジェクト: fugaku/scriptsharp
		void ReadSectionData (Section section)
		{
			var position = BaseStream.Position;

			MoveTo (section.PointerToRawData);

			var length = (int) section.SizeOfRawData;
			var data = new byte [length];
			int offset = 0, read;

			while ((read = Read (data, offset, length - offset)) > 0)
				offset += read;

			section.Data = data;

			BaseStream.Position = position;
		}
コード例 #6
0
ファイル: ImageReader.cs プロジェクト: fugaku/scriptsharp
		void ReadSections (ushort count)
		{
			var sections = new Section [count];

			for (int i = 0; i < count; i++) {
				var section = new Section ();

				// Name
				section.Name = ReadZeroTerminatedString (8);

				// VirtualSize		4
				Advance (4);

				// VirtualAddress	4
				section.VirtualAddress = ReadUInt32 ();
				// SizeOfRawData	4
				section.SizeOfRawData = ReadUInt32 ();
				// PointerToRawData	4
				section.PointerToRawData = ReadUInt32 ();

				// PointerToRelocations		4
				// PointerToLineNumbers		4
				// NumberOfRelocations		2
				// NumberOfLineNumbers		2
				// Characteristics			4
				Advance (16);

				sections [i] = section;

				if (section.Name == ".reloc")
					continue;

				ReadSectionData (section);
			}

			image.Sections = sections;
		}
コード例 #7
0
ファイル: ImageWriter.cs プロジェクト: fugaku/scriptsharp
		void MoveToRVA (Section section, RVA rva)
		{
			BaseStream.Seek (section.PointerToRawData + rva - section.VirtualAddress, SeekOrigin.Begin);
		}
コード例 #8
0
ファイル: ImageWriter.cs プロジェクト: fugaku/scriptsharp
		void WriteSection (Section section, uint characteristics)
		{
			var name = new byte [8];
			var sect_name = section.Name;
			for (int i = 0; i < sect_name.Length; i++)
				name [i] = (byte) sect_name [i];

			WriteBytes (name);
			WriteUInt32 (section.VirtualSize);
			WriteUInt32 (section.VirtualAddress);
			WriteUInt32 (section.SizeOfRawData);
			WriteUInt32 (section.PointerToRawData);
			WriteUInt32 (0);	// PointerToRelocations
			WriteUInt32 (0);	// PointerToLineNumbers
			WriteUInt16 (0);	// NumberOfRelocations
			WriteUInt16 (0);	// NumberOfLineNumbers
			WriteUInt32 (characteristics);
		}
コード例 #9
0
ファイル: ImageWriter.cs プロジェクト: fugaku/scriptsharp
		Section CreateSection (string name, uint size, Section previous)
		{
			return new Section {
				Name = name,
				VirtualAddress = previous != null
					? previous.VirtualAddress + Align (previous.VirtualSize, section_alignment)
					: text_rva,
				VirtualSize = size,
				PointerToRawData = previous != null
					? previous.PointerToRawData + previous.SizeOfRawData
					: Align (GetHeaderSize (), file_alignment),
				SizeOfRawData = Align (size, file_alignment)
			};
		}
コード例 #10
0
ファイル: ImageWriter.cs プロジェクト: fugaku/scriptsharp
		void BuildSections ()
		{
			var has_win32_resources = win32_resources != null;
			if (has_win32_resources)
				sections++;

			text = CreateSection (".text", text_map.GetLength (), null);
			var previous = text;

			if (has_win32_resources) {
				rsrc = CreateSection (".rsrc", (uint) win32_resources.length, previous);

				PatchWin32Resources (win32_resources);
				previous = rsrc;
			}

			reloc = CreateSection (".reloc", 12u, previous);
		}
コード例 #11
0
ファイル: Image.cs プロジェクト: fugaku/scriptsharp
		public uint ResolveVirtualAddressInSection (RVA rva, Section section)
		{
			return rva + section.PointerToRawData - section.VirtualAddress;
		}
コード例 #12
0
ファイル: BlobHeap.cs プロジェクト: fugaku/scriptsharp
		public BlobHeap (Section section, uint start, uint size)
			: base (section, start, size)
		{
		}
コード例 #13
0
ファイル: TableHeap.cs プロジェクト: fugaku/scriptsharp
		public TableHeap (Section section, uint start, uint size)
			: base (section, start, size)
		{
		}
コード例 #14
0
ファイル: Heap.cs プロジェクト: fugaku/scriptsharp
		protected Heap (Section section, uint offset, uint size)
		{
			this.Section = section;
			this.Offset = offset;
			this.Size = size;
		}
コード例 #15
0
ファイル: CodeReader.cs プロジェクト: fugaku/scriptsharp
		CodeReader (Section section, MetadataReader reader)
			: base (section.Data)
		{
			this.code_section = section;
			this.reader = reader;
		}