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) { System.Diagnostics.StackTrace trace = new System.Diagnostics.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)); }