Beispiel #1
0
        /// <summary>
        /// Saves all asms/hex docs and returns true if all of them were saved to disk
        /// </summary>
        /// <param name="objs">All objects to save</param>
        /// <returns></returns>
        public static bool SaveAssemblies(IEnumerable <IUndoObject> objs)
        {
            var objsAry = objs.ToArray();

            if (objsAry.Length == 0)
            {
                return(true);
            }

            if (objsAry.Length == 1)
            {
                SaveOptionsVM options;

                var asm = objsAry[0] as LoadedAssembly;
                if (asm != null)
                {
                    var optsData = new SaveModuleOptionsVM(asm);
                    var optsWin  = new SaveModuleOptionsDlg();
                    optsWin.Owner       = MainWindow.Instance;
                    optsWin.DataContext = optsData;
                    var res = optsWin.ShowDialog();
                    if (res != true)
                    {
                        return(false);
                    }
                    options = optsData;
                }
                else
                {
                    var doc      = (AsmEdHexDocument)objsAry[0];
                    var optsData = new SaveHexOptionsVM(doc);
                    var optsWin  = new SaveHexOptionsDlg();
                    optsWin.Owner       = MainWindow.Instance;
                    optsWin.DataContext = optsData;
                    var res = optsWin.ShowDialog();
                    if (res != true)
                    {
                        return(false);
                    }
                    options = optsData;
                }

                var data = new SaveMultiModuleVM(MainWindow.Instance.Dispatcher, options);
                var win  = new SaveSingleModuleDlg();
                win.Owner       = MainWindow.Instance;
                win.DataContext = data;
                data.Save();
                win.ShowDialog();
                return(MarkAsSaved(data, objsAry));
            }
            else
            {
                var data = new SaveMultiModuleVM(MainWindow.Instance.Dispatcher, objsAry);
                var win  = new SaveMultiModuleDlg();
                win.Owner       = MainWindow.Instance;
                win.DataContext = data;
                win.ShowDialog();
                return(MarkAsSaved(data, objsAry));
            }
        }
Beispiel #2
0
        public bool Save(IEnumerable <object> docs)
        {
            var objsAry = Distinct(docs).ToArray();

            if (objsAry.Length == 0)
            {
                return(true);
            }

            if (objsAry.Length == 1)
            {
                SaveOptionsVM options;

                if (objsAry[0] is IDsDocument document)
                {
                    var optsData = new SaveModuleOptionsVM(document);
                    var optsWin  = new SaveModuleOptionsDlg();
                    optsWin.Owner       = appWindow.MainWindow;
                    optsWin.DataContext = optsData;
                    var res = optsWin.ShowDialog();
                    if (res != true)
                    {
                        return(false);
                    }
                    options = optsData;
                }
                else
                {
                    var buffer = objsAry[0] as HexBuffer;
                    Debug.Assert(!(buffer is null));
                    var optsData = new SaveHexOptionsVM(buffer);
                    var optsWin  = new SaveHexOptionsDlg();
                    optsWin.Owner       = appWindow.MainWindow;
                    optsWin.DataContext = optsData;
                    var res = optsWin.ShowDialog();
                    if (res != true)
                    {
                        return(false);
                    }
                    options = optsData;
                }

                var data = new SaveMultiModuleVM(mmapDisabler.Value, Dispatcher.CurrentDispatcher, options);
                var win  = new SaveSingleModuleDlg();
                win.Owner       = appWindow.MainWindow;
                win.DataContext = data;
                data.Save();
                win.ShowDialog();
                return(MarkAsSaved(data, objsAry));
            }
            else
            {
                var data = new SaveMultiModuleVM(mmapDisabler.Value, Dispatcher.CurrentDispatcher, objsAry);
                var win  = new SaveMultiModuleDlg();
                win.Owner       = appWindow.MainWindow;
                win.DataContext = data;
                win.ShowDialog();
                return(MarkAsSaved(data, objsAry));
            }
        }
