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); }
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); } }