示例#1
0
文件: Lind.cs 项目: Z01wvay/Rhydon
        internal unsafe override void Emulate(EmuContext ctx)
        {
            var    slot  = ctx.Stack.Pop();
            VMSlot value = new VMSlot();

            if (slot.O is IReference)
            {
                value = ((IReference)slot.O).GetValue(ctx, IntPtr.Size == 8 ? PointerType.QWORD : PointerType.DWORD);
            }
            else
            {
                if (IntPtr.Size == 8)
                {
                    ulong *ptr = (ulong *)slot.U8;
                    value = new VMSlot {
                        U8 = *ptr
                    };
                }
                else
                {
                    uint *ptr = (uint *)slot.U8;
                    value = new VMSlot {
                        U4 = *ptr
                    };
                }
            }
            ctx.Stack.Push(value);
        }
示例#2
0
文件: Ldfld.cs 项目: Z01wvay/Rhydon
        internal override void EmulateVCall(EmuContext ctx)
        {
            VMSlot    slot      = ctx.Stack.Pop();
            VMSlot    slot2     = ctx.Stack.Pop();
            bool      flag      = (slot.U4 & 2147483648u) > 0u;
            FieldInfo fieldInfo = (FieldInfo)ctx.Header.References[slot.U4 & 2147483647u];
            bool      flag2     = !fieldInfo.IsStatic && slot2.O == null;

            if (flag2)
            {
                // throw new NullReferenceException();
                return;
            }
            if (flag)
            {
                ctx.Stack.Push(new VMSlot()
                {
                    O = new FieldRef(slot2.O, fieldInfo)
                });
            }
            else
            {
                bool   flag4 = fieldInfo.DeclaringType.IsValueType && slot2.O is IReference;
                object obj;
                if (flag4)
                {
                    obj = ((IReference)slot2.O).GetValue(ctx, PointerType.OBJECT).ToObject(fieldInfo.DeclaringType);
                }
                else
                {
                    obj = slot2.ToObject(fieldInfo.DeclaringType);
                }
                ctx.Stack.Push(VMSlot.FromObject(fieldInfo.GetValue(obj), fieldInfo.FieldType));
            }
        }
示例#3
0
文件: Unbox.cs 项目: Z01wvay/Rhydon
        internal unsafe override void EmulateVCall(EmuContext ctx)
        {
            VMSlot slot  = ctx.Stack.Pop();
            VMSlot value = ctx.Stack.Pop();
            bool   flag  = (slot.U4 & 2147483648u) > 0u;
            Type   type  = (Type)ctx.Header.References[slot.U4 & 2147483647u];

            if (flag)
            {
                TypedReference typedRef;
                Helpers.TypedReferenceHelpers.UnboxTypedRef(value.O, (void *)(&typedRef));
                TypedRef typedRef2 = new TypedRef(typedRef);
                value = VMSlot.FromObject(value.O, type);
                ctx.Stack.Push(value);
            }
            else
            {
                bool flag3 = type == typeof(object) && value.O != null;
                if (flag3)
                {
                    type = value.O.GetType();
                }
                value = VMSlot.FromObject(value.O, type);
                ctx.Stack.Push(value);
            }
        }
示例#4
0
 internal override void EmulateVCall(EmuContext ctx)
 {
     if (ctx.Stack.Pop().U4 > 0u)
     {
         //throw overflow
     }
 }
示例#5
0
        internal override void EmulateVCall(EmuContext ctx)
        {
            VMSlot slot  = ctx.Stack.Pop();
            VMSlot value = ctx.Stack.Pop();
            bool   flag  = (slot.U4 & 2147483648u) > 0u;
            Type   type  = (Type)ctx.Header.References[slot.U4 & 2147483647u];
            bool   flag2 = Type.GetTypeCode(type) == TypeCode.String && value.O == null;

            if (flag2)
            {
                value.O = ctx.Header.Strings[value.U4];
            }
            else
            {
                if (value.O == null)
                {
                    value.O = null;
                    //n***a wtf
                }
                else
                {
                    if (!type.IsInstanceOfType(value.O))
                    {
                        value.O = null;
                        if (flag)
                        {
                            //throw exceptpion
                        }
                    }
                }
            }
            ctx.Stack.Push(value);
        }