Beispiel #3
0
		/// <summary>
		/// Saves all asms/hex docs and returns true if all of them were saved to disk
		/// </summary>
		/// <param name="objs">All objects to save</param>
		/// <returns></returns>
		public static bool SaveAssemblies(IEnumerable<IUndoObject> objs) {
			var objsAry = objs.ToArray();
			if (objsAry.Length == 0)
				return true;

			if (objsAry.Length == 1) {
				SaveOptionsVM options;

				var file = UndoCommandManager.Instance.TryGetDnSpyFile(objsAry[0]);
				if (file != null) {
					var optsData = new SaveModuleOptionsVM(file);
					var optsWin = new SaveModuleOptionsDlg();
					optsWin.Owner = MainWindow.Instance;
					optsWin.DataContext = optsData;
					var res = optsWin.ShowDialog();
					if (res != true)
						return false;
					options = optsData;
				}
				else {
					var doc = UndoCommandManager.Instance.TryGetAsmEdHexDocument(objsAry[0]);
					Debug.Assert(doc != null);
					var optsData = new SaveHexOptionsVM(doc);
					var optsWin = new SaveHexOptionsDlg();
					optsWin.Owner = MainWindow.Instance;
					optsWin.DataContext = optsData;
					var res = optsWin.ShowDialog();
					if (res != true)
						return false;
					options = optsData;
				}

				var data = new SaveMultiModuleVM(MainWindow.Instance.Dispatcher, options);
				var win = new SaveSingleModuleDlg();
				win.Owner = MainWindow.Instance;
				win.DataContext = data;
				data.Save();
				win.ShowDialog();
				return MarkAsSaved(data, objsAry);
			}
			else {
				var data = new SaveMultiModuleVM(MainWindow.Instance.Dispatcher, objsAry);
				var win = new SaveMultiModuleDlg();
				win.Owner = MainWindow.Instance;
				win.DataContext = data;
				win.ShowDialog();
				return MarkAsSaved(data, objsAry);
			}
		}
Beispiel #4
0
		/// <summary>
		/// Saves all asms/hex docs and returns true if all of them were saved to disk
		/// </summary>
		/// <param name="objs">All objects to save</param>
		/// <returns></returns>
		public static bool SaveAssemblies(IEnumerable<IUndoObject> objs) {
			var objsAry = objs.ToArray();
			if (objsAry.Length == 0)
				return true;

			if (objsAry.Length == 1) {
				SaveOptionsVM options;

				var asm = objsAry[0] as LoadedAssembly;
				if (asm != null) {
					var optsData = new SaveModuleOptionsVM(asm);
					var optsWin = new SaveModuleOptionsDlg();
					optsWin.Owner = MainWindow.Instance;
					optsWin.DataContext = optsData;
					var res = optsWin.ShowDialog();
					if (res != true)
						return false;
					options = optsData;
				}
				else {
					var doc = (AsmEdHexDocument)objsAry[0];
					var optsData = new SaveHexOptionsVM(doc);
					var optsWin = new SaveHexOptionsDlg();
					optsWin.Owner = MainWindow.Instance;
					optsWin.DataContext = optsData;
					var res = optsWin.ShowDialog();
					if (res != true)
						return false;
					options = optsData;
				}

				var data = new SaveMultiModuleVM(MainWindow.Instance.Dispatcher, options);
				var win = new SaveSingleModuleDlg();
				win.Owner = MainWindow.Instance;
				win.DataContext = data;
				data.Save();
				win.ShowDialog();
				return MarkAsSaved(data, objsAry);
			}
			else {
				var data = new SaveMultiModuleVM(MainWindow.Instance.Dispatcher, objsAry);
				var win = new SaveMultiModuleDlg();
				win.Owner = MainWindow.Instance;
				win.DataContext = data;
				win.ShowDialog();
				return MarkAsSaved(data, objsAry);
			}
		}
Beispiel #5
0
        void Save(SaveHexOptionsVM hex, ref byte[] buffer)
        {
            var progress = new HexFileProgress(GetSize(hex.Document.StartOffset, hex.Document.EndOffset));

            fileProgress = progress;
            if (buffer == null)
            {
                buffer = new byte[64 * 1024];
            }

            try {
                if (File.Exists(hex.FileName))
                {
                    File.Delete(hex.FileName);
                }
                using (var stream = File.OpenWrite(hex.FileName)) {
                    ulong offs = hex.Document.StartOffset;
                    ulong end  = hex.Document.EndOffset;
                    while (offs <= end)
                    {
                        ThrowIfCanceled();

                        ulong bytesLeft    = GetSize(offs, end);
                        int   bytesToWrite = bytesLeft > (ulong)buffer.Length ? buffer.Length : (int)bytesLeft;
                        hex.Document.Read(offs, buffer, 0, bytesToWrite);
                        stream.Write(buffer, 0, bytesToWrite);
                        progress.BytesWritten += (ulong)bytesToWrite;
                        NotifyProgressUpdated();

                        ulong nextOffs = offs + (ulong)bytesToWrite;
                        if (nextOffs < offs)
                        {
                            break;
                        }
                        offs = nextOffs;
                    }
                }
            }
            catch {
                DeleteFile(hex.FileName);
                throw;
            }
        }
