Beispiel #1
0
        private void InjectReturnHook(MethodReference methodRef, bool haveReturnValue)
        {
            try {
                foreach (var typeDef in m_ModuleDefinition.Types)
                {
                    if (ScriptProcessor.DontInjectTypes.Contains(typeDef.FullName))
                    {
                        continue;
                    }
                    if (!ScriptProcessor.CheckType(typeDef, methodRef))
                    {
                        continue;
                    }
                    foreach (var methodDef in typeDef.Methods)
                    {
                        var fullName = methodDef.FullName;
                        if (fullName == methodRef.FullName)
                        {
                            continue;
                        }
                        if (ScriptProcessor.DontInjectMethods.Contains(fullName))
                        {
                            continue;
                        }
                        if (!ScriptProcessor.CheckMethod(methodDef, methodRef))
                        {
                            continue;
                        }
                        var body = methodDef.Body;
                        body.InitLocals = true;

                        var ilProcessor = body.GetILProcessor();
                        body.Variables.Add(new VariableDefinition(m_ObjectArrayTypeRef));
                        int arrLocalIndex = body.Variables.Count - 1;
                        int ct            = methodDef.Parameters.Count;

                        var insertPoint = FindRet(body, null);
                        while (null != insertPoint)
                        {
                            insertPoint.OpCode  = OpCodes.Nop;
                            insertPoint.Operand = null;
                            var newRet = ilProcessor.Create(OpCodes.Ret);
                            ilProcessor.InsertAfter(insertPoint, newRet);
                            insertPoint = newRet;

                            AddReturnHook(arrLocalIndex, ct, methodDef, methodRef, haveReturnValue, insertPoint, ilProcessor);
                            insertPoint = FindRet(body, insertPoint);
                        }
                    }
                }
            } catch (Exception ex) {
                ScriptProcessor.ErrorTxts.Add(string.Format("InjectPrologue({0}), exception:{1}\n{2}", methodRef.FullName, ex.Message, ex.StackTrace));
            }
        }
Beispiel #2
0
        private void InjectMemoryLog(MethodReference methodRef, bool haveReturnValue)
        {
            try {
                foreach (var typeDef in m_ModuleDefinition.Types)
                {
                    if (ScriptProcessor.DontInjectTypes.Contains(typeDef.FullName))
                    {
                        continue;
                    }
                    if (!ScriptProcessor.CheckType(typeDef, methodRef))
                    {
                        continue;
                    }
                    foreach (var methodDef in typeDef.Methods)
                    {
                        var fullName = methodDef.FullName;
                        if (fullName == methodRef.FullName)
                        {
                            continue;
                        }
                        if (ScriptProcessor.DontInjectMethods.Contains(fullName))
                        {
                            continue;
                        }
                        if (!ScriptProcessor.CheckMethod(methodDef, methodRef))
                        {
                            continue;
                        }
                        var body = methodDef.Body;
                        if (HaveNew(methodDef))
                        {
                            string tag = CalcTag(methodDef);

                            var ilProcessor = body.GetILProcessor();
                            var insertPoint = body.Instructions[0];
                            if (insertPoint.OpCode == OpCodes.Nop)
                            {
                                insertPoint = body.Instructions[1];
                            }
                            else
                            {
                                ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Nop));
                            }
                            ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Ldc_I4_0));
                            ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Ldstr, tag));
                            ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Call, methodRef));
                            if (haveReturnValue)
                            {
                                ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Pop));
                            }
                            //退出前再调用一次
                            insertPoint = FindRet(body, null);
                            while (null != insertPoint)
                            {
                                insertPoint.OpCode  = OpCodes.Nop;
                                insertPoint.Operand = null;
                                var newRet = ilProcessor.Create(OpCodes.Ret);
                                ilProcessor.InsertAfter(insertPoint, newRet);
                                insertPoint = newRet;

                                ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Ldc_I4_1));
                                ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Ldstr, tag));
                                ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Call, methodRef));
                                if (haveReturnValue)
                                {
                                    ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Pop));
                                }
                                insertPoint = FindRet(body, insertPoint);
                            }
                        }
                    }
                }
            } catch (Exception ex) {
                ScriptProcessor.ErrorTxts.Add(string.Format("InjectPrologue({0}), exception:{1}\n{2}", methodRef.FullName, ex.Message, ex.StackTrace));
            }
        }