示例#6
0
        internal override void EmulateVCall(EmuContext ctx)
        {
            VMSlot     value      = ctx.Stack.Pop();
            MemberInfo memberInfo = (MemberInfo)ctx.Header.References[value.U4];
            bool       flag       = memberInfo is Type;

            if (flag)
            {
                value.O = ValueTypeBox.Box(((Type)memberInfo).TypeHandle, typeof(RuntimeTypeHandle));
            }
            else
            {
                bool flag2 = memberInfo is MethodBase;
                if (flag2)
                {
                    value.O = ValueTypeBox.Box(((MethodBase)memberInfo).MethodHandle, typeof(RuntimeMethodHandle));
                }
                else
                {
                    bool flag3 = memberInfo is FieldInfo;
                    if (flag3)
                    {
                        value.O = ValueTypeBox.Box(((FieldInfo)memberInfo).FieldHandle, typeof(RuntimeFieldHandle));
                    }
                }
            }
            ctx.Stack.Push(value);
        }
示例#7
0
        internal override void EmulateVCall(EmuContext ctx)
        {
            VMSlot slot = ctx.Stack.Pop();
            byte   u2   = ctx.Registers[(int)ctx.Constants.REG_FL].U1;
            bool   flag = (u2 & ctx.Constants.FL_UNSIGNED) > 0;

            if (flag)
            {
                float r     = slot.R4;
                bool  flag2 = float.IsNaN(r) || float.IsInfinity(r);
                if (flag2)
                {
                    //throw arithmeticexception
                }
            }
            else
            {
                double r2    = slot.R8;
                bool   flag3 = double.IsNaN(r2) || double.IsInfinity(r2);
                if (flag3)
                {
                    //throw arithmeticexception
                }
            }
        }
示例#8
0
        internal override void Emulate(EmuContext ctx)
        {
            var val   = ctx.Stack.Pop().U1;
            var vcall = ctx.LookupVCall(val);

            vcall.EmulateVCall(ctx);
        }
示例#9
0
文件: Initobj.cs 项目: Z01wvay/Rhydon
        internal override void EmulateVCall(EmuContext ctx)
        {
            VMSlot slot  = ctx.Stack.Pop();
            VMSlot slot2 = ctx.Stack.Pop();
            Type   type  = (Type)ctx.Header.References[slot.U4];
            bool   flag  = slot2.O is IReference;

            if (flag)
            {
                IReference reference   = (IReference)slot2.O;
                VMSlot     val         = new VMSlot();
                bool       isValueType = type.IsValueType;
                if (isValueType)
                {
                    object vt    = null;
                    bool   flag2 = Nullable.GetUnderlyingType(type) == null;
                    if (flag2)
                    {
                        vt = FormatterServices.GetUninitializedObject(type);
                    }
                    slot.O = Box(vt, type);
                }
                else
                {
                    slot.O = null;
                }
            }
        }
示例#10
0
        internal override void Emulate(EmuContext ctx)
        {
            //throw new System.NotImplementedException();
            byte   b     = ctx.ReadByte();
            VMSlot value = ctx.Registers[(int)b];

            ctx.Stack.Push(value);
        }
示例#11
0
文件: FConv.cs 项目: Z01wvay/Rhydon
        internal override void Emulate(EmuContext ctx)
        {
            //throw new System.NotImplementedException();
            VMSlot slot = ctx.Stack.Pop();

            slot.R4 = (float)slot.U8;
            ctx.Stack.Push(slot);
        }
示例#12
0
        internal override void Emulate(EmuContext ctx)
        {
            var regid = ctx.ReadByte();
            var slot  = ctx.Registers[regid];

            ctx.Stack.Push(new VMSlot {
                U1 = slot.U1
            });
        }
示例#13
0
        internal override void EmulateVCall(EmuContext ctx)
        {
            VMSlot value = ctx.Stack.Pop();
            VMSlot slot  = ctx.Stack.Pop();
            VMSlot slot2 = ctx.Stack.Pop();

            value.U8 = ((value.U8 > slot.U8 || value.U8 < slot2.U8) ? 1UL : 0UL);
            ctx.Stack.Push(value);
        }
示例#14
0
        internal override void Emulate(EmuContext ctx)
        {
            var slot  = ctx.Stack.Pop();
            var slot2 = ctx.Stack.Pop();

            if (slot2.U8 == 0UL)
            {
                ctx.Reader.BaseStream.Position = (long)slot.U8;
            }
        }