Beispiel #6
0
        void Save(SaveHexOptionsVM hex, ref byte[] buffer)
        {
            var progress = new HexFileProgress(GetSize(hex.Buffer.Span.Start, hex.Buffer.Span.End));

            fileProgress = progress;
            if (buffer == null)
            {
                buffer = new byte[64 * 1024];
            }

            try {
                if (File.Exists(hex.FileName))
                {
                    File.Delete(hex.FileName);
                }
                using (var stream = File.OpenWrite(hex.FileName)) {
                    var pos = hex.Buffer.Span.Start;
                    var end = hex.Buffer.Span.End;
                    while (pos < end)
                    {
                        ThrowIfCanceled();

                        ulong bytesLeft    = GetSize(pos, end);
                        int   bytesToWrite = bytesLeft > (ulong)buffer.Length ? buffer.Length : (int)bytesLeft;
                        hex.Buffer.ReadBytes(pos, buffer, 0, bytesToWrite);
                        stream.Write(buffer, 0, bytesToWrite);
                        progress.BytesWritten += (ulong)bytesToWrite;
                        NotifyProgressUpdated();

                        pos = pos + (ulong)bytesToWrite;
                    }
                }
            }
            catch {
                DeleteFile(hex.FileName);
                throw;
            }
        }
Beispiel #7
0
 public SaveHexOptionsVM CopyTo(SaveHexOptionsVM other)
 {
     other.FileName = this.FileName;
     return(other);
 }
Beispiel #8
0
		public SaveHexOptionsVM CopyTo(SaveHexOptionsVM other) {
			other.FileName = this.FileName;
			return other;
		}
Beispiel #9
0
 public SaveHexOptionsVM CopyTo(SaveHexOptionsVM other)
 {
     other.FileName         = FileName;
     other.OriginalFileName = OriginalFileName;
     return(other);
 }
Beispiel #10
0
		void Save(SaveHexOptionsVM hex, ref byte[] buffer) {
			var progress = new HexFileProgress(GetSize(hex.Document.StartOffset, hex.Document.EndOffset));
			fileProgress = progress;
			if (buffer == null)
				buffer = new byte[64 * 1024];

			try {
				if (File.Exists(hex.FileName))
					File.Delete(hex.FileName);
				using (var stream = File.OpenWrite(hex.FileName)) {
					ulong offs = hex.Document.StartOffset;
					ulong end = hex.Document.EndOffset;
					while (offs <= end) {
						ThrowIfCanceled();

						ulong bytesLeft = GetSize(offs, end);
						int bytesToWrite = bytesLeft > (ulong)buffer.Length ? buffer.Length : (int)bytesLeft;
						hex.Document.Read(offs, buffer, 0, bytesToWrite);
						stream.Write(buffer, 0, bytesToWrite);
						progress.BytesWritten += (ulong)bytesToWrite;
						NotifyProgressUpdated();

						ulong nextOffs = offs + (ulong)bytesToWrite;
						if (nextOffs < offs)
							break;
						offs = nextOffs;
					}
				}
			}
			catch {
				DeleteFile(hex.FileName);
				throw;
			}
		}
Beispiel #11
0
		public bool Save(IEnumerable<object> docs) {
			var objsAry = Distinct(docs).ToArray();
			if (objsAry.Length == 0)
				return true;

			if (objsAry.Length == 1) {
				SaveOptionsVM options;

				var document = objsAry[0] as IDsDocument;
				if (document != null) {
					var optsData = new SaveModuleOptionsVM(document);
					var optsWin = new SaveModuleOptionsDlg();
					optsWin.Owner = appWindow.MainWindow;
					optsWin.DataContext = optsData;
					var res = optsWin.ShowDialog();
					if (res != true)
						return false;
					options = optsData;
				}
				else {
					var buffer = objsAry[0] as HexBuffer;
					Debug.Assert(buffer != null);
					var optsData = new SaveHexOptionsVM(buffer);
					var optsWin = new SaveHexOptionsDlg();
					optsWin.Owner = appWindow.MainWindow;
					optsWin.DataContext = optsData;
					var res = optsWin.ShowDialog();
					if (res != true)
						return false;
					options = optsData;
				}

				var data = new SaveMultiModuleVM(mmapDisabler.Value, Dispatcher.CurrentDispatcher, options);
				var win = new SaveSingleModuleDlg();
				win.Owner = appWindow.MainWindow;
				win.DataContext = data;
				data.Save();
				win.ShowDialog();
				return MarkAsSaved(data, objsAry);
			}
			else {
				var data = new SaveMultiModuleVM(mmapDisabler.Value, Dispatcher.CurrentDispatcher, objsAry);
				var win = new SaveMultiModuleDlg();
				win.Owner = appWindow.MainWindow;
				win.DataContext = data;
				win.ShowDialog();
				return MarkAsSaved(data, objsAry);
			}
		}
Beispiel #12
0
		void Save(SaveHexOptionsVM hex, ref byte[] buffer) {
			var progress = new HexFileProgress(GetSize(hex.Buffer.Span.Start, hex.Buffer.Span.End));
			fileProgress = progress;
			if (buffer == null)
				buffer = new byte[64 * 1024];

			try {
				if (File.Exists(hex.FileName))
					File.Delete(hex.FileName);
				using (var stream = File.OpenWrite(hex.FileName)) {
					var pos = hex.Buffer.Span.Start;
					var end = hex.Buffer.Span.End;
					while (pos < end) {
						ThrowIfCanceled();

						ulong bytesLeft = GetSize(pos, end);
						int bytesToWrite = bytesLeft > (ulong)buffer.Length ? buffer.Length : (int)bytesLeft;
						hex.Buffer.ReadBytes(pos, buffer, 0, bytesToWrite);
						stream.Write(buffer, 0, bytesToWrite);
						progress.BytesWritten += (ulong)bytesToWrite;
						NotifyProgressUpdated();

						pos = pos + (ulong)bytesToWrite;
					}
				}
			}
			catch {
				DeleteFile(hex.FileName);
				throw;
			}
		}
Beispiel #13
0
        /// <summary>
        /// Saves all asms/hex docs and returns true if all of them were saved to disk
        /// </summary>
        /// <param name="objs">All objects to save</param>
        /// <returns></returns>
        public static bool SaveAssemblies(IEnumerable <IUndoObject> objs)
        {
            var objsAry = objs.ToArray();

            if (objsAry.Length == 0)
            {
                return(true);
            }

            if (objsAry.Length == 1)
            {
                SaveOptionsVM options;

                var file = UndoCommandManager.Instance.TryGetDnSpyFile(objsAry[0]);
                if (file != null)
                {
                    var optsData = new SaveModuleOptionsVM(file);
                    var optsWin  = new SaveModuleOptionsDlg();
                    optsWin.Owner       = MainWindow.Instance;
                    optsWin.DataContext = optsData;
                    var res = optsWin.ShowDialog();
                    if (res != true)
                    {
                        return(false);
                    }
                    options = optsData;
                }
                else
                {
                    var doc = UndoCommandManager.Instance.TryGetAsmEdHexDocument(objsAry[0]);
                    Debug.Assert(doc != null);
                    var optsData = new SaveHexOptionsVM(doc);
                    var optsWin  = new SaveHexOptionsDlg();
                    optsWin.Owner       = MainWindow.Instance;
                    optsWin.DataContext = optsData;
                    var res = optsWin.ShowDialog();
                    if (res != true)
                    {
                        return(false);
                    }
                    options = optsData;
                }

                var data = new SaveMultiModuleVM(MainWindow.Instance.Dispatcher, options);
                var win  = new SaveSingleModuleDlg();
                win.Owner       = MainWindow.Instance;
                win.DataContext = data;
                data.Save();
                win.ShowDialog();
                return(MarkAsSaved(data, objsAry));
            }
            else
            {
                var data = new SaveMultiModuleVM(MainWindow.Instance.Dispatcher, objsAry);
                var win  = new SaveMultiModuleDlg();
                win.Owner       = MainWindow.Instance;
                win.DataContext = data;
                win.ShowDialog();
                return(MarkAsSaved(data, objsAry));
            }
        }