Esempio n. 1
0
        DnSpyFile LoadDynamic(DnModule dnModule, bool canLoadDynFile)
        {
            var file = FindDynamic(dnModule);

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

            if (DebugManager.Instance.ProcessState != DebuggerProcessState.Stopped)
            {
                return(null);
            }
            if (!canLoadDynFile)
            {
                return(null);
            }

            var manifestDnModule = dnModule.Assembly.Modules[0];
            var manifestKey      = CorModuleDefFile.CreateKey(manifestDnModule);
            var manMod           = FindAssemblyByKey(manifestKey);

            Debug.Assert(manMod == null);
            if (manMod != null)
            {
                return(null);
            }

            manMod = FindDynamic(manifestDnModule);
            Debug.Assert(manMod == null);
            if (manMod != null)
            {
                return(null);
            }

            var modules = manifestDnModule.Assembly.Modules;
            var dict    = new Dictionary <ModuleDef, CorModuleDefFile>(modules.Length);

            foreach (var module in modules)
            {
                UpdateResolver(module.GetOrCreateCorModuleDef());
                dict.Add(module.GetOrCreateCorModuleDef(), new CorModuleDefFile(dict, module, UseDebugSymbols));
            }
            Initialize(dict.Select(a => a.Value.DnModule.CorModuleDef));

            manMod = dict[manifestDnModule.CorModuleDef];
            DnSpyFileList.AddFile(manMod, true, true, false);

            return(dict[dnModule.CorModuleDef]);
        }
Esempio n. 2
0
        void OpenNewAssembly()
        {
            if (openAssembly == null)
            {
                throw new InvalidOperationException();
            }

            var file = openAssembly.Open();

            if (file == null)
            {
                return;
            }

            dnSpyFileList.AddFile(file, true, false);
        }
Esempio n. 3
0
        DnSpyFile LoadFromMemory(DnModule dnModule, bool canLoadDynFile)
        {
            Debug.Assert(!dnModule.IsDynamic);
            if (dnModule.Address == 0)
            {
                return(null);
            }

            var file = FindMemory(dnModule);

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

            var manifestDnModule = dnModule.Assembly.Modules[0];
            var manifestKey      = MemoryModuleDefFile.CreateKey(manifestDnModule.Process, manifestDnModule.Address);
            var manMod           = FindAssemblyByKey(manifestKey);

            Debug.Assert(manMod == null);
            if (manMod != null)
            {
                return(null);
            }

            manMod = FindMemory(manifestDnModule);
            Debug.Assert(manMod == null);
            if (manMod != null)
            {
                return(null);
            }

            var modules = manifestDnModule.Assembly.Modules;
            var dict    = new Dictionary <ModuleDef, MemoryModuleDefFile>(modules.Length);
            var files   = new List <MemoryModuleDefFile>(modules.Length);
            MemoryModuleDefFile result = null;

            foreach (var module in modules)
            {
                MemoryModuleDefFile mfile;
                try {
                    mfile = MemoryModuleDefFile.Create(dict, module, UseDebugSymbols);
                    UpdateResolver(mfile.ModuleDef);
                    if (module == dnModule)
                    {
                        result = mfile;
                    }
                }
                catch {
                    // The PE headers and/or .NET headers are probably corrupt
                    return(LoadDynamic(dnModule, canLoadDynFile));
                }
                files.Add(mfile);
                dict.Add(mfile.ModuleDef, mfile);
            }
            Debug.Assert(result != null);
            if (files.Count == 0)
            {
                return(null);
            }
            var asm = files[0].AssemblyDef;

            if (asm == null)
            {
                if (files.Count > 1)
                {
                    asm = files[0].ModuleDef.UpdateRowId(new AssemblyDefUser("???"));
                    asm.Modules.Add(files[0].ModuleDef);
                }
            }
            asm.Modules.Clear();
            for (int i = 0; i < files.Count; i++)
            {
                asm.Modules.Add(files[i].ModuleDef);
            }

            DnSpyFileList.AddFile(files[0], true, true, false);

            return(result);
        }