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(), }; if (directory.SizeOfData == 0 || directory.PointerToRawData == 0) { header = Empty<byte>.Array; return directory; } buffer.position = (int)(directory.PointerToRawData - section.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; } } }