예제 #1
0
 private static int CompareNativeVarInfo(NativeVarInfo left, NativeVarInfo right)
 {
     if (left.VariableNumber < right.VariableNumber)
     {
         return(-1);
     }
     else if (left.VariableNumber > right.VariableNumber)
     {
         return(1);
     }
     else if (left.StartOffset < right.StartOffset)
     {
         return(-1);
     }
     else if (left.StartOffset > right.StartOffset)
     {
         return(1);
     }
     else
     {
         return(0);
     }
 }
예제 #2
0
        private void ParseNativeVarInfo(byte[] image, int offset)
        {
            // Each Varinfo has a:
            // - native start +End offset. We can use a delta for the end offset.
            // - Il variable number. These are usually small.
            // - VarLoc information. This is a tagged variant.
            // The entries aren't sorted in any particular order.
            NibbleReader reader         = new NibbleReader(image, offset);
            uint         nativeVarCount = reader.ReadUInt();

            for (int i = 0; i < nativeVarCount; ++i)
            {
                var entry = new NativeVarInfo();
                entry.StartOffset    = reader.ReadUInt();
                entry.EndOffset      = entry.StartOffset + reader.ReadUInt();
                entry.VariableNumber = (uint)(reader.ReadUInt() + (int)ImplicitILArguments.Max);

                var varLoc = new VarLoc();
                varLoc.VarLocType = (VarLocType)reader.ReadUInt();
                switch (varLoc.VarLocType)
                {
                case VarLocType.VLT_REG:
                case VarLocType.VLT_REG_FP:
                case VarLocType.VLT_REG_BYREF:
                    varLoc.Data1 = (int)reader.ReadUInt();
                    break;

                case VarLocType.VLT_STK:
                case VarLocType.VLT_STK_BYREF:
                    varLoc.Data1 = (int)reader.ReadUInt();
                    varLoc.Data2 = ReadEncodedStackOffset(reader);
                    break;

                case VarLocType.VLT_REG_REG:
                    varLoc.Data1 = (int)reader.ReadUInt();
                    varLoc.Data2 = (int)reader.ReadUInt();
                    break;

                case VarLocType.VLT_REG_STK:
                    varLoc.Data1 = (int)reader.ReadUInt();
                    varLoc.Data2 = (int)reader.ReadUInt();
                    varLoc.Data3 = ReadEncodedStackOffset(reader);
                    break;

                case VarLocType.VLT_STK_REG:
                    varLoc.Data1 = ReadEncodedStackOffset(reader);
                    varLoc.Data2 = (int)reader.ReadUInt();
                    varLoc.Data3 = (int)reader.ReadUInt();
                    break;

                case VarLocType.VLT_STK2:
                    varLoc.Data1 = (int)reader.ReadUInt();
                    varLoc.Data2 = ReadEncodedStackOffset(reader);
                    break;

                case VarLocType.VLT_FPSTK:
                    varLoc.Data1 = (int)reader.ReadUInt();
                    break;

                case VarLocType.VLT_FIXED_VA:
                    varLoc.Data1 = (int)reader.ReadUInt();
                    break;

                default:
                    throw new BadImageFormatException("Unexpected var loc type");
                }

                entry.VariableLocation = varLoc;
                _variablesList.Add(entry);
            }

            if (_normalize)
            {
                _variablesList.Sort(CompareNativeVarInfo);
            }
        }