diff --git a/renderdocui/Windows/BufferViewer.cs b/renderdocui/Windows/BufferViewer.cs index af93f17b4..f277922ba 100644 --- a/renderdocui/Windows/BufferViewer.cs +++ b/renderdocui/Windows/BufferViewer.cs @@ -2176,45 +2176,53 @@ namespace renderdocui.Windows if (res == DialogResult.OK) { - StreamWriter writer = File.CreateText(csvSaveDialog.FileName); - - if (MeshView) + try { - writer.Write("Vertex,"); - writer.Write("Index,"); - } - else - { - writer.Write("Row,"); - } + StreamWriter writer = File.CreateText(csvSaveDialog.FileName); - UIState ui = m_ContextUIState; - for (int i = 0; i < ui.m_Input.BufferFormats.Length; i++) - { - for (int j = 0; j < ui.m_Input.BufferFormats[i].format.compCount - 1; j++) - writer.Write(ui.m_Input.BufferFormats[i].name + " " + j + ","); - writer.Write(ui.m_Input.BufferFormats[i].name + " " + (ui.m_Input.BufferFormats[i].format.compCount - 1)); - - if (i < ui.m_Input.BufferFormats.Length - 1) - writer.Write(","); - } - - writer.Write(Environment.NewLine); - - foreach (DataGridViewRow row in ui.m_GridView.Rows) - { - for (int i = 0; i < row.Cells.Count; i++) + if (MeshView) { - writer.Write(row.Cells[i].Value.ToString()); - if (i < row.Cells.Count - 1) + writer.Write("Vertex,"); + writer.Write("Index,"); + } + else + { + writer.Write("Row,"); + } + + UIState ui = m_ContextUIState; + for (int i = 0; i < ui.m_Input.BufferFormats.Length; i++) + { + for (int j = 0; j < ui.m_Input.BufferFormats[i].format.compCount - 1; j++) + writer.Write(ui.m_Input.BufferFormats[i].name + " " + j + ","); + writer.Write(ui.m_Input.BufferFormats[i].name + " " + (ui.m_Input.BufferFormats[i].format.compCount - 1)); + + if (i < ui.m_Input.BufferFormats.Length - 1) writer.Write(","); } writer.Write(Environment.NewLine); - } - writer.Flush(); - writer.Close(); + foreach (DataGridViewRow row in ui.m_GridView.Rows) + { + for (int i = 0; i < row.Cells.Count; i++) + { + writer.Write(row.Cells[i].Value.ToString()); + if (i < row.Cells.Count - 1) + writer.Write(","); + } + + writer.Write(Environment.NewLine); + } + + writer.Flush(); + writer.Close(); + } + catch (System.Exception ex) + { + MessageBox.Show("Couldn't save to " + csvSaveDialog.FileName + Environment.NewLine + ex.ToString(), "Cannot save", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } } } @@ -2227,13 +2235,21 @@ namespace renderdocui.Windows if (res == DialogResult.OK) { - FileStream writer = File.Create(rawSaveDialog.FileName); + try + { + FileStream writer = File.Create(rawSaveDialog.FileName); - UIState ui = m_ContextUIState; - writer.Write(ui.m_RawData, 0, ui.m_RawData.Length); + UIState ui = m_ContextUIState; + writer.Write(ui.m_RawData, 0, ui.m_RawData.Length); - writer.Flush(); - writer.Close(); + writer.Flush(); + writer.Close(); + } + catch (System.Exception ex) + { + MessageBox.Show("Couldn't save to " + csvSaveDialog.FileName + Environment.NewLine + ex.ToString(), "Cannot save", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } } } diff --git a/renderdocui/Windows/Dialogs/CaptureDialog.cs b/renderdocui/Windows/Dialogs/CaptureDialog.cs index 2f0224817..7a811c7e5 100644 --- a/renderdocui/Windows/Dialogs/CaptureDialog.cs +++ b/renderdocui/Windows/Dialogs/CaptureDialog.cs @@ -204,30 +204,37 @@ namespace renderdocui.Windows.Dialogs private void SaveSettings(string filename) { - System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(CaptureSettings)); - StreamWriter writer = File.CreateText(filename); - xs.Serialize(writer, GetSettings()); - writer.Flush(); - writer.Close(); + try + { + System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(CaptureSettings)); + StreamWriter writer = File.CreateText(filename); + xs.Serialize(writer, GetSettings()); + writer.Flush(); + writer.Close(); + } + catch (System.IO.IOException ex) + { + // Can't recover, but let user know that we couldn't save their settings. + MessageBox.Show(String.Format("Error saving config file: {1}\n{0}", filename, ex.Message)); + } } public void LoadSettings(string filename) { System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(CaptureSettings)); - StreamReader reader = File.OpenText(filename); try { + StreamReader reader = File.OpenText(filename); SetSettings((CaptureSettings)xs.Deserialize(reader)); + reader.Close(); } catch (System.Xml.XmlException) { } - catch (System.InvalidOperationException) + catch (System.Exception) { MessageBox.Show(String.Format("Failed to load capture settings from file {0}", filename), "Failed to load settings", MessageBoxButtons.OK, MessageBoxIcon.Error); } - - reader.Close(); } private void FillProcessList() @@ -751,52 +758,66 @@ namespace renderdocui.Windows.Dialogs var regfile = Path.Combine(Path.GetTempPath(), "RenderDoc_RestoreGlobalHook.reg"); - if (Environment.Is64BitProcess) + try { - EnableAppInit(Registry.LocalMachine.CreateSubKey("SOFTWARE").CreateSubKey("Wow6432Node"), - path, "x86\\renderdocshim32.dll", - out prevAppInitWoW64Enabled, out prevAppInitWoW64); - - EnableAppInit(Registry.LocalMachine.CreateSubKey("SOFTWARE"), - path, "renderdocshim64.dll", - out prevAppInitEnabled, out prevAppInit); - - using (FileStream s = File.OpenWrite(regfile)) + if (Environment.Is64BitProcess) { - using(StreamWriter sw = new StreamWriter(s)) + EnableAppInit(Registry.LocalMachine.CreateSubKey("SOFTWARE").CreateSubKey("Wow6432Node"), + path, "x86\\renderdocshim32.dll", + out prevAppInitWoW64Enabled, out prevAppInitWoW64); + + EnableAppInit(Registry.LocalMachine.CreateSubKey("SOFTWARE"), + path, "renderdocshim64.dll", + out prevAppInitEnabled, out prevAppInit); + + using (FileStream s = File.OpenWrite(regfile)) { - sw.WriteLine("Windows Registry Editor Version 5.00"); - sw.WriteLine(""); - sw.WriteLine("[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\Windows]"); - sw.WriteLine(String.Format("\"LoadAppInit_DLLs\"=dword:{0:X8}", prevAppInitWoW64Enabled)); - sw.WriteLine(String.Format("\"AppInit_DLLs\"=\"{0}\"", prevAppInitWoW64)); - sw.WriteLine(""); - sw.WriteLine("[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows]"); - sw.WriteLine(String.Format("\"LoadAppInit_DLLs\"=dword:{0:X8}", prevAppInitEnabled)); - sw.WriteLine(String.Format("\"AppInit_DLLs\"=\"{0}\"", prevAppInit)); - sw.Flush(); + using (StreamWriter sw = new StreamWriter(s)) + { + sw.WriteLine("Windows Registry Editor Version 5.00"); + sw.WriteLine(""); + sw.WriteLine("[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\Windows]"); + sw.WriteLine(String.Format("\"LoadAppInit_DLLs\"=dword:{0:X8}", prevAppInitWoW64Enabled)); + sw.WriteLine(String.Format("\"AppInit_DLLs\"=\"{0}\"", prevAppInitWoW64)); + sw.WriteLine(""); + sw.WriteLine("[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows]"); + sw.WriteLine(String.Format("\"LoadAppInit_DLLs\"=dword:{0:X8}", prevAppInitEnabled)); + sw.WriteLine(String.Format("\"AppInit_DLLs\"=\"{0}\"", prevAppInit)); + sw.Flush(); + } + } + } + else + { + // if this is a 64-bit OS, it will re-direct our request to Wow6432Node anyway, so we + // don't need to handle that manually + EnableAppInit(Registry.LocalMachine.CreateSubKey("SOFTWARE"), path, "renderdocshim32.dll", + out prevAppInitEnabled, out prevAppInit); + + using (FileStream s = File.OpenWrite(regfile)) + { + using (StreamWriter sw = new StreamWriter(s)) + { + sw.WriteLine("Windows Registry Editor Version 5.00"); + sw.WriteLine(""); + sw.WriteLine("[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows]"); + sw.WriteLine(String.Format("\"LoadAppInit_DLLs\"=dword:{0:X8}", prevAppInitEnabled)); + sw.WriteLine(String.Format("\"AppInit_DLLs\"=\"{0}\"", prevAppInit)); + sw.Flush(); + } } } } - else + catch (System.Exception ex) { - // if this is a 64-bit OS, it will re-direct our request to Wow6432Node anyway, so we - // don't need to handle that manually - EnableAppInit(Registry.LocalMachine.CreateSubKey("SOFTWARE"), path, "renderdocshim32.dll", - out prevAppInitEnabled, out prevAppInit); + MessageBox.Show("Aborting. Couldn't save backup .reg file to " + regfile + Environment.NewLine + ex.ToString(), "Cannot save registry backup", + MessageBoxButtons.OK, MessageBoxIcon.Error); - using (FileStream s = File.OpenWrite(regfile)) - { - using (StreamWriter sw = new StreamWriter(s)) - { - sw.WriteLine("Windows Registry Editor Version 5.00"); - sw.WriteLine(""); - sw.WriteLine("[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows]"); - sw.WriteLine(String.Format("\"LoadAppInit_DLLs\"=dword:{0:X8}", prevAppInitEnabled)); - sw.WriteLine(String.Format("\"AppInit_DLLs\"=\"{0}\"", prevAppInit)); - sw.Flush(); - } - } + // won't recurse because it's not enabled yet + toggleGlobalHook.Checked = false; + + toggleGlobalHook.Enabled = true; + return; } ExitPipeThread(); diff --git a/renderdocui/Windows/Dialogs/LiveCapture.cs b/renderdocui/Windows/Dialogs/LiveCapture.cs index 3962e1eaa..054054810 100644 --- a/renderdocui/Windows/Dialogs/LiveCapture.cs +++ b/renderdocui/Windows/Dialogs/LiveCapture.cs @@ -390,7 +390,15 @@ namespace renderdocui.Windows // This ensures that if the user deletes the saved path we can still open or re-save it. if (path.Length > 0) { - File.Copy(log.localpath, path, true); + try + { + File.Copy(log.localpath, path, true); + } + catch (System.Exception ex) + { + MessageBox.Show("Couldn't save to " + path + Environment.NewLine + ex.ToString(), "Cannot save", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } return true; } @@ -445,10 +453,17 @@ namespace renderdocui.Windows if (!log.saved) { - if (log.localpath == m_Core.LogFileName) - m_Main.OwnTemporaryLog = true; - else - File.Delete(log.localpath); + try + { + if (log.localpath == m_Core.LogFileName) + m_Main.OwnTemporaryLog = true; + else + File.Delete(log.localpath); + } + catch (System.Exception) + { + // couldn't delete log - deleted from under us? + } } } captures.Items.Clear(); @@ -525,7 +540,14 @@ namespace renderdocui.Windows m_Main.CloseLogfile(); } - File.Delete(log.localpath); + try + { + File.Delete(log.localpath); + } + catch (System.Exception) + { + // couldn't delete log - deleted from under us? + } } captures.Items.Remove(item); @@ -545,7 +567,16 @@ namespace renderdocui.Windows var temppath = m_Core.TempLogFilename(log.exe); - File.Copy(log.localpath, temppath); + try + { + File.Copy(log.localpath, temppath); + } + catch (System.Exception ex) + { + MessageBox.Show("Couldn't save log to temporary location" + Environment.NewLine + ex.ToString(), "Cannot save temporary log", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } var process = new System.Diagnostics.Process(); process.StartInfo = new System.Diagnostics.ProcessStartInfo(Application.ExecutablePath, String.Format("--tempfile \"{0}\"", temppath)); diff --git a/renderdocui/Windows/Dialogs/PythonShell.cs b/renderdocui/Windows/Dialogs/PythonShell.cs index ef11fa78e..466cee469 100644 --- a/renderdocui/Windows/Dialogs/PythonShell.cs +++ b/renderdocui/Windows/Dialogs/PythonShell.cs @@ -409,7 +409,15 @@ namespace renderdocui.Windows.Dialogs string fn = ValidData(e.Data); if (fn.Length > 0) { - scriptEditor.Text = File.ReadAllText(fn); + try + { + scriptEditor.Text = File.ReadAllText(fn); + } + catch (System.Exception ex) + { + MessageBox.Show("Couldn't open file " + saveDialog.FileName + Environment.NewLine + ex.ToString(), "Cannot open script", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } mode_Changed(scriptMode, null); } @@ -421,7 +429,15 @@ namespace renderdocui.Windows.Dialogs if (res == DialogResult.OK) { - scriptEditor.Text = File.ReadAllText(openDialog.FileName); + try + { + scriptEditor.Text = File.ReadAllText(openDialog.FileName); + } + catch (System.Exception ex) + { + MessageBox.Show("Couldn't load from " + openDialog.FileName + Environment.NewLine + ex.ToString(), "Cannot open script", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } } } @@ -431,7 +447,15 @@ namespace renderdocui.Windows.Dialogs if (res == DialogResult.OK) { - File.WriteAllText(saveDialog.FileName, scriptEditor.Text); + try + { + File.WriteAllText(saveDialog.FileName, scriptEditor.Text); + } + catch (System.Exception ex) + { + MessageBox.Show("Couldn't save to " + saveDialog.FileName + Environment.NewLine + ex.ToString(), "Cannot save script", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } } } diff --git a/renderdocui/Windows/MainWindow.cs b/renderdocui/Windows/MainWindow.cs index 96f6e6e40..d9a990a16 100644 --- a/renderdocui/Windows/MainWindow.cs +++ b/renderdocui/Windows/MainWindow.cs @@ -1071,8 +1071,15 @@ namespace renderdocui.Windows CloseLogfile(); - if (deletepath.Length > 0) - File.Delete(deletepath); + try + { + if (deletepath.Length > 0) + File.Delete(deletepath); + } + catch (System.Exception) + { + // can't delete it! maybe already deleted? + } return true; } @@ -1090,9 +1097,17 @@ namespace renderdocui.Windows return false; } - // we copy the (possibly) temp log to the desired path, but the log item remains referring to the original path. - // This ensures that if the user deletes the saved path we can still open or re-save it. - File.Copy(m_Core.LogFileName, saveDialog.FileName, true); + try + { + // we copy the (possibly) temp log to the desired path, but the log item remains referring to the original path. + // This ensures that if the user deletes the saved path we can still open or re-save it. + File.Copy(m_Core.LogFileName, saveDialog.FileName, true); + } + catch (System.Exception ex) + { + MessageBox.Show("Couldn't save to " + saveDialog.FileName + Environment.NewLine + ex.ToString(), "Cannot save", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } // we don't prompt to save on closing - if the user deleted the log that we just saved, then // that is up to them. diff --git a/renderdocui/Windows/ShaderViewer.cs b/renderdocui/Windows/ShaderViewer.cs index 345507724..4ac7b4350 100644 --- a/renderdocui/Windows/ShaderViewer.cs +++ b/renderdocui/Windows/ShaderViewer.cs @@ -690,7 +690,14 @@ namespace renderdocui.Windows { using (StreamReader reader = new StreamReader(stream)) { - File.WriteAllText(syntaxpath, reader.ReadToEnd()); + try + { + File.WriteAllText(syntaxpath, reader.ReadToEnd()); + } + catch (System.Exception) + { + // silently fail if we can't write to the path - syntax highlighting will just be broken + } } } } diff --git a/renderdocui/Windows/TextureViewer.cs b/renderdocui/Windows/TextureViewer.cs index ed6864007..3c780a341 100644 --- a/renderdocui/Windows/TextureViewer.cs +++ b/renderdocui/Windows/TextureViewer.cs @@ -468,8 +468,16 @@ namespace renderdocui.Windows var enc = new UnicodeEncoding(); var path = Path.GetTempFileName(); dockPanel.SaveAsXml(path, "", enc); - data.panelLayout = File.ReadAllText(path, enc); - File.Delete(path); + try + { + data.panelLayout = File.ReadAllText(path, enc); + File.Delete(path); + } + catch (System.Exception ex) + { + // can't recover + return writer.ToString(); + } data.darkBack = darkBack; data.lightBack = lightBack; @@ -618,36 +626,43 @@ namespace renderdocui.Windows if (!m_CustomShaders.ContainsKey(key)) { - string source = File.ReadAllText(f); - - m_CustomShaders.Add(key, ResourceId.Null); - m_CustomShadersBusy.Add(key); - m_Core.Renderer.BeginInvoke((ReplayRenderer r) => + try { - string errors = ""; + string source = File.ReadAllText(f); - ResourceId id = r.BuildCustomShader("main", source, 0, ShaderStageType.Pixel, out errors); - - if (m_CustomShaderEditor.ContainsKey(key)) + m_CustomShaders.Add(key, ResourceId.Null); + m_CustomShadersBusy.Add(key); + m_Core.Renderer.BeginInvoke((ReplayRenderer r) => { + string errors = ""; + + ResourceId id = r.BuildCustomShader("main", source, 0, ShaderStageType.Pixel, out errors); + + if (m_CustomShaderEditor.ContainsKey(key)) + { + BeginInvoke((MethodInvoker)delegate + { + m_CustomShaderEditor[key].ShowErrors(errors); + }); + } + BeginInvoke((MethodInvoker)delegate { - m_CustomShaderEditor[key].ShowErrors(errors); + customShader.Items.Add(fn); + m_CustomShaders[key] = id; + m_CustomShadersBusy.Remove(key); + + customShader.AutoCompleteSource = AutoCompleteSource.None; + customShader.AutoCompleteSource = AutoCompleteSource.ListItems; + + UI_UpdateChannels(); }); - } - - BeginInvoke((MethodInvoker)delegate - { - customShader.Items.Add(fn); - m_CustomShaders[key] = id; - m_CustomShadersBusy.Remove(key); - - customShader.AutoCompleteSource = AutoCompleteSource.None; - customShader.AutoCompleteSource = AutoCompleteSource.ListItems; - - UI_UpdateChannels(); }); - }); + } + catch (System.Exception ex) + { + // just continue, skip this file + } } } } @@ -691,8 +706,14 @@ namespace renderdocui.Windows , Environment.NewLine); } - File.WriteAllText(path, src); - + try + { + File.WriteAllText(path, src); + } + catch (System.Exception ex) + { + // ignore this file + } // auto-open edit window customEdit_Click(sender, e); @@ -703,8 +724,21 @@ namespace renderdocui.Windows var filename = customShader.Text; var key = filename.ToUpperInvariant(); + string src = ""; + + try + { + src = File.ReadAllText(Path.Combine(Core.ConfigDirectory, filename + m_Core.APIProps.ShaderExtension)); + } + catch (System.Exception ex) + { + MessageBox.Show("Couldn't open file for shader " + filename + Environment.NewLine + ex.ToString(), "Cannot open shader", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + var files = new Dictionary(); - files.Add(filename, File.ReadAllText(Path.Combine(Core.ConfigDirectory, filename + m_Core.APIProps.ShaderExtension))); + files.Add(filename, src); ShaderViewer s = new ShaderViewer(m_Core, true, "Custom Shader", files, // Save Callback @@ -713,7 +747,16 @@ namespace renderdocui.Windows foreach (var f in updatedfiles) { var path = Path.Combine(Core.ConfigDirectory, f.Key + m_Core.APIProps.ShaderExtension); - File.WriteAllText(path, f.Value); + try + { + File.WriteAllText(path, f.Value); + } + catch (System.Exception ex) + { + MessageBox.Show("Couldn't save file for shader " + filename + Environment.NewLine + ex.ToString(), "Cannot save shader", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } } },