示例#1
0
        /// <summary>
        /// Get the RVAs of the runtime functions for each method
        /// </summary>
        private void ParseRuntimeFunctions(bool[] isEntryPoint, int runtimeFunctionOffset, int runtimeFunctionSize)
        {
            int curOffset = 0;

            foreach (R2RMethod method in R2RMethods)
            {
                int runtimeFunctionId = method.EntryPointRuntimeFunctionId;
                if (runtimeFunctionId == -1)
                {
                    continue;
                }
                curOffset = runtimeFunctionOffset + runtimeFunctionId * runtimeFunctionSize;
                GcInfo gcInfo = null;
                do
                {
                    int startRva = NativeReader.ReadInt32(Image, ref curOffset);
                    int endRva   = -1;
                    if (Machine == Machine.Amd64)
                    {
                        endRva = NativeReader.ReadInt32(Image, ref curOffset);
                    }
                    int unwindRva    = NativeReader.ReadInt32(Image, ref curOffset);
                    int unwindOffset = GetOffset(unwindRva);

                    UnwindInfo unwindInfo = new UnwindInfo(Image, unwindOffset);
                    if (isEntryPoint[runtimeFunctionId])
                    {
                        gcInfo = new GcInfo(Image, unwindOffset + unwindInfo.Size, Machine, R2RHeader.MajorVersion);
                    }

                    method.RuntimeFunctions.Add(new RuntimeFunction(runtimeFunctionId, startRva, endRva, unwindRva, method, unwindInfo, gcInfo));
                    runtimeFunctionId++;
                }while (runtimeFunctionId < isEntryPoint.Length && !isEntryPoint[runtimeFunctionId]);
            }
        }
示例#2
0
        public R2RImportSection(byte[] image, int rva, int size, CorCompileImportFlags flags, byte type, byte entrySize, int signatureRVA, List <ImportSectionEntry> entries, int auxDataRVA, int auxDataOffset, Machine machine, ushort majorVersion)
        {
            SectionRVA  = rva;
            SectionSize = size;
            Flags       = flags;
            Type        = (CorCompileImportType)type;
            EntrySize   = entrySize;

            SignatureRVA = signatureRVA;
            Entries      = entries;

            AuxiliaryDataRVA = auxDataRVA;
            AuxiliaryData    = null;
            if (AuxiliaryDataRVA != 0)
            {
                AuxiliaryData = new GcInfo(image, auxDataOffset, machine, majorVersion);
            }
        }
示例#3
0
 public RuntimeFunction(int id, int startRva, int endRva, int unwindRva, int codeOffset, R2RMethod method, UnwindInfo unwindInfo, GcInfo gcInfo)
 {
     Id           = id;
     StartAddress = startRva;
     UnwindRVA    = unwindRva;
     Method       = method;
     UnwindInfo   = unwindInfo;
     if (endRva != -1)
     {
         Size = endRva - startRva;
     }
     else if (gcInfo != null)
     {
         Size = gcInfo.CodeLength;
     }
     CodeOffset    = codeOffset;
     method.GcInfo = gcInfo;
 }