{
int id;
bool isNum = ArgStringToInt(query, out id);
- bool idMatch = isNum && (method.Rid == id || MetadataTokens.GetRowNumber(method.MetadataReader, method.MethodHandle) == id);
+ bool idMatch = isNum && (method.Rid == id || MetadataTokens.GetRowNumber(method.R2RReader.MetadataReader, method.MethodHandle) == id);
bool sigMatch = false;
if (exact)
[XmlAttribute("Index")]
public int Index { get; set; }
public int StartOffset { get; set; }
+ public int StartRVA { get; set; }
public long Section { get; set; }
public uint SignatureRVA { get; set; }
public string Signature { get; set; }
- public ImportSectionEntry(int index, int startOffset, long section, uint signatureRVA, string signature)
+ public ImportSectionEntry(int index, int startOffset, int startRVA, long section, uint signatureRVA, string signature)
{
Index = index;
StartOffset = startOffset;
+ StartRVA = startRVA;
Section = section;
SignatureRVA = signatureRVA;
Signature = signature;
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat("+{0:X4}", StartOffset);
+ builder.AppendFormat(" ({0:X4})", StartRVA);
builder.AppendFormat(" Section: 0x{0:X8}", Section);
builder.AppendFormat(" SignatureRVA: 0x{0:X8}", SignatureRVA);
builder.AppendFormat(" {0}", Signature);
private const int _mdtMethodDef = 0x06000000;
/// <summary>
- /// ECMA metadata reader for the method module.
+ /// R2R reader representing the method module.
/// </summary>
- public MetadataReader MetadataReader { get; }
+ public R2RReader R2RReader { get; }
/// <summary>
/// An unique index for the method
/// </summary>
public R2RMethod(
int index,
- MetadataReader mdReader,
+ R2RReader r2rReader,
EntityHandle methodHandle,
int entryPointId,
string owningType,
MethodHandle = methodHandle;
EntryPointRuntimeFunctionId = entryPointId;
- MetadataReader = mdReader;
+ R2RReader = r2rReader;
RuntimeFunctions = new List<RuntimeFunction>();
EntityHandle owningTypeHandle;
{
case HandleKind.MethodDefinition:
{
- MethodDefinition methodDef = MetadataReader.GetMethodDefinition((MethodDefinitionHandle)MethodHandle);
- Name = MetadataReader.GetString(methodDef.Name);
+ MethodDefinition methodDef = R2RReader.MetadataReader.GetMethodDefinition((MethodDefinitionHandle)MethodHandle);
+ Name = R2RReader.MetadataReader.GetString(methodDef.Name);
Signature = methodDef.DecodeSignature<string, DisassemblingGenericContext>(typeProvider, genericContext);
owningTypeHandle = methodDef.GetDeclaringType();
genericParams = methodDef.GetGenericParameters();
case HandleKind.MemberReference:
{
- MemberReference memberRef = MetadataReader.GetMemberReference((MemberReferenceHandle)MethodHandle);
- Name = MetadataReader.GetString(memberRef.Name);
+ MemberReference memberRef = R2RReader.MetadataReader.GetMemberReference((MemberReferenceHandle)MethodHandle);
+ Name = R2RReader.MetadataReader.GetString(memberRef.Name);
Signature = memberRef.DecodeMethodSignature<string, DisassemblingGenericContext>(typeProvider, genericContext);
owningTypeHandle = memberRef.Parent;
}
}
else
{
- DeclaringType = MetadataNameFormatter.FormatHandle(MetadataReader, owningTypeHandle);
+ DeclaringType = MetadataNameFormatter.FormatHandle(R2RReader.MetadataReader, owningTypeHandle);
}
Fixups = fixups;
sb.AppendLine(SignatureString);
- sb.AppendLine($"Handle: 0x{MetadataTokens.GetToken(MetadataReader, MethodHandle):X8}");
- sb.AppendLine($"Rid: {MetadataTokens.GetRowNumber(MetadataReader, MethodHandle)}");
+ sb.AppendLine($"Handle: 0x{MetadataTokens.GetToken(R2RReader.MetadataReader, MethodHandle):X8}");
+ sb.AppendLine($"Rid: {MetadataTokens.GetRowNumber(R2RReader.MetadataReader, MethodHandle)}");
sb.AppendLine($"EntryPointRuntimeFunctionId: {EntryPointRuntimeFunctionId}");
sb.AppendLine($"Number of RuntimeFunctions: {RuntimeFunctions.Count}");
if (Fixups != null)
sb.AppendLine($"Number of fixups: {Fixups.Count()}");
foreach (FixupCell cell in Fixups)
{
- sb.AppendLine($" TableIndex {cell.TableIndex}, Offset {cell.CellOffset:X4}");
+ R2RImportSection importSection = R2RReader.ImportSections[(int)cell.TableIndex];
+ R2RImportSection.ImportSectionEntry entry = importSection.Entries[(int)cell.CellOffset];
+ sb.AppendLine($" TableIndex {cell.TableIndex}, Offset {cell.CellOffset:X4}: {entry.Signature}");
}
}
int runtimeFunctionId;
FixupCell[] fixups;
GetRuntimeFunctionIndexFromOffset(offset, out runtimeFunctionId, out fixups);
- R2RMethod method = new R2RMethod(R2RMethods.Count, MetadataReader, methodHandle, runtimeFunctionId, owningType: null, constrainedType: null, instanceArgs: null, fixups: fixups);
+ R2RMethod method = new R2RMethod(R2RMethods.Count, this, methodHandle, runtimeFunctionId, owningType: null, constrainedType: null, instanceArgs: null, fixups: fixups);
if (method.EntryPointRuntimeFunctionId < 0 || method.EntryPointRuntimeFunctionId >= isEntryPoint.Length)
{
int runtimeFunctionId;
FixupCell[] fixups;
GetRuntimeFunctionIndexFromOffset((int)decoder.Offset, out runtimeFunctionId, out fixups);
- R2RMethod method = new R2RMethod(R2RMethods.Count, MetadataReader, methodHandle, runtimeFunctionId, owningType, constrainedType, methodTypeArgs, fixups);
+ R2RMethod method = new R2RMethod(R2RMethods.Count, this, methodHandle, runtimeFunctionId, owningType, constrainedType, methodTypeArgs, fixups);
if (method.EntryPointRuntimeFunctionId >= 0 && method.EntryPointRuntimeFunctionId < isEntryPoint.Length)
{
isEntryPoint[method.EntryPointRuntimeFunctionId] = true;
return;
}
- HashSet<uint> added = new HashSet<uint>();
-
R2RSection availableTypesSection = R2RHeader.Sections[R2RSection.SectionType.READYTORUN_SECTION_AVAILABLE_TYPES];
int availableTypesOffset = GetOffset(availableTypesSection.RelativeVirtualAddress);
NativeParser parser = new NativeParser(Image, (uint)availableTypesOffset);
while (!curParser.IsNull())
{
uint rid = curParser.GetUnsigned();
- if (!added.Add(rid))
- {
- continue;
- }
bool isExportedType = (rid & 1) != 0;
rid = rid >> 1;
uint sigRva = NativeReader.ReadUInt32(Image, ref signatureOffset);
int sigOffset = GetOffset((int)sigRva);
string cellName = MetadataNameFormatter.FormatSignature(this, sigOffset);
- entries.Add(new R2RImportSection.ImportSectionEntry(entries.Count, entryOffset, section, sigRva, cellName));
+ entries.Add(new R2RImportSection.ImportSectionEntry(entries.Count, entryOffset, entryOffset + rva, section, sigRva, cellName));
ImportCellNames.Add(rva + entrySize * i, cellName);
}