static MetadataToken GetLocalVarToken(ByteBuffer buffer, MethodSymbols symbols) { if (symbols.variables.IsNullOrEmpty()) return MetadataToken.Zero; buffer.position = 8; return new MetadataToken(buffer.ReadUInt32()); }
void PatchResourceDataEntry(ByteBuffer resources) { var old_rsrc = GetImageResourceSection(); var rva = resources.ReadUInt32(); resources.position -= 4; resources.WriteUInt32(rva - old_rsrc.VirtualAddress + rsrc.VirtualAddress); }
void PatchResourceDirectoryEntry(ByteBuffer resources) { resources.Advance(4); var child = resources.ReadUInt32(); var position = resources.position; resources.position = (int)child & 0x7fffffff; if ((child & 0x80000000) != 0) PatchResourceDirectoryTable(resources); else PatchResourceDataEntry(resources); resources.position = position; }
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; } } }