示例#15
0
        internal override void Emulate(EmuContext ctx)
        {
            VMSlot first  = ctx.Stack.Pop();
            VMSlot second = ctx.Stack.Pop();

            ctx.Stack.Push(new VMSlot()
            {
                U4 = first.U4 / second.U4
            });
        }
示例#16
0
        internal override void EmulateVCall(EmuContext ctx)
        {
            Type type = (Type)ctx.Header.References[ctx.Stack.Pop().U4];

            ctx.Stack.Push(new VMSlot()
            {
                U4 = (uint)SizeOfHelper.SizeOf(type)
            });
            //Fixed :)
        }
示例#17
0
        internal override void Emulate(EmuContext ctx)
        {
            //throw new System.NotImplementedException();
            VMSlot first  = ctx.Stack.Pop();
            VMSlot second = ctx.Stack.Pop();

            ctx.Stack.Push(new VMSlot()
            {
                R8 = second.R8 + first.R8
            });
        }
示例#18
0
文件: Nor.cs 项目: Z01wvay/Rhydon
        internal override void Emulate(EmuContext ctx)
        {
            //throw new System.NotImplementedException();
            VMSlot slot  = ctx.Stack.Pop();
            VMSlot slot2 = ctx.Stack.Pop();

            ctx.Stack.Push(new VMSlot()
            {
                U4 = ~(slot.U4 | slot2.U4)
            });
        }
示例#19
0
        internal override void Emulate(EmuContext ctx)
        {
            //throw new System.NotImplementedException();
            byte   b      = ctx.ReadByte();
            VMSlot vmslot = ctx.Registers[(int)b];

            ctx.Stack.Push(new VMSlot()
            {
                U8 = vmslot.U8
            });
        }
示例#20
0
文件: Mul.cs 项目: Z01wvay/Rhydon
        internal override void Emulate(EmuContext ctx)
        {
            //throw new System.NotImplementedException();
            VMSlot slot    = ctx.Stack.Pop();
            VMSlot slot2   = ctx.Stack.Pop();
            VMSlot slotnew = new VMSlot();
            ulong  num2    = (ulong)(slot.U4 * slot2.U4);

            slotnew.U4 = (uint)num2;
            ctx.Stack.Push(slotnew);
        }
示例#21
0
文件: Sx.cs 项目: Z01wvay/Rhydon
        internal override void Emulate(EmuContext ctx)
        {
            //throw new System.NotImplementedException();
            VMSlot value = ctx.Stack.Pop();
            bool   flag  = (value.U4 & 2147483648u) > 0u;

            if (flag)
            {
                value.U8 = (18446744069414584320UL | (ulong)value.U4);
            }
            ctx.Stack.Push(value);
        }
示例#22
0
 internal unsafe override void Emulate(EmuContext ctx)
 {
     var  slot  = ctx.Stack.Pop();
     var  slot2 = ctx.Stack.Pop();
     uint u     = slot2.U4;
     //   ushort num2 = *(UIntPtr)(slot.U8 - 2UL);
     //   bool flag = u < (uint)num2;
     //    if (flag) {
     //        ctx.Reader.BaseStream.Position = ctx.Reader.BaseStream.Position + (ulong)((long)(*((UIntPtr)slot.U8 + (UIntPtr)((IntPtr)((ulong)u * 4UL)))));
     //    }
     //To Fix This
 }
示例#23
0
文件: Sx.cs 项目: Z01wvay/Rhydon
        internal override void Emulate(EmuContext ctx)
        {
            //throw new System.NotImplementedException();
            VMSlot value = ctx.Stack.Pop();
            bool   flag  = (value.U1 & 128) > 0;

            if (flag)
            {
                value.U4 = ((uint)value.U1 | 4294967040u);
            }
            ctx.Stack.Push(value);
        }
示例#24
0
        internal override void Emulate(EmuContext ctx)
        {
            var slot  = ctx.Stack.Pop();
            var slot2 = ctx.Stack.Pop();

            if (slot.O is IReference)
            {
                ((IReference)slot.O).SetValue(ctx, slot2, PointerType.OBJECT);
            }
            else
            {
                //Throw Exception?
            }
        }
