ModuleDef LoadMemoryModule(DbgModule module)
        {
            if (module == null)
            {
                throw new ArgumentNullException(nameof(module));
            }

            if (!TryGetRuntimeInfo(module.Runtime, out var info))
            {
                return(null);
            }

            Debug.Assert(!module.IsDynamic);
            if (!module.HasAddress)
            {
                return(null);
            }

            var doc = FindMemoryModule(module);

            if (doc != null)
            {
                return(doc);
            }

            MemoryModuleDefDocument result = null;

            lock (lockObj) {
                doc = FindMemoryModule(module);
                if (doc != null)
                {
                    return(doc);
                }

                var modules = info.AssemblyInfoProvider.GetAssemblyModules(module);
                if (modules.Length == 0)
                {
                    return(null);
                }
                var manifestModule = modules[0];
                var manifestKey    = MemoryModuleDefDocument.CreateKey(manifestModule.Process, manifestModule.Address);
                var manMod         = FindDocument(manifestKey);
                Debug.Assert(manMod == null);
                if (manMod != null)
                {
                    return(null);
                }

                var manDoc = FindMemoryModule(manifestModule);
                Debug.Assert(manDoc == null);
                if (manDoc != null)
                {
                    return(null);
                }

                var docs = new List <MemoryModuleDefDocument>(modules.Length);
                foreach (var m in modules)
                {
                    MemoryModuleDefDocument modDoc;
                    try {
                        modDoc = MemoryModuleDefDocument.Create(this, m, UseDebugSymbols);
                        UpdateResolver(modDoc.ModuleDef);
                        if (m == module)
                        {
                            result = modDoc;
                        }
                    }
                    catch {
                        // The PE headers and/or .NET headers are probably corrupt
                        return(LoadDynamicModule(module));
                    }
                    docs.Add(modDoc);
                }
                Debug.Assert(result != null);
                if (docs.Count == 0 || result == null)
                {
                    return(null);
                }
                var asmFile = MemoryModuleDefDocument.CreateAssembly(docs);
                var asm     = docs[0].AssemblyDef;
                if (asm == null)
                {
                    if (docs.Count > 1)
                    {
                        asm = docs[0].ModuleDef.UpdateRowId(new AssemblyDefUser("???"));
                        asm.Modules.Add(docs[0].ModuleDef);
                    }
                }
                asm.Modules.Clear();
                for (int i = 0; i < docs.Count; i++)
                {
                    RemoveFromAssembly(docs[i].ModuleDef);
                    asm.Modules.Add(docs[i].ModuleDef);
                }

                var addedFile = documentProvider.GetOrAdd(asmFile);
                Debug.Assert(addedFile == asmFile);
            }

            // The modules got loaded for the first time, but it's possible that the debugger is using the
            // old disk file modules. Raise an event so the debugger rereads the memory.
            var newModules = GetModules(result.Process, result.Address);

            if (newModules.Length > 0)
            {
                dbgModuleMemoryRefreshedNotifier.Value.RaiseModulesRefreshed(newModules);
            }

            return(result.ModuleDef);
        }
Esempio n. 2
0
        ModuleDef LoadMemoryModule(DbgModule module)
        {
            if (module == null)
            {
                throw new ArgumentNullException(nameof(module));
            }

            if (!TryGetRuntimeInfo(module.Runtime, out var info))
            {
                return(null);
            }

            Debug.Assert(!module.IsDynamic);
            if (!module.HasAddress)
            {
                return(null);
            }

            var doc = FindMemoryModule(module);

            if (doc != null)
            {
                return(doc);
            }

            lock (lockObj) {
                doc = FindMemoryModule(module);
                if (doc != null)
                {
                    return(doc);
                }

                var modules = info.AssemblyInfoProvider.GetAssemblyModules(module);
                if (modules.Length == 0)
                {
                    return(null);
                }
                var manifestModule = modules[0];
                var manifestKey    = MemoryModuleDefDocument.CreateKey(manifestModule.Process, manifestModule.Address);
                var manMod         = FindDocument(manifestKey);
                Debug.Assert(manMod == null);
                if (manMod != null)
                {
                    return(null);
                }

                var manDoc = FindMemoryModule(manifestModule);
                Debug.Assert(manDoc == null);
                if (manDoc != null)
                {
                    return(null);
                }

                var docs = new List <MemoryModuleDefDocument>(modules.Length);
                MemoryModuleDefDocument result = null;
                foreach (var m in modules)
                {
                    MemoryModuleDefDocument modDoc;
                    try {
                        modDoc = MemoryModuleDefDocument.Create(this, m, UseDebugSymbols);
                        UpdateResolver(modDoc.ModuleDef);
                        if (m == module)
                        {
                            result = modDoc;
                        }
                    }
                    catch {
                        // The PE headers and/or .NET headers are probably corrupt
                        return(LoadDynamicModule(module));
                    }
                    docs.Add(modDoc);
                }
                Debug.Assert(result != null);
                if (docs.Count == 0 || result == null)
                {
                    return(null);
                }
                var asmFile = MemoryModuleDefDocument.CreateAssembly(docs);
                var asm     = docs[0].AssemblyDef;
                if (asm == null)
                {
                    if (docs.Count > 1)
                    {
                        asm = docs[0].ModuleDef.UpdateRowId(new AssemblyDefUser("???"));
                        asm.Modules.Add(docs[0].ModuleDef);
                    }
                }
                asm.Modules.Clear();
                for (int i = 0; i < docs.Count; i++)
                {
                    RemoveFromAssembly(docs[i].ModuleDef);
                    asm.Modules.Add(docs[i].ModuleDef);
                }

                var addedFile = documentProvider.GetOrAdd(asmFile);
                Debug.Assert(addedFile == asmFile);

                return(result.ModuleDef);
            }
        }