示例#1
0
        private static MethodDefinition GetHook(List <MethodDefinition> methodDefs, HookData hookData, string className, string methodName)
        {
            MethodDefinition methodDef = methodDefs[0];

            if (methodDefs.Count == 1)
            {
                return(methodDef);
            }

            ParameterCollection hookTypes = hookData.Method.Parameters;
            bool hookStatic = hookData.Method.Parameters.Count == 0 || hookData.Method.Parameters[0].ParameterType.Name != className;

            for (int i = 0; i < methodDefs.Count; i++)
            {
                if (methodDefs[i].IsStatic != hookStatic)
                {
                    methodDefs.RemoveAt(i--);
                }
            }

            if (hookTypes.Count == 0 || !hookStatic && hookTypes.Count == 1)
            {
                for (int i = 0; i < methodDefs.Count; i++)
                {
                    if (methodDefs[i].Parameters.Count == 0)
                    {
                        return(methodDefs[i]);
                    }
                }

                return(methodDef);
            }

            for (int i = 0; i < methodDefs.Count; i++)
            {
                if (!SafeMatch(methodDefs[i], hookData))
                {
                    methodDefs.RemoveAt(i--);
                }
            }

            if (methodDefs.Count > 1)
            {
                System.Text.StringBuilder hooks = new System.Text.StringBuilder("Could not determine which function to hook:\n");

                foreach (MethodDefinition md in methodDefs)
                {
                    hooks.Append($"{className}.{md.Name}(");

                    if (md.Parameters.Count > 0)
                    {
                        hooks.Append(md.Parameters[0].ParameterType.Name);

                        for (int i = 1; i < md.Parameters.Count; i++)
                        {
                            hooks.Append($", {md.Parameters[i].ParameterType.Name}");
                        }
                    }

                    hooks.Append(")\n");
                }

                Externs.MessageBox("Ambiguous hook!", hooks.ToString());
            }

            if (methodDefs.Count > 0)
            {
                methodDef = methodDefs[0];
            }

            return(methodDef);
        }
示例#2
0
        private static void ModDomain_UnhandledException(object sender, UnhandledExceptionEventArgs ex)
        {
            string caption = "Error in " + Assembly.GetExecutingAssembly().GetName();

            Externs.MessageBox(caption, ex.ExceptionObject.ToString());
        }