示例#25
0
文件: Ldftn.cs 项目: Z01wvay/Rhydon
        internal override void EmulateVCall(EmuContext ctx)
        {
            VMSlot slot  = ctx.Stack.Pop();
            VMSlot slot2 = ctx.Stack.Pop();

            if (slot2.O != null)
            {
                MethodInfo  methodInfo = (MethodInfo)ctx.Header.References[slot.U4];
                Type        type       = slot2.O.GetType();
                List <Type> list       = new List <Type>();
                do
                {
                    list.Add(type);
                    type = type.BaseType;
                }while (type != null && type != methodInfo.DeclaringType);
                list.Reverse();
                MethodInfo methodInfo2 = methodInfo;
                foreach (Type type2 in list)
                {
                    foreach (MethodInfo methodInfo3 in type2.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
                    {
                        bool flag2 = methodInfo3.GetBaseDefinition() == methodInfo2;
                        if (flag2)
                        {
                            methodInfo2 = methodInfo3;
                            break;
                        }
                    }
                }
                ctx.Stack.Push(new VMSlot()
                {
                    U8 = (ulong)((long)methodInfo2.MethodHandle.GetFunctionPointer())
                });
            }
            if (slot2.U8 > 0UL)
            {
                uint  u  = ctx.Stack.Pop().U4;
                ulong u2 = slot.U8;
                // VMFuncSig TODO: VMFuncSig,VMTrampoline
            }
            else
            {
                MethodBase methodBase = (MethodBase)ctx.Header.References[slot.U4];
                ctx.Stack.Push(new VMSlot()
                {
                    U8 = (ulong)((long)methodBase.MethodHandle.GetFunctionPointer())
                });
            }
        }
示例#26
0
        internal override void Emulate(EmuContext ctx)
        {
            //throw new System.NotImplementedException();
            ulong num2 = (ulong)ctx.ReadByte();

            num2 |= (ulong)ctx.ReadByte() << 8;
            num2 |= (ulong)ctx.ReadByte() << 16;
            num2 |= (ulong)ctx.ReadByte() << 24;
            int    lol     = int.MinValue;
            ulong  num3    = ((num2 & (ulong)lol) != 0UL) ? 18446744069414584320UL : 0UL;
            VMSlot newslot = new VMSlot();

            newslot.U8 = (num3 | num2);
            ctx.Stack.Push(newslot);
        }
示例#27
0
文件: Lind.cs 项目: Z01wvay/Rhydon
        internal override void Emulate(EmuContext ctx)
        {
            var    slot  = ctx.Stack.Pop();
            VMSlot value = new VMSlot();

            if (slot.O is IReference)
            {
                value = ((IReference)slot.O).GetValue(ctx, PointerType.OBJECT);
            }
            else
            {
                //throw exception?
            }
            ctx.Stack.Push(value);
        }
示例#28
0
        internal unsafe override void Emulate(EmuContext ctx)
        {
            var slot  = ctx.Stack.Pop();
            var slot2 = ctx.Stack.Pop();

            if (slot.O is IReference)
            {
                ((IReference)slot.O).SetValue(ctx, slot2, PointerType.DWORD);
            }
            else
            {
                uint  u2  = slot2.U4;
                uint *ptr = (uint *)slot.U8;
                *     ptr = u2;
            }
        }
示例#29
0
        internal unsafe override void Emulate(EmuContext ctx)
        {
            var slot  = ctx.Stack.Pop();
            var slot2 = ctx.Stack.Pop();

            if (slot.O is IReference)
            {
                ((IReference)slot.O).SetValue(ctx, slot2, PointerType.BYTE);
            }
            else
            {
                byte  u2  = slot2.U1;
                byte *ptr = (byte *)slot.U8;
                *     ptr = u2;
            }
        }
示例#30
0
文件: Box.cs 项目: Z01wvay/Rhydon
        internal override void EmulateVCall(EmuContext ctx)
        {
            VMSlot slot  = ctx.Stack.Pop();
            VMSlot value = ctx.Stack.Pop();
            Type   type  = (Type)ctx.Header.References[slot.U4];

            if (Type.GetTypeCode(type) == TypeCode.String && value.O == null)
            {
                value.O = ctx.Header.Strings[value.U4];
            }
            else
            {
                value.O = value.ToObject(type);
            }
            ctx.Stack.Push(value);
        }