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