public ImageDebugDirectory GetDebugHeader(out byte [] header) { var section = GetSectionAtVirtualAddress(Debug.VirtualAddress); var buffer = new ByteBuffer(section.Data); buffer.position = (int)(Debug.VirtualAddress - section.VirtualAddress); var directory = new ImageDebugDirectory { Characteristics = buffer.ReadInt32(), TimeDateStamp = buffer.ReadInt32(), MajorVersion = buffer.ReadInt16(), MinorVersion = buffer.ReadInt16(), Type = buffer.ReadInt32(), SizeOfData = buffer.ReadInt32(), AddressOfRawData = buffer.ReadInt32(), PointerToRawData = buffer.ReadInt32(), }; buffer.position = (int)(directory.AddressOfRawData - section.VirtualAddress); header = new byte [directory.SizeOfData]; Buffer.BlockCopy(buffer.buffer, buffer.position, header, 0, header.Length); return(directory); }
public ImageDebugDirectory GetDebugHeader(out byte[] header) { Section sectionAtVirtualAddress = this.GetSectionAtVirtualAddress(this.Debug.VirtualAddress); ByteBuffer byteBuffer = new ByteBuffer(sectionAtVirtualAddress.Data) { position = (int)(this.Debug.VirtualAddress - sectionAtVirtualAddress.VirtualAddress) }; ImageDebugDirectory imageDebugDirectory = new ImageDebugDirectory() { Characteristics = byteBuffer.ReadInt32(), TimeDateStamp = byteBuffer.ReadInt32(), MajorVersion = byteBuffer.ReadInt16(), MinorVersion = byteBuffer.ReadInt16(), Type = byteBuffer.ReadInt32(), SizeOfData = byteBuffer.ReadInt32(), AddressOfRawData = byteBuffer.ReadInt32(), PointerToRawData = byteBuffer.ReadInt32() }; ImageDebugDirectory imageDebugDirectory1 = imageDebugDirectory; if (imageDebugDirectory1.SizeOfData == 0 || imageDebugDirectory1.PointerToRawData == 0) { header = Empty <byte> .Array; return(imageDebugDirectory1); } byteBuffer.position = (int)((long)imageDebugDirectory1.PointerToRawData - (ulong)sectionAtVirtualAddress.PointerToRawData); header = new byte[imageDebugDirectory1.SizeOfData]; Buffer.BlockCopy(byteBuffer.buffer, byteBuffer.position, header, 0, (int)header.Length); return(imageDebugDirectory1); }
public ImageDebugDirectory GetDebugHeader(out byte[] header) { Section sectionAtVirtualAddress = this.GetSectionAtVirtualAddress(this.Debug.VirtualAddress); ByteBuffer buffer = new ByteBuffer(sectionAtVirtualAddress.Data) { position = (int)(this.Debug.VirtualAddress - sectionAtVirtualAddress.VirtualAddress) }; ImageDebugDirectory directory = new ImageDebugDirectory { Characteristics = buffer.ReadInt32(), TimeDateStamp = buffer.ReadInt32(), MajorVersion = buffer.ReadInt16(), MinorVersion = buffer.ReadInt16(), Type = buffer.ReadInt32(), SizeOfData = buffer.ReadInt32(), AddressOfRawData = buffer.ReadInt32(), PointerToRawData = buffer.ReadInt32() }; if ((directory.SizeOfData == 0) || (directory.PointerToRawData == 0)) { header = Empty <byte> .Array; return(directory); } buffer.position = directory.PointerToRawData - ((int)sectionAtVirtualAddress.PointerToRawData); header = new byte[directory.SizeOfData]; Buffer.BlockCopy(buffer.buffer, buffer.position, header, 0, header.Length); return(directory); }
void PatchRawCode(ByteBuffer buffer, int code_size, CodeWriter writer) { var metadata = writer.metadata; buffer.WriteBytes (ReadBytes (code_size)); var end = buffer.position; buffer.position -= code_size; while (buffer.position < end) { OpCode opcode; var il_opcode = buffer.ReadByte (); if (il_opcode != 0xfe) { opcode = OpCodes.OneByteOpCode [il_opcode]; } else { var il_opcode2 = buffer.ReadByte (); opcode = OpCodes.TwoBytesOpCode [il_opcode2]; } switch (opcode.OperandType) { case OperandType.ShortInlineI: case OperandType.ShortInlineBrTarget: case OperandType.ShortInlineVar: case OperandType.ShortInlineArg: buffer.position += 1; break; case OperandType.InlineVar: case OperandType.InlineArg: buffer.position += 2; break; case OperandType.InlineBrTarget: case OperandType.ShortInlineR: case OperandType.InlineI: buffer.position += 4; break; case OperandType.InlineI8: case OperandType.InlineR: buffer.position += 8; break; case OperandType.InlineSwitch: var length = buffer.ReadInt32 (); buffer.position += length * 4; break; case OperandType.InlineString: var @string = GetString (new MetadataToken (buffer.ReadUInt32 ())); buffer.position -= 4; buffer.WriteUInt32 ( new MetadataToken ( TokenType.String, metadata.user_string_heap.GetStringIndex (@string)).ToUInt32 ()); break; case OperandType.InlineSig: var call_site = GetCallSite (new MetadataToken (buffer.ReadUInt32 ())); buffer.position -= 4; buffer.WriteUInt32 (writer.GetStandAloneSignature (call_site).ToUInt32 ()); break; case OperandType.InlineTok: case OperandType.InlineType: case OperandType.InlineMethod: case OperandType.InlineField: var provider = reader.LookupToken (new MetadataToken (buffer.ReadUInt32 ())); buffer.position -= 4; buffer.WriteUInt32 (metadata.LookupToken (provider).ToUInt32 ()); break; } } }
public ImageDebugDirectory GetDebugHeader(out byte[] header) { var section = GetSectionAtVirtualAddress(Debug.VirtualAddress); var buffer = new ByteBuffer(section.Data); buffer.position = (int)(Debug.VirtualAddress - section.VirtualAddress); var directory = new ImageDebugDirectory { Characteristics = buffer.ReadInt32(), TimeDateStamp = buffer.ReadInt32(), MajorVersion = buffer.ReadInt16(), MinorVersion = buffer.ReadInt16(), Type = buffer.ReadInt32(), SizeOfData = buffer.ReadInt32(), AddressOfRawData = buffer.ReadInt32(), PointerToRawData = buffer.ReadInt32(), }; buffer.position = (int)(directory.PointerToRawData - section.PointerToRawData); header = new byte[directory.SizeOfData]; Buffer.BlockCopy(buffer.buffer, buffer.position, header, 0, header.Length); return directory; }