From 86d91a3e4b1646f1c6ac2b96eec03398c0af637d Mon Sep 17 00:00:00 2001
From: erri120 <erri120@protonmail.com>
Date: Sat, 14 Dec 2019 22:34:55 +0100
Subject: [PATCH 1/3] Added safety checks to the SteamHandler

---
 Wabbajack.Common/SteamHandler.cs | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/Wabbajack.Common/SteamHandler.cs b/Wabbajack.Common/SteamHandler.cs
index 35934868..d69bfbb5 100644
--- a/Wabbajack.Common/SteamHandler.cs
+++ b/Wabbajack.Common/SteamHandler.cs
@@ -92,7 +92,8 @@ namespace Wabbajack.Common
                 if (!l.Contains("BaseInstallFolder_")) return;
                 var s = GetVdfValue(l);
                 s = Path.Combine(s, "steamapps");
-                paths.Add(s);
+                if(Directory.Exists(s))
+                    paths.Add(s);
             });
 
             // Default path in the Steam folder isn't in the configs
@@ -111,7 +112,7 @@ namespace Wabbajack.Common
 
             InstallFolders.Do(p =>
             {
-                Directory.EnumerateFiles(p, "*.acf", SearchOption.TopDirectoryOnly).Do(f =>
+                Directory.EnumerateFiles(p, "*.acf", SearchOption.TopDirectoryOnly).Where(File.Exists).Do(f =>
                 {
                     var steamGame = new SteamGame();
                     var valid = false;
@@ -157,7 +158,7 @@ namespace Wabbajack.Common
                 if(!Directory.Exists(workshop))
                     return;
 
-                Directory.EnumerateFiles(workshop, "*.acf", SearchOption.TopDirectoryOnly).Do(f =>
+                Directory.EnumerateFiles(workshop, "*.acf", SearchOption.TopDirectoryOnly).Where(File.Exists).Do(f =>
                 {
                     if (Path.GetFileName(f)  != $"appworkshop_{game.AppId}.acf")
                         return;

From e13a57009a0a58a8e986eb02c8ac72ca3389bb61 Mon Sep 17 00:00:00 2001
From: erri120 <erri120@protonmail.com>
Date: Sat, 14 Dec 2019 22:40:10 +0100
Subject: [PATCH 2/3] Added ExtensionManager safety checks

---
 Wabbajack.Common/ExtensionManager.cs | 13 +++++++------
 Wabbajack/Views/MainWindow.xaml.cs   | 13 +++++++++++--
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/Wabbajack.Common/ExtensionManager.cs b/Wabbajack.Common/ExtensionManager.cs
index 34651409..1f0f5075 100644
--- a/Wabbajack.Common/ExtensionManager.cs
+++ b/Wabbajack.Common/ExtensionManager.cs
@@ -33,25 +33,26 @@ namespace Wabbajack.Common
             var progIDKey = Registry.CurrentUser.OpenSubKey(ProgIDPath);
             var tempKey = progIDKey?.OpenSubKey("shell\\open\\command");
             if (progIDKey == null || tempKey == null) return true;
-            return tempKey.GetValue("").ToString().Equals($"\"{appPath}\" -i \"%1\"");
+            var value = tempKey.GetValue("");
+            return value == null || value.ToString().Equals($"\"{appPath}\" -i \"%1\"");
         }
 
         public static bool IsAssociated()
         {
             var progIDKey = Registry.CurrentUser.OpenSubKey(ProgIDPath);
             var extKey = Registry.CurrentUser.OpenSubKey(ExtPath);
-            return (progIDKey != null && extKey != null);
+            return progIDKey != null && extKey != null;
         }
 
         public static void Associate(string appPath)
         {
             var progIDKey = Registry.CurrentUser.CreateSubKey(ProgIDPath, RegistryKeyPermissionCheck.ReadWriteSubTree);
-            foreach (KeyValuePair<string, string> entry in ProgIDList)
+            foreach (var entry in ProgIDList)
             {
                 if (entry.Key.Contains("\\"))
                 {
-                    var tempKey = progIDKey.CreateSubKey(entry.Key);
-                    tempKey.SetValue("", entry.Value.Replace("{appPath}", appPath));
+                    var tempKey = progIDKey?.CreateSubKey(entry.Key);
+                    tempKey?.SetValue("", entry.Value.Replace("{appPath}", appPath));
                 }
                 else
                 {
@@ -60,7 +61,7 @@ namespace Wabbajack.Common
             }
 
             var extKey = Registry.CurrentUser.CreateSubKey(ExtPath, RegistryKeyPermissionCheck.ReadWriteSubTree);
-            foreach (KeyValuePair<string, string> entry in ExtList)
+            foreach (var entry in ExtList)
             {
                 extKey?.SetValue(entry.Key, entry.Value);
             }
diff --git a/Wabbajack/Views/MainWindow.xaml.cs b/Wabbajack/Views/MainWindow.xaml.cs
index bf7cbe01..9c9139aa 100644
--- a/Wabbajack/Views/MainWindow.xaml.cs
+++ b/Wabbajack/Views/MainWindow.xaml.cs
@@ -4,6 +4,7 @@ using System.Windows;
 using MahApps.Metro.Controls;
 using Wabbajack.Common;
 using Application = System.Windows.Application;
+using Utils = Wabbajack.Common.Utils;
 
 namespace Wabbajack
 {
@@ -25,10 +26,18 @@ namespace Wabbajack
             };
 
             var appPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
-            if (!ExtensionManager.IsAssociated() || ExtensionManager.NeedsUpdating(appPath))
+            try
             {
-                ExtensionManager.Associate(appPath);
+                if (!ExtensionManager.IsAssociated() || ExtensionManager.NeedsUpdating(appPath))
+                {
+                    ExtensionManager.Associate(appPath);
+                }
             }
+            catch (Exception e)
+            {
+                Utils.Log($"ExtensionManager had an exception:\n{e}");
+            }
+            
 
             Wabbajack.Common.Utils.Log($"Wabbajack Build - {ThisAssembly.Git.Sha}");
 

From 3c21dfd7818d706c851b6dd38df2dfbc1fc0ead6 Mon Sep 17 00:00:00 2001
From: erri120 <erri120@protonmail.com>
Date: Sat, 14 Dec 2019 22:43:47 +0100
Subject: [PATCH 3/3] Added check for InstallDir

---
 Wabbajack.Common/SteamHandler.cs | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/Wabbajack.Common/SteamHandler.cs b/Wabbajack.Common/SteamHandler.cs
index d69bfbb5..9fe0c695 100644
--- a/Wabbajack.Common/SteamHandler.cs
+++ b/Wabbajack.Common/SteamHandler.cs
@@ -97,7 +97,8 @@ namespace Wabbajack.Common
             });
 
             // Default path in the Steam folder isn't in the configs
-            paths.Add(Path.Combine(SteamPath, "steamapps"));
+            if(Directory.Exists(Path.Combine(SteamPath, "steamapps")))
+                paths.Add(Path.Combine(SteamPath, "steamapps"));
 
             InstallFolders = paths;
         }
@@ -123,8 +124,11 @@ namespace Wabbajack.Common
                                 return;
                         if(l.Contains("\"name\""))
                             steamGame.Name = GetVdfValue(l);
-                        if(l.Contains("\"installdir\""))
-                            steamGame.InstallDir = Path.Combine(p, "common", GetVdfValue(l));
+                        if (l.Contains("\"installdir\""))
+                        {
+                            var path = Path.Combine(p, "common", GetVdfValue(l));
+                            steamGame.InstallDir = Directory.Exists(path) ? path : null;
+                        }
 
                         if (steamGame.AppId != 0 && !string.IsNullOrWhiteSpace(steamGame.Name) &&
                             !string.IsNullOrWhiteSpace(steamGame.InstallDir))