Esempio n. 1
0
        public OverrideWrapper(MethodInfo original, MethodInfo modified, OverrideAttribute attribute, object instance = null)
        {
            // Set the variables
            Original  = original;
            Modified  = modified;
            Instance  = instance;
            Attribute = attribute;
            Local     = Modified.DeclaringType.Assembly == Assembly.GetExecutingAssembly();

            RuntimeHelpers.PrepareMethod(original.MethodHandle);
            RuntimeHelpers.PrepareMethod(modified.MethodHandle);
            PtrOriginal = Original.MethodHandle.GetFunctionPointer();
            PtrModified = Modified.MethodHandle.GetFunctionPointer();

            OffsetBackup = new OverrideUtilities.OffsetBackup(PtrOriginal);
            Detoured     = false;
        }
        /// <summary>
        /// Loads override information for method
        /// </summary>
        /// <param name="method">Method to override another</param>
        public static void LoadOverride(MethodInfo method)
        {
            // Get attribute related variables
            OverrideAttribute attribute =
                (OverrideAttribute)Attribute.GetCustomAttribute(method, typeof(OverrideAttribute));

            // Check if method has been overrided before
            if (Overrides.Count(a => a.Key.Method == attribute.Method) > 0)
            {
                return;
            }

            // Create wrapper for override
            OverrideWrapper wrapper = new OverrideWrapper(attribute.Method, method, attribute);

            // Override
            wrapper.Override();

            // Add override to the list
            Overrides.Add(attribute, wrapper);
        }
        /// <summary>
        /// Calls the original method that was Overrideed
        /// </summary>
        /// <param name="instance">The instance for the method(null if static)</param>
        /// <param name="args">The arguments for the method</param>
        /// <returns>The value tahat the original function returns</returns>
        public static object CallOriginal(object instance = null, params object[] args)
        {
            StackTrace trace = new StackTrace(false);

            if (trace.FrameCount < 1)
            {
                throw new Exception("Invalid trace back to the original method! Please provide the methodinfo instead!");
            }

            MethodBase modded   = trace.GetFrame(1).GetMethod();
            MethodInfo original = null;

            if (!Attribute.IsDefined(modded, typeof(OverrideAttribute)))
            {
                modded = trace.GetFrame(2).GetMethod();
            }
            OverrideAttribute att = (OverrideAttribute)Attribute.GetCustomAttribute(modded, typeof(OverrideAttribute));

            if (att == null)
            {
                throw new Exception("This method can only be called from an overwritten method!");
            }
            if (!att.MethodFound)
            {
                throw new Exception("The original method was never found!");
            }
            original = att.Method;

            if (OverrideManager.Overrides.All(o => o.Value.Original != original))
            {
                throw new Exception("The Override specified was not found!");
            }

            OverrideWrapper wrapper = OverrideManager.Overrides.First(a => a.Value.Original == original).Value;

            return(wrapper.CallOriginal(args, instance));
        }