Esempio n. 1
0
        private void getProps()
        {
            if (_import == null || _token == 0)
            {
                return;
            }

            _methodProps = new MethodProps();
            _import.GetMethodProps(_token, out _methodProps.classToken, _methodProps.szMethod, Convert.ToUInt32(_methodProps.szMethod.Length), out _methodProps.pchMethod, out _methodProps.pwdAttr, out _methodProps.ppvSigBlob, out _methodProps.pcbSigBlob, out _methodProps.pulCodeRva, out _methodProps.pdwImplFlags);
        }
Esempio n. 2
0
        internal Function(Thread thread, FrameID frameID, ICorDebugILFrame corILFrame)
        {
            this.process    = thread.Process;
            this.thread     = thread;
            this.frameID    = frameID;
            this.CorILFrame = corILFrame;
            corFunction     = corILFrame.Function;
            module          = process.GetModule(corFunction.Module);

            methodProps = module.MetaData.GetMethodProps(corFunction.Token);

            // Force some callback when function steps out so that we can expire it
            stepOutStepper = new Stepper(this, "Function Tracker");
            stepOutStepper.StepOut();
            stepOutStepper.PauseWhenComplete = false;

            process.TraceMessage("Function " + this.ToString() + " created");
        }
Esempio n. 3
0
 internal DebugMethodInfo(DebugType declaringType, MethodProps methodProps)
 {
     this.declaringType = declaringType;
     this.methodProps = methodProps;
 }
Esempio n. 4
0
        private void getProps()
        {
            if (_import == null || _token == 0)
                return;

            _methodProps = new MethodProps();
            _import.GetMethodProps(_token, out _methodProps.classToken, _methodProps.szMethod, Convert.ToUInt32(_methodProps.szMethod.Length), out _methodProps.pchMethod, out _methodProps.pwdAttr, out _methodProps.ppvSigBlob, out _methodProps.pcbSigBlob, out _methodProps.pulCodeRva, out _methodProps.pdwImplFlags);
        }
Esempio n. 5
0
        /* Creates new instance of ModuleEx class */
        public ModuleEx(Module module)
        {
            int i;

            this.module = module;
            Hashtable hash = new Hashtable();

            bodiesHash = new Hashtable();

            string   moduleLocation = module.FullyQualifiedName;
            PeLoader peLoader       = new PeLoader(moduleLocation);

            /* Adding user strings to hash */
            MdPair[] userStrings = null;
            peLoader.GetUserStrings(ref userStrings);
            int userStringsCount = userStrings.Length;

            for (i = 0; i < userStringsCount; i++)
            {
                hash.Add(userStrings[i].token, userStrings[i].name);
            }

            /* Reading assembly references */
            MdPair[] assemblyRefs = null;
            peLoader.GetAssemblyRefs(ref assemblyRefs);
            int assemblyRefsCount = assemblyRefs.Length;

            /* Loading referenced assemblies */
            Hashtable assemblyHash = new Hashtable();

            AssemblyName[] assemblyRefNames = module.Assembly.GetReferencedAssemblies();
            for (i = 0; i < assemblyRefNames.Length; i++)
            {
                Assembly referencedAssembly = Assembly.Load(assemblyRefNames[i]);
                assemblyHash.Add(
                    assemblyRefNames[i].Name,
                    referencedAssembly
                    );
            }

            /* Adding assembly references to hash */
            for (i = 0; i < assemblyRefsCount; i++)
            {
                Assembly assembly = assemblyHash[assemblyRefs[i].name] as Assembly;

                if (assembly != null)
                {
                    hash.Add(assemblyRefs[i].token, assembly);
                }
            }

            /* Making hash table of modules */
            Assembly[] assemblyArray = new Assembly [assemblyHash.Count + 1];
            assemblyArray[0] = module.Assembly;
            assemblyHash.Values.CopyTo(assemblyArray, 1);

            Hashtable moduleHash = new Hashtable();

            for (i = 0; i < assemblyArray.Length; i++)
            {
                Module[] moduleArray = assemblyArray[i].GetModules();
                for (int j = 0; j < moduleArray.Length; j++)
                {
                    moduleHash.Add(moduleArray[j].Name, moduleArray[j]);
                }
            }

            /* Adding current module to hash */
            hash.Add(peLoader.GetModuleToken(), module);

            /* Reading module references */
            MdPair[] moduleRefs = null;
            peLoader.GetModuleRefs(ref moduleRefs);
            int moduleRefsCount = moduleRefs.Length;

            /* Adding modules to hash */
            for (i = 0; i < moduleRefsCount; i++)
            {
                Module mod = moduleHash[moduleRefs[i].name] as Module;

                if (mod != null)
                {
                    hash.Add(moduleRefs[i].token, mod);
                }
            }

            /* Reading type references */
            MdPair[] typeRefs = null;
            peLoader.GetTypeRefs(ref typeRefs);
            int typeRefsCount = typeRefs.Length;

            /* Adding not nested refrenced types to hash */
            for (i = 0; i < typeRefsCount; i++)
            {
                object   container = hash[typeRefs[i].extra];
                Assembly assembly  = container as Assembly;
                Module   mod       = container as Module;

                if (assembly != null || mod != null)
                {
                    typeRefs[i].extra = 0;
                }

                if (assembly != null)
                {
                    hash.Add(typeRefs[i].token, assembly.GetType(typeRefs[i].name));
                }
                else if (mod != null)
                {
                    hash.Add(typeRefs[i].token, mod.GetType(typeRefs[i].name));
                }
            }

            /* Adding nested refrenced types to hash */
            bool flag = true;

            while (flag)
            {
                flag = false;

                for (i = 0; i < typeRefsCount; i++)
                {
                    if (typeRefs[i].extra != 0)
                    {
                        Type encloser = hash[typeRefs[i].extra] as Type;

                        if (encloser == null)
                        {
                            flag = true;
                        }
                        else
                        {
                            typeRefs[i].extra = 0;
                            Type type =
                                encloser.GetNestedType(
                                    typeRefs[i].name,
                                    BindingFlags.Public | BindingFlags.NonPublic
                                    );

                            hash.Add(typeRefs[i].token, type);
                        }
                    }
                }
            }

            /* Reading type definitions */
            MdPair[] typeDefs = null;
            peLoader.GetTypeDefs(ref typeDefs);
            int typeDefsCount = typeDefs.Length;

            /* Adding not nested defined types to hash */
            for (i = 0; i < typeDefsCount; i++)
            {
                if (typeDefs[i].extra == 0)
                {
                    hash.Add(typeDefs[i].token, module.Assembly.GetType(typeDefs[i].name));
                }
            }

            /* Adding nested defined types to hash */
            flag = true;
            while (flag)
            {
                flag = false;

                for (i = 0; i < typeDefsCount; i++)
                {
                    if (typeDefs[i].extra != 0)
                    {
                        Type encloser = hash[typeDefs[i].extra] as Type;

                        if (encloser == null)
                        {
                            flag = true;
                        }
                        else
                        {
                            typeDefs[i].extra = 0;
                            Type type =
                                encloser.GetNestedType(
                                    typeDefs[i].name,
                                    BindingFlags.Public | BindingFlags.NonPublic
                                    );

                            hash.Add(typeDefs[i].token, type);
                        }
                    }
                }
            }

            /* Reading type specs */
            MdTypeSpec[] typeSpecs = null;
            peLoader.GetTypeSpecs(ref typeSpecs);
            int typeSpecsCount = typeSpecs.Length;

            /* Adding type specs to hash */
            for (i = 0; i < typeSpecsCount; i++)
            {
                Type t = formType(hash, typeSpecs[i].baseType, typeSpecs[i].decls);
                hash.Add(typeSpecs[i].token, t);
            }

            /* Adding members (methods and fields) for every type */
            int[] tokens = new int[typeDefsCount + typeRefsCount + typeSpecsCount];
            for (i = 0; i < typeDefsCount; i++)
            {
                tokens[i] = typeDefs[i].token;
            }
            for (i = 0; i < typeRefsCount; i++)
            {
                tokens[typeDefsCount + i] = typeRefs[i].token;
            }
            for (i = 0; i < typeSpecsCount; i++)
            {
                tokens[typeDefsCount + typeRefsCount + i] = typeSpecs[i].token;
            }

            for (i = 0; i < tokens.Length; i++)
            {
                Int32 tkTyp = tokens[i];
                Type  typ   = hash[tkTyp] as Type;

                MdMemberRef[] members = null;
                peLoader.GetMemberRefs(tkTyp, ref members);
                int membersCount = members.Length;

                for (int j = 0; j < membersCount; j++)
                {
                    MemberInfo[] instanceMemb =
                        typ.GetMember(
                            members[j].name,
                            MemberTypes.Constructor | MemberTypes.Method | MemberTypes.Field,
                            BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
                            );

                    MemberInfo[] staticMemb =
                        typ.GetMember(
                            members[j].name,
                            MemberTypes.Constructor | MemberTypes.Method | MemberTypes.Field,
                            BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic
                            );

                    int membCount = instanceMemb.Length + staticMemb.Length;

                    if (membCount > 0)
                    {
                        MemberInfo[] memb = new MemberInfo [membCount];
                        instanceMemb.CopyTo(memb, 0);
                        staticMemb.CopyTo(memb, instanceMemb.Length);

                        if (members[j].sig == null)
                        {
                            hash.Add(members[j].token, memb[0]);
                        }
                        else
                        {
                            fixParameters(hash, members[j].sig);

                            flag = true;
                            for (int k = 0; k < membCount && flag; k++)
                            {
                                if (memb[k] is MethodBase)
                                {
                                    MethodBase method = memb[k] as MethodBase;

                                    if (members[j].sig.Matches(method))
                                    {
                                        hash.Add(members[j].token, memb[k]);
                                        flag = false;
                                    }
                                }
                            }
                        }
                    }
                    //else
                    //    throw ...;
                }
            }

            /* Adding fields for every defined type */
            for (i = 0; i < typeDefsCount; i++)
            {
                Int32 tkTyp = typeDefs[i].token;
                Type  typ   = hash[tkTyp] as Type;

                MdPair[] fields = null;
                peLoader.GetFields(tkTyp, ref fields);
                int fieldsCount = fields.Length;

                for (int j = 0; j < fieldsCount; j++)
                {
                    MemberInfo[] members =
                        typ.GetMember(
                            fields[j].name,
                            MemberTypes.Field,
                            BindingFlags.DeclaredOnly | BindingFlags.Instance |
                            BindingFlags.Public | BindingFlags.NonPublic
                            );

                    if (members.Length == 0)
                    {
                        members =
                            typ.GetMember(
                                fields[j].name,
                                MemberTypes.Field,
                                BindingFlags.DeclaredOnly | BindingFlags.Static |
                                BindingFlags.Public | BindingFlags.NonPublic
                                );
                    }

                    if (members.Length > 0)
                    {
                        hash.Add(fields[j].token, members[0]);
                    }
                }
            }

            /* Adding methods for every defined type */
            Hashtable baseToProps = new Hashtable();

            for (i = 0; i < typeDefsCount; i++)
            {
                Int32 tkTyp = typeDefs[i].token;
                Type  typ   = hash[tkTyp] as Type;

                MdPair[] methods = null;
                peLoader.GetMethods(tkTyp, ref methods);
                int methodsCount = methods.Length;

                for (int j = 0; j < methodsCount; j++)
                {
                    MethodProps props = peLoader.GetMethodProps(methods[j].token);

                    MemberInfo[] instanceMembers =
                        typ.GetMember(
                            props.name,
                            MemberTypes.Constructor | MemberTypes.Method,
                            BindingFlags.DeclaredOnly | BindingFlags.Instance |
                            BindingFlags.Public | BindingFlags.NonPublic
                            );

                    MemberInfo[] staticMembers =
                        typ.GetMember(
                            props.name,
                            MemberTypes.Constructor | MemberTypes.Method,
                            BindingFlags.DeclaredOnly | BindingFlags.Static |
                            BindingFlags.Public | BindingFlags.NonPublic
                            );

                    int membersCount = instanceMembers.Length + staticMembers.Length;

                    if (membersCount > 0)
                    {
                        MethodBase[] members = new MethodBase [membersCount];
                        instanceMembers.CopyTo(members, 0);
                        staticMembers.CopyTo(members, instanceMembers.Length);

                        fixParameters(hash, props.sig);

                        flag = true;
                        for (int k = 0; k < membersCount && flag; k++)
                        {
                            if (props.sig.Matches(members[k]))
                            {
                                hash.Add(methods[j].token, members[k]);

                                if (props.methodCode.codeSize != 0)
                                {
                                    baseToProps.Add(members[k], props);
                                }

                                flag = false;
                            }
                        }
                    }
                    //else
                    //    throw ...;
                }
            }

            /* Adding defined global methods */
            MdPair[] globalMethods = null;
            peLoader.GetMethods(0, ref globalMethods);
            int globalMethodsCount = globalMethods.Length;

            MethodBase[] globalMethodsObj = module.GetMethods();

            for (i = 0; i < globalMethodsCount; i++)
            {
                MethodProps props = peLoader.GetMethodProps(globalMethods[i].token);
                fixParameters(hash, props.sig);

                flag = true;
                for (int j = 0; j < globalMethodsObj.Length && flag; j++)
                {
                    if (props.name.Equals(globalMethodsObj[j].Name))
                    {
                        if (props.sig.Matches(globalMethodsObj[j]))
                        {
                            hash.Add(globalMethods[i].token, globalMethodsObj[j]);

                            if (props.methodCode.codeSize != 0)
                            {
                                baseToProps.Add(globalMethodsObj[j], props);
                            }

                            flag = false;
                        }
                    }
                }
            }

            /* Reading bodies of defined methods */
            foreach (DictionaryEntry pair in baseToProps)
            {
                MethodBase  method = pair.Key as MethodBase;
                MethodProps props  = (MethodProps)(pair.Value);

                fixLocalVars(hash, props.methodCode);

                if (props.methodCode.ehDecoder != null)
                {
                    props.methodCode.ehDecoder.FixParams(hash);
                }

                bodiesHash.Add(
                    method,
                    new MethodEx(method, new ILMethodDecoder(props.methodCode, hash))
                    );
            }

            /* Debug output */
//            DictionaryEntry[] tokens = new DictionaryEntry [hash.Count];
//            hash.CopyTo(tokens,0);
//
//            StreamWriter w = new StreamWriter("debug_tokens.txt");
//            for (i = 0; i < hash.Count; i++)
//            {
//                Int32 key = (Int32)(tokens[i].Key);
//                object value = tokens[i].Value;
//                w.Write(key.ToString("X"));
//                w.Write(" -> ");
//                w.Write(value.GetType().ToString());
//                w.Write(" -> ");
//                w.WriteLine(value.ToString());
//            }
//
//            w.Close();
        }
 internal DebugMethodInfo(DebugType declaringType, MethodProps methodProps)
 {
     this.declaringType = declaringType;
     this.methodProps   = methodProps;
 }
Esempio n. 7
0
 internal MethodInfo(DebugType declaringType, MethodProps methodProps) : base(declaringType)
 {
     this.methodProps = methodProps;
 }