示例#1
0
        void Save(ModuleVM[] files)
        {
            var list = new Tuple <DnModule, string> [files.Length];

            if (files.Length == 1)
            {
                var vm       = files[0];
                var filename = new PickSaveFilename().GetFilename(GetModuleFilename(vm.Module), GetDefaultExtension(GetModuleFilename(vm.Module), vm.IsExe, vm.Module.CorModule.IsManifestModule), PickFilenameConstants.DotNetAssemblyOrModuleFilter);
                if (string.IsNullOrEmpty(filename))
                {
                    return;
                }
                list[0] = Tuple.Create(vm.Module, filename);
            }
            else
            {
                var dir = new PickDirectory().GetDirectory(null);
                if (!Directory.Exists(dir))
                {
                    return;
                }
                for (int i = 0; i < files.Length; i++)
                {
                    var file     = files[i];
                    var filename = DebugOutputUtils.GetFilename(file.Module.Name);
                    var lf       = filename.ToUpperInvariant();
                    if (lf.EndsWith(".EXE") || lf.EndsWith(".DLL") || lf.EndsWith(".NETMODULE"))
                    {
                    }
                    else if (file.Module.CorModule.IsManifestModule)
                    {
                        filename += file.IsExe ? ".exe" : ".dll";
                    }
                    else
                    {
                        filename += ".netmodule";
                    }
                    list[i] = Tuple.Create(file.Module, Path.Combine(dir, filename));
                }
            }

            var data = new ProgressVM(Dispatcher.CurrentDispatcher, new PEFilesSaver(list));
            var win  = new ProgressDlg();

            win.DataContext = data;
            win.Owner       = appWindow.MainWindow;
            win.Title       = list.Length == 1 ? dnSpy_Debugger_Resources.ModuleSaveModuleTitle :
                              dnSpy_Debugger_Resources.ModuleSaveModulesTitle;
            var res = win.ShowDialog();

            if (res != true)
            {
                return;
            }
            if (!data.WasError)
            {
                return;
            }
            messageBoxManager.Show(string.Format(dnSpy_Debugger_Resources.ErrorOccurredX, data.ErrorMessage));
        }
示例#2
0
文件: Commands.cs 项目: ottrur/dnSpy
		protected override void Execute(LocalsCtxMenuContext context) {
			var value = GetValue(context);
			if (value == null)
				return;

			var filename = new PickSaveFilename().GetFilename(string.Empty, "bin", null);
			if (string.IsNullOrEmpty(filename))
				return;

			byte[] data;
			int? dataIndex = null, dataSize = null;
			if (value.IsString) {
				var s = value.String;
				data = s == null ? null : Encoding.Unicode.GetBytes(s);
			}
			else if (value.IsArray) {
				if (value.ArrayCount == 0)
					data = new byte[0];
				else {
					var elemValue = value.GetElementAtPosition(0);
					ulong elemSize = elemValue == null ? 0 : elemValue.Size;
					ulong elemAddr = elemValue == null ? 0 : elemValue.Address;
					ulong addr = value.Address;
					ulong totalSize = elemSize * value.ArrayCount;
					if (elemAddr == 0 || elemAddr < addr || elemAddr - addr > int.MaxValue || totalSize > int.MaxValue) {
						MainWindow.Instance.ShowMessageBox("Could not get array data");
						return;
					}
					data = value.ReadGenericValue();
					dataIndex = (int)(elemAddr - addr);
					dataSize = (int)totalSize;
				}
			}
			else
				data = value.ReadGenericValue();
			if (data == null) {
				MainWindow.Instance.ShowMessageBox("Could not read any data");
				return;
			}

			try {
				if (dataIndex == null)
					dataIndex = 0;
				if (dataSize == null)
					dataSize = data.Length - dataIndex.Value;
				using (var file = File.Create(filename))
					file.Write(data, dataIndex.Value, dataSize.Value);
			}
			catch (Exception ex) {
				MainWindow.Instance.ShowMessageBox(string.Format("Error saving data to '{0}'\nERROR: {1}", filename, ex.Message));
				return;
			}
		}
示例#3
0
        static void Save(ModuleVM[] files)
        {
            if (files.Length == 0)
            {
                return;
            }
            var buffer = new byte[0x10000];

            if (files.Length == 1)
            {
                var vm       = files[0];
                var filename = new PickSaveFilename().GetFilename(vm.Module.Name, GetDefaultExtension(vm.Module.Name, vm.IsExe), PickFilenameConstants.DotNetAssemblyOrModuleFilter);
                if (string.IsNullOrEmpty(filename))
                {
                    return;
                }
                Save(vm.Module, filename, buffer);
            }
            else
            {
                var dir = new PickDirectory().GetDirectory(null);
                if (string.IsNullOrEmpty(dir))
                {
                    return;
                }
                foreach (var file in files)
                {
                    var filename = DebugOutputUtils.GetFilename(file.Module.Name);
                    if (filename.IndexOf('.') < 0)
                    {
                        filename += file.IsExe ? ".exe" : ".dll";
                    }
                    bool saved = Save(file.Module, Path.Combine(dir, filename), buffer);
                    if (!saved)
                    {
                        return;
                    }
                }
            }
        }
示例#4
0
        public override void Execute(LocalsCtxMenuContext context)
        {
            var value = GetValue(context);

            if (value == null)
            {
                return;
            }

            var filename = new PickSaveFilename().GetFilename(string.Empty, "bin", null);

            if (string.IsNullOrEmpty(filename))
            {
                return;
            }

            byte[] data;
            int?   dataIndex = null, dataSize = null;

            if (value.IsString)
            {
                var s = value.String;
                data = s == null ? null : Encoding.Unicode.GetBytes(s);
            }
            else if (value.IsArray)
            {
                if (value.ArrayCount == 0)
                {
                    data = Array.Empty <byte>();
                }
                else
                {
                    var   elemValue = value.GetElementAtPosition(0);
                    ulong elemSize  = elemValue?.Size ?? 0;
                    ulong elemAddr  = elemValue?.Address ?? 0;
                    ulong addr      = value.Address;
                    ulong totalSize = elemSize * value.ArrayCount;
                    if (elemAddr == 0 || elemAddr < addr || elemAddr - addr > int.MaxValue || totalSize > int.MaxValue)
                    {
                        messageBoxService.Show(dnSpy_Debugger_Resources.LocalsSave_Error_CouldNotGetArrayData);
                        return;
                    }
                    data      = value.ReadGenericValue();
                    dataIndex = (int)(elemAddr - addr);
                    dataSize  = (int)totalSize;
                }
            }
            else
            {
                data = value.ReadGenericValue();
            }
            if (data == null)
            {
                messageBoxService.Show(dnSpy_Debugger_Resources.LocalsSave_Error_CouldNotReadAnyData);
                return;
            }

            try {
                if (dataIndex == null)
                {
                    dataIndex = 0;
                }
                if (dataSize == null)
                {
                    dataSize = data.Length - dataIndex.Value;
                }
                using (var file = File.Create(filename))
                    file.Write(data, dataIndex.Value, dataSize.Value);
            }
            catch (Exception ex) {
                messageBoxService.Show(string.Format(dnSpy_Debugger_Resources.LocalsSave_Error_CouldNotSaveDataToFilename, filename, ex.Message));
                return;
            }
        }