├── D0_Snippets.as ├── assets ├── icon-killer.ico └── images │ ├── BlackScreenFix.png │ ├── OVRSettingsFix.png │ ├── OculusKiller_Logo.png │ └── logo-black.svg ├── OculusKiller ├── icon-killer.ico ├── App.config ├── Utilities │ ├── ProcessExtensions.cs │ ├── ProcessUtilities.cs │ ├── ProcessMonitor.cs │ ├── OpenXRRuntimeChecker.cs │ ├── PathUtilities.cs │ └── ErrorLogger.cs ├── Properties │ └── AssemblyInfo.cs ├── Core │ └── MainOculusKiller.cs └── OculusKiller.csproj ├── .github └── workflows │ ├── Generate_Changelog.yml │ └── Build_and_Release.yml ├── OculusKiller.sln ├── LICENSE ├── .gitignore └── README.md /D0_Snippets.as: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/icon-killer.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevOculus-Meta-Quest/OculusKiller/HEAD/assets/icon-killer.ico -------------------------------------------------------------------------------- /OculusKiller/icon-killer.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevOculus-Meta-Quest/OculusKiller/HEAD/OculusKiller/icon-killer.ico -------------------------------------------------------------------------------- /assets/images/BlackScreenFix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevOculus-Meta-Quest/OculusKiller/HEAD/assets/images/BlackScreenFix.png -------------------------------------------------------------------------------- /assets/images/OVRSettingsFix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevOculus-Meta-Quest/OculusKiller/HEAD/assets/images/OVRSettingsFix.png -------------------------------------------------------------------------------- /assets/images/OculusKiller_Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevOculus-Meta-Quest/OculusKiller/HEAD/assets/images/OculusKiller_Logo.png -------------------------------------------------------------------------------- /OculusKiller/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /OculusKiller/Utilities/ProcessExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using System.Threading; 3 | using System.Threading.Tasks; 4 | 5 | public static class ProcessExtensions 6 | { 7 | public static Task WaitForExitAsync(this Process process, CancellationToken cancellationToken = default) 8 | { 9 | if (process.HasExited) 10 | return Task.CompletedTask; 11 | 12 | var tcs = new TaskCompletionSource(); 13 | process.EnableRaisingEvents = true; 14 | process.Exited += (sender, args) => 15 | { 16 | tcs.TrySetResult(true); 17 | }; 18 | if (cancellationToken != default) 19 | cancellationToken.Register(() => tcs.TrySetCanceled()); 20 | 21 | return tcs.Task; 22 | } 23 | } -------------------------------------------------------------------------------- /.github/workflows/Generate_Changelog.yml: -------------------------------------------------------------------------------- 1 | name: Generate Changelog 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' # This will only run the workflow when you push tags with a format like v1.0, v1.2.3, etc. 7 | workflow_dispatch: # This allows for manual triggering of the workflow 8 | 9 | jobs: 10 | changelog: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Check out code 15 | uses: actions/checkout@v2 16 | with: 17 | token: ${{ secrets.GIT_ACTIONS }} # Using your PAT named GIT_ACTIONS 18 | 19 | - name: Generate changelog 20 | uses: charmixer/auto-changelog-action@v1 21 | with: 22 | token: ${{ secrets.GIT_ACTIONS }} # Using your PAT named GIT_ACTIONS 23 | 24 | - name: Commit and push changelog 25 | run: | 26 | git config --local user.email "action@github.com" 27 | git config --local user.name "GitHub Action" 28 | git add CHANGELOG.md # Assuming the changelog is saved in the root as CHANGELOG.md 29 | git commit -m "Generate changelog" 30 | git push -------------------------------------------------------------------------------- /OculusKiller.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.0.31912.275 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OculusKiller", "OculusKiller\OculusKiller.csproj", "{D991AD78-285B-44C1-BDAF-B3B51C5D2B26}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Release|x64 = Release|x64 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {D991AD78-285B-44C1-BDAF-B3B51C5D2B26}.Debug|x64.ActiveCfg = Debug|x64 15 | {D991AD78-285B-44C1-BDAF-B3B51C5D2B26}.Debug|x64.Build.0 = Debug|x64 16 | {D991AD78-285B-44C1-BDAF-B3B51C5D2B26}.Release|x64.ActiveCfg = Release|x64 17 | {D991AD78-285B-44C1-BDAF-B3B51C5D2B26}.Release|x64.Build.0 = Release|x64 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {360A00C9-EE64-480F-97E8-FCA76EEE7566} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /.github/workflows/Build_and_Release.yml: -------------------------------------------------------------------------------- 1 | name: Build and Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | workflow_dispatch: 8 | inputs: 9 | version: 10 | description: 'Version tag (e.g., v1.0.0)' 11 | required: true 12 | 13 | jobs: 14 | build: 15 | runs-on: windows-latest 16 | 17 | steps: 18 | - name: Checkout code 19 | uses: actions/checkout@v2 20 | 21 | - name: Setup MSBuild 22 | uses: microsoft/setup-msbuild@v1 23 | 24 | - name: Restore NuGet packages 25 | run: msbuild -t:restore 26 | 27 | - name: Build project 28 | run: msbuild "OculusKiller\OculusKiller.csproj" /p:Configuration=Release /p:Platform=x64 29 | 30 | - name: Create Release 31 | id: create_release 32 | uses: actions/create-release@v1 33 | env: 34 | GITHUB_TOKEN: ${{ secrets.GIT_ACTIONS }} 35 | with: 36 | tag_name: ${{ github.event.inputs.version || github.ref_name }} 37 | release_name: Release ${{ github.event.inputs.version || github.ref_name }} 38 | draft: false 39 | prerelease: false 40 | 41 | - name: Upload Build Artifact to Release 42 | uses: actions/upload-release-asset@v1 43 | env: 44 | GITHUB_TOKEN: ${{ secrets.GIT_ACTIONS }} 45 | with: 46 | upload_url: ${{ steps.create_release.outputs.upload_url }} 47 | asset_path: D:\a\OculusKiller\OculusKiller\OculusKiller\bin\x64\Release\OculusDash.exe 48 | asset_name: OculusDash.exe 49 | asset_content_type: application/vnd.microsoft.portable-executable -------------------------------------------------------------------------------- /OculusKiller/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("Oculus Killer")] 8 | [assembly: AssemblyDescription("Completely kill the Oculus Dash and auto-launch SteamVR.")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("PureFusion")] 11 | [assembly: AssemblyProduct("Oculus Killer")] 12 | [assembly: AssemblyCopyright("Copyright © 2023")] 13 | [assembly: AssemblyTrademark("PureFusion By Eliminater74")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("d991ad78-285b-44c1-bdaf-b3b51c5d2b26")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("2.0.1.3")] 35 | [assembly: AssemblyFileVersion("2.0.1.3")] -------------------------------------------------------------------------------- /OculusKiller/Utilities/ProcessUtilities.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | 4 | namespace OculusKiller.Utilities 5 | { 6 | public static class ProcessUtilities 7 | { 8 | public static Process StartProcess(string processPath) 9 | { 10 | try 11 | { 12 | Process process = Process.Start(processPath); 13 | if (process == null || process.HasExited) 14 | { 15 | ErrorLogger.LogError(new Exception($"Failed to start process: {processPath}")); 16 | return null; 17 | } 18 | 19 | ErrorLogger.Log($"Successfully started process: {processPath}"); 20 | return process; 21 | } 22 | catch (Exception e) 23 | { 24 | ErrorLogger.LogError(new Exception($"Error starting process: {processPath}. Error: {e.Message}")); 25 | return null; 26 | } 27 | } 28 | 29 | public static void TerminateProcess(string processName) 30 | { 31 | foreach (var process in Process.GetProcessesByName(processName)) 32 | { 33 | try 34 | { 35 | process.Kill(); 36 | process.WaitForExit(); 37 | ErrorLogger.Log($"Terminated process: {process.ProcessName}"); 38 | } 39 | catch (Exception e) 40 | { 41 | ErrorLogger.LogError(new Exception($"Error terminating process: {process.ProcessName}. Error: {e.Message}")); 42 | } 43 | } 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /OculusKiller/Utilities/ProcessMonitor.cs: -------------------------------------------------------------------------------- 1 | using OculusKiller.Utilities; 2 | using System; 3 | 4 | namespace OculusKiller.Core 5 | { 6 | internal class ProcessMonitor 7 | { 8 | // Method to monitor the VR processes 9 | public static void MonitorProcesses(string vrServerPath, string oculusPath) 10 | { 11 | try 12 | { 13 | // Find the vrserver process by its path 14 | var vrServerProcess = PathUtilities.FindProcessByPath("vrserver", vrServerPath); 15 | 16 | // Check if the vrserver process is found 17 | if (vrServerProcess != null) 18 | { 19 | ErrorLogger.Log("Monitoring vrserver process."); 20 | 21 | // Wait for the vrserver process to exit 22 | vrServerProcess.WaitForExit(); 23 | 24 | // Once the vrserver process exits, log the event 25 | ErrorLogger.Log("vrserver process has exited. Terminating SteamVR and Oculus Air Link."); 26 | } 27 | else 28 | { 29 | // If the vrserver process is not found, log the event 30 | ErrorLogger.Log("vrserver process not found."); 31 | } 32 | } 33 | catch (Exception e) 34 | { 35 | // Log any exceptions that occur 36 | ErrorLogger.LogError(e); 37 | } 38 | finally 39 | { 40 | // Terminate SteamVR and Oculus Air Link processes 41 | ProcessUtilities.TerminateProcess("vrserver"); 42 | ProcessUtilities.TerminateProcess("OVRServer_x64"); 43 | ErrorLogger.Log("Terminated SteamVR and Oculus Air Link processes."); 44 | } 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /OculusKiller/Utilities/OpenXRRuntimeChecker.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | using OculusKiller.Utilities; 3 | using System; 4 | using System.Collections.Generic; 5 | 6 | namespace OculusKiller.RuntimeManagement 7 | { 8 | public static class OpenXRRuntimeChecker 9 | { 10 | private const string OpenXRKeyPath = @"SOFTWARE\Khronos\OpenXR\1"; 11 | 12 | public static void CheckAndLogRuntimes() 13 | { 14 | try 15 | { 16 | // Log available runtimes 17 | var availableRuntimes = GetAvailableRuntimes(); 18 | ErrorLogger.Log("Available OpenXR Runtimes:"); 19 | foreach (var runtime in availableRuntimes) 20 | { 21 | ErrorLogger.Log(runtime); 22 | } 23 | 24 | // Log active runtime 25 | var activeRuntime = GetActiveRuntime(); 26 | ErrorLogger.Log($"Active OpenXR Runtime: {activeRuntime}"); 27 | } 28 | catch (Exception e) 29 | { 30 | ErrorLogger.LogError(e); 31 | } 32 | } 33 | 34 | private static List GetAvailableRuntimes() 35 | { 36 | var runtimes = new List(); 37 | using (var key = Registry.LocalMachine.OpenSubKey($@"{OpenXRKeyPath}\AvailableRuntimes")) 38 | { 39 | if (key != null) 40 | { 41 | foreach (var valueName in key.GetValueNames()) 42 | { 43 | // The value names are the actual file paths 44 | runtimes.Add(valueName); 45 | } 46 | } 47 | } 48 | return runtimes; 49 | } 50 | 51 | private static string GetActiveRuntime() 52 | { 53 | using (var key = Registry.LocalMachine.OpenSubKey(OpenXRKeyPath)) 54 | { 55 | if (key != null) 56 | { 57 | return key.GetValue("ActiveRuntime") as string; 58 | } 59 | } 60 | return "No active runtime found."; 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /OculusKiller/Core/MainOculusKiller.cs: -------------------------------------------------------------------------------- 1 | using OculusKiller.RuntimeManagement; // Add this to use OpenXRRuntimeChecker 2 | using OculusKiller.Utilities; 3 | using System; 4 | using System.Diagnostics; 5 | using System.Threading.Tasks; 6 | 7 | namespace OculusKiller.Core 8 | { 9 | internal class MainOculusKiller 10 | { 11 | public static async Task Main() 12 | { 13 | try 14 | { 15 | // Logging the start of the application 16 | ErrorLogger.Log("Application started."); 17 | 18 | // Check and log OpenXR runtimes 19 | OpenXRRuntimeChecker.CheckAndLogRuntimes(); // Added line to log OpenXR runtimes 20 | 21 | // Retrieving and validating the Oculus path 22 | string oculusPath = PathUtilities.GetOculusPath(); 23 | if (string.IsNullOrEmpty(oculusPath)) 24 | { 25 | ErrorLogger.LogError(new Exception("Oculus path not found."), isCritical: false); 26 | return; 27 | } 28 | ErrorLogger.Log($"Oculus path: {oculusPath}"); 29 | 30 | // Retrieving and validating the Steam paths 31 | var steamPaths = PathUtilities.GetSteamPaths(); 32 | if (steamPaths == null) 33 | { 34 | ErrorLogger.LogError(new Exception("Steam paths not found."), isCritical: false); 35 | return; 36 | } 37 | 38 | // Starting the SteamVR process and validating it 39 | string startupPath = steamPaths.Item1; 40 | string vrServerPath = steamPaths.Item2; 41 | ErrorLogger.Log($"Steam startup path: {startupPath}"); 42 | ErrorLogger.Log($"Steam VR server path: {vrServerPath}"); 43 | 44 | Process steamProcess = ProcessUtilities.StartProcess(startupPath); 45 | if (steamProcess == null) 46 | { 47 | ErrorLogger.LogError(new Exception("Failed to start SteamVR process."), isCritical: false); 48 | return; 49 | } 50 | 51 | ErrorLogger.Log("Started SteamVR using vrstartup.exe"); 52 | 53 | // Waiting for the SteamVR process to start 54 | await Task.Delay(5000); 55 | 56 | // Monitoring the VR server 57 | ProcessMonitor.MonitorProcesses(vrServerPath, oculusPath); 58 | } 59 | catch (Exception e) 60 | { 61 | // Handling and logging exceptions 62 | ErrorLogger.LogError(e, isCritical: true); 63 | } 64 | } 65 | } 66 | } -------------------------------------------------------------------------------- /OculusKiller/Utilities/PathUtilities.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Web.Script.Serialization; 6 | 7 | namespace OculusKiller.Utilities 8 | { 9 | public static class PathUtilities 10 | { 11 | public static Tuple GetSteamPaths() 12 | { 13 | string openVrPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"openvr\openvrpaths.vrpath"); 14 | if (!File.Exists(openVrPath)) 15 | { 16 | ErrorLogger.LogError(new Exception("OpenVR Paths file not found... (Has SteamVR been run once?)")); 17 | return null; 18 | } 19 | 20 | try 21 | { 22 | JavaScriptSerializer jss = new JavaScriptSerializer(); 23 | string openvrJsonString = File.ReadAllText(openVrPath); 24 | dynamic openvrPaths = jss.DeserializeObject(openvrJsonString); 25 | 26 | string location = openvrPaths["runtime"][0].ToString(); 27 | string startupPath = Path.Combine(location, @"bin\win64\vrstartup.exe"); 28 | string serverPath = Path.Combine(location, @"bin\win64\vrserver.exe"); 29 | 30 | if (!File.Exists(startupPath) || !File.Exists(serverPath)) 31 | { 32 | ErrorLogger.LogError(new Exception("SteamVR executables not found... (Has SteamVR been run once?)")); 33 | return null; 34 | } 35 | 36 | return new Tuple(startupPath, serverPath); 37 | } 38 | catch (Exception e) 39 | { 40 | ErrorLogger.LogError(new Exception($"Corrupt OpenVR Paths file found... (Has SteamVR been run once?)\n\nMessage: {e}")); 41 | return null; 42 | } 43 | } 44 | 45 | public static string GetOculusPath() 46 | { 47 | string oculusPath = Environment.GetEnvironmentVariable("OculusBase"); 48 | if (string.IsNullOrEmpty(oculusPath)) 49 | { 50 | ErrorLogger.LogError(new Exception("Oculus installation environment not found...")); 51 | return null; 52 | } 53 | 54 | oculusPath = Path.Combine(oculusPath, @"Support\oculus-runtime\OVRServer_x64.exe"); 55 | if (!File.Exists(oculusPath)) 56 | { 57 | ErrorLogger.LogError(new Exception("Oculus server executable not found...")); 58 | return null; 59 | } 60 | 61 | return oculusPath; 62 | } 63 | 64 | public static Process FindProcessByPath(string processName, string path) 65 | { 66 | return Process.GetProcessesByName(processName) 67 | .FirstOrDefault(p => 68 | { 69 | try 70 | { 71 | return p.MainModule.FileName == path; 72 | } 73 | catch 74 | { 75 | return false; 76 | } 77 | }); 78 | } 79 | } 80 | } -------------------------------------------------------------------------------- /OculusKiller/Utilities/ErrorLogger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Windows.Forms; 4 | 5 | namespace OculusKiller.Utilities 6 | { 7 | public static class ErrorLogger 8 | { 9 | // Path for the log file 10 | private static readonly string logPath = Path.Combine( 11 | Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), 12 | "OculusKiller", 13 | "OculusKiller.log"); 14 | 15 | // Maximum size of the log file in bytes (10 MB in this example) 16 | private const long MaxLogSize = 10 * 1024 * 1024; 17 | 18 | // Method to log general messages 19 | public static void Log(string message) 20 | { 21 | CheckAndRotateLog(); // Check if log rotation is needed 22 | string formattedMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} [INFO] {message}"; 23 | File.AppendAllText(logPath, formattedMessage + Environment.NewLine); 24 | } 25 | 26 | // Method to log exceptions 27 | public static void LogError(Exception exception, bool isCritical = false) 28 | { 29 | CheckAndRotateLog(); // Check if log rotation is needed 30 | string errorMessage = FormatExceptionMessage(exception); 31 | File.AppendAllText(logPath, errorMessage + Environment.NewLine); 32 | 33 | if (isCritical) 34 | { 35 | MessageBox.Show(errorMessage, "Critical Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 36 | } 37 | } 38 | 39 | // Helper method to format exception messages 40 | private static string FormatExceptionMessage(Exception exception) 41 | { 42 | string message = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} [ERROR] An error occurred: {exception.Message}\n" + 43 | $"Source: {exception.Source}\n" + 44 | $"Target Site: {exception.TargetSite}\n" + 45 | $"Stack Trace: {exception.StackTrace}"; 46 | 47 | // Log inner exception if present 48 | if (exception.InnerException != null) 49 | { 50 | message += $"\nInner Exception: {exception.InnerException.Message}\n" + 51 | $"Inner Stack Trace: {exception.InnerException.StackTrace}"; 52 | } 53 | 54 | return message; 55 | } 56 | 57 | // Ensures the log directory exists 58 | private static void InitializeLogging() 59 | { 60 | string directory = Path.GetDirectoryName(logPath); 61 | if (!Directory.Exists(directory)) 62 | { 63 | Directory.CreateDirectory(directory); 64 | } 65 | } 66 | 67 | // Checks the size of the log file and rotates it if necessary 68 | private static void CheckAndRotateLog() 69 | { 70 | InitializeLogging(); // Ensure the log directory exists 71 | 72 | FileInfo logFileInfo = new FileInfo(logPath); 73 | if (logFileInfo.Exists && logFileInfo.Length > MaxLogSize) 74 | { 75 | // Rotate the log file by renaming it with a timestamp 76 | string newLogPath = logPath + DateTime.Now.ToString("_yyyy-MM-dd_HH-mm-ss") + ".log"; 77 | File.Move(logPath, newLogPath); 78 | } 79 | } 80 | } 81 | } -------------------------------------------------------------------------------- /OculusKiller/OculusKiller.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {D991AD78-285B-44C1-BDAF-B3B51C5D2B26} 8 | WinExe 9 | OculusKiller 10 | OculusDash 11 | v4.8.1 12 | 512 13 | true 14 | true 15 | 16 | false 17 | publish\ 18 | true 19 | Disk 20 | false 21 | Foreground 22 | 7 23 | Days 24 | false 25 | false 26 | true 27 | 0 28 | 1.0.0.%2a 29 | false 30 | true 31 | 32 | 33 | true 34 | bin\x64\Debug\ 35 | DEBUG;TRACE 36 | full 37 | x64 38 | 7.3 39 | prompt 40 | true 41 | 42 | 43 | bin\x64\Release\ 44 | TRACE 45 | true 46 | pdbonly 47 | x64 48 | 8.0 49 | prompt 50 | true 51 | 52 | 53 | 54 | 55 | 56 | icon-killer.ico 57 | 58 | 59 | 60 | 61 | 62 | 63 | C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Web.Extensions.dll 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | False 83 | Microsoft .NET Framework 4.8.1 %28x86 and x64%29 84 | true 85 | 86 | 87 | False 88 | .NET Framework 3.5 SP1 89 | false 90 | 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /assets/images/logo-black.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Aa][Rr][Mm]/ 27 | [Aa][Rr][Mm]64/ 28 | bld/ 29 | [Bb]in/ 30 | [Oo]bj/ 31 | [Ll]og/ 32 | [Ll]ogs/ 33 | 34 | # Visual Studio 2015/2017 cache/options directory 35 | .vs/ 36 | # Uncomment if you have tasks that create the project's static files in wwwroot 37 | #wwwroot/ 38 | 39 | # Visual Studio 2017 auto generated files 40 | Generated\ Files/ 41 | 42 | # MSTest test Results 43 | [Tt]est[Rr]esult*/ 44 | [Bb]uild[Ll]og.* 45 | 46 | # NUnit 47 | *.VisualState.xml 48 | TestResult.xml 49 | nunit-*.xml 50 | 51 | # Build Results of an ATL Project 52 | [Dd]ebugPS/ 53 | [Rr]eleasePS/ 54 | dlldata.c 55 | 56 | # Benchmark Results 57 | BenchmarkDotNet.Artifacts/ 58 | 59 | # .NET Core 60 | project.lock.json 61 | project.fragment.lock.json 62 | artifacts/ 63 | 64 | # StyleCop 65 | StyleCopReport.xml 66 | 67 | # Files built by Visual Studio 68 | *_i.c 69 | *_p.c 70 | *_h.h 71 | *.ilk 72 | *.meta 73 | *.obj 74 | *.iobj 75 | *.pch 76 | *.pdb 77 | *.ipdb 78 | *.pgc 79 | *.pgd 80 | *.rsp 81 | *.sbr 82 | *.tlb 83 | *.tli 84 | *.tlh 85 | *.tmp 86 | *.tmp_proj 87 | *_wpftmp.csproj 88 | *.log 89 | *.vspscc 90 | *.vssscc 91 | .builds 92 | *.pidb 93 | *.svclog 94 | *.scc 95 | 96 | # Chutzpah Test files 97 | _Chutzpah* 98 | 99 | # Visual C++ cache files 100 | ipch/ 101 | *.aps 102 | *.ncb 103 | *.opendb 104 | *.opensdf 105 | *.sdf 106 | *.cachefile 107 | *.VC.db 108 | *.VC.VC.opendb 109 | 110 | # Visual Studio profiler 111 | *.psess 112 | *.vsp 113 | *.vspx 114 | *.sap 115 | 116 | # Visual Studio Trace Files 117 | *.e2e 118 | 119 | # TFS 2012 Local Workspace 120 | $tf/ 121 | 122 | # Guidance Automation Toolkit 123 | *.gpState 124 | 125 | # ReSharper is a .NET coding add-in 126 | _ReSharper*/ 127 | *.[Rr]e[Ss]harper 128 | *.DotSettings.user 129 | 130 | # TeamCity is a build add-in 131 | _TeamCity* 132 | 133 | # DotCover is a Code Coverage Tool 134 | *.dotCover 135 | 136 | # AxoCover is a Code Coverage Tool 137 | .axoCover/* 138 | !.axoCover/settings.json 139 | 140 | # Visual Studio code coverage results 141 | *.coverage 142 | *.coveragexml 143 | 144 | # NCrunch 145 | _NCrunch_* 146 | .*crunch*.local.xml 147 | nCrunchTemp_* 148 | 149 | # MightyMoose 150 | *.mm.* 151 | AutoTest.Net/ 152 | 153 | # Web workbench (sass) 154 | .sass-cache/ 155 | 156 | # Installshield output folder 157 | [Ee]xpress/ 158 | 159 | # DocProject is a documentation generator add-in 160 | DocProject/buildhelp/ 161 | DocProject/Help/*.HxT 162 | DocProject/Help/*.HxC 163 | DocProject/Help/*.hhc 164 | DocProject/Help/*.hhk 165 | DocProject/Help/*.hhp 166 | DocProject/Help/Html2 167 | DocProject/Help/html 168 | 169 | # Click-Once directory 170 | publish/ 171 | 172 | # Publish Web Output 173 | *.[Pp]ublish.xml 174 | *.azurePubxml 175 | # Note: Comment the next line if you want to checkin your web deploy settings, 176 | # but database connection strings (with potential passwords) will be unencrypted 177 | *.pubxml 178 | *.publishproj 179 | 180 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 181 | # checkin your Azure Web App publish settings, but sensitive information contained 182 | # in these scripts will be unencrypted 183 | PublishScripts/ 184 | 185 | # NuGet Packages 186 | *.nupkg 187 | # NuGet Symbol Packages 188 | *.snupkg 189 | # The packages folder can be ignored because of Package Restore 190 | **/[Pp]ackages/* 191 | # except build/, which is used as an MSBuild target. 192 | !**/[Pp]ackages/build/ 193 | # Uncomment if necessary however generally it will be regenerated when needed 194 | #!**/[Pp]ackages/repositories.config 195 | # NuGet v3's project.json files produces more ignorable files 196 | *.nuget.props 197 | *.nuget.targets 198 | 199 | # Microsoft Azure Build Output 200 | csx/ 201 | *.build.csdef 202 | 203 | # Microsoft Azure Emulator 204 | ecf/ 205 | rcf/ 206 | 207 | # Windows Store app package directories and files 208 | AppPackages/ 209 | BundleArtifacts/ 210 | Package.StoreAssociation.xml 211 | _pkginfo.txt 212 | *.appx 213 | *.appxbundle 214 | *.appxupload 215 | 216 | # Visual Studio cache files 217 | # files ending in .cache can be ignored 218 | *.[Cc]ache 219 | # but keep track of directories ending in .cache 220 | !?*.[Cc]ache/ 221 | 222 | # Others 223 | ClientBin/ 224 | ~$* 225 | *~ 226 | *.dbmdl 227 | *.dbproj.schemaview 228 | *.jfm 229 | *.pfx 230 | *.publishsettings 231 | orleans.codegen.cs 232 | 233 | # Including strong name files can present a security risk 234 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 235 | #*.snk 236 | 237 | # Since there are multiple workflows, uncomment next line to ignore bower_components 238 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 239 | #bower_components/ 240 | 241 | # RIA/Silverlight projects 242 | Generated_Code/ 243 | 244 | # Backup & report files from converting an old project file 245 | # to a newer Visual Studio version. Backup files are not needed, 246 | # because we have git ;-) 247 | _UpgradeReport_Files/ 248 | Backup*/ 249 | UpgradeLog*.XML 250 | UpgradeLog*.htm 251 | ServiceFabricBackup/ 252 | *.rptproj.bak 253 | 254 | # SQL Server files 255 | *.mdf 256 | *.ldf 257 | *.ndf 258 | 259 | # Business Intelligence projects 260 | *.rdl.data 261 | *.bim.layout 262 | *.bim_*.settings 263 | *.rptproj.rsuser 264 | *- [Bb]ackup.rdl 265 | *- [Bb]ackup ([0-9]).rdl 266 | *- [Bb]ackup ([0-9][0-9]).rdl 267 | 268 | # Microsoft Fakes 269 | FakesAssemblies/ 270 | 271 | # GhostDoc plugin setting file 272 | *.GhostDoc.xml 273 | 274 | # Node.js Tools for Visual Studio 275 | .ntvs_analysis.dat 276 | node_modules/ 277 | 278 | # Visual Studio 6 build log 279 | *.plg 280 | 281 | # Visual Studio 6 workspace options file 282 | *.opt 283 | 284 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 285 | *.vbw 286 | 287 | # Visual Studio LightSwitch build output 288 | **/*.HTMLClient/GeneratedArtifacts 289 | **/*.DesktopClient/GeneratedArtifacts 290 | **/*.DesktopClient/ModelManifest.xml 291 | **/*.Server/GeneratedArtifacts 292 | **/*.Server/ModelManifest.xml 293 | _Pvt_Extensions 294 | 295 | # Paket dependency manager 296 | .paket/paket.exe 297 | paket-files/ 298 | 299 | # FAKE - F# Make 300 | .fake/ 301 | 302 | # CodeRush personal settings 303 | .cr/personal 304 | 305 | # Python Tools for Visual Studio (PTVS) 306 | __pycache__/ 307 | *.pyc 308 | 309 | # Cake - Uncomment if you are using it 310 | # tools/** 311 | # !tools/packages.config 312 | 313 | # Tabs Studio 314 | *.tss 315 | 316 | # Telerik's JustMock configuration file 317 | *.jmconfig 318 | 319 | # BizTalk build output 320 | *.btp.cs 321 | *.btm.cs 322 | *.odx.cs 323 | *.xsd.cs 324 | 325 | # OpenCover UI analysis results 326 | OpenCover/ 327 | 328 | # Azure Stream Analytics local run output 329 | ASALocalRun/ 330 | 331 | # MSBuild Binary and Structured Log 332 | *.binlog 333 | 334 | # NVidia Nsight GPU debugger configuration file 335 | *.nvuser 336 | 337 | # MFractors (Xamarin productivity tool) working folder 338 | .mfractor/ 339 | 340 | # Local History for Visual Studio 341 | .localhistory/ 342 | 343 | # BeatPulse healthcheck temp database 344 | healthchecksdb 345 | 346 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 347 | MigrationBackup/ 348 | 349 | # Ionide (cross platform F# VS Code tools) working folder 350 | .ionide/ 351 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 🛑 **Important Update on OculusKiller** 2 | 3 | As the world of VR technology continues to evolve, so do our tools and methods for enhancing your virtual reality experience. With great pride in what OculusKiller has achieved, we announce a significant change: 4 | 5 | 🔗 **OculusKiller is No Longer Maintained** 6 | 🌐 [Steam Link Now Available on the Oculus Store](https://www.meta.com/en-gb/experiences/5841245619310585/) 7 | 8 | Steam Link represents a new chapter in VR gaming, streaming your favorite games directly from your Steam library to your Meta Quest headset. This powerful, intuitive solution offers a high-fidelity and seamless way to enjoy your games wirelessly, using the robust capabilities of your computer. 9 | 10 | 🌟 **Key Features of Steam Link:** 11 | - **Seamless Integration:** Wirelessly connects to your computer on the same network with Steam running. 12 | - **High-Quality Streaming:** Leverages your computer's power for a superior gaming experience. 13 | - **Access to Steam Library:** Play, discuss, and explore your Steam games and desktop apps. 14 | 15 | 👉 **Getting Started:** 16 | 1. **Download Steam Link** onto your Meta Quest headset. 17 | 2. **Follow the Setup Guide** for wireless connection to your computer with Steam. 18 | 19 | **Minimum System Requirements:** 20 | - OS: Windows 10 or newer 21 | - GPU: NVIDIA GTX970 or better 22 | - Router: 5GHz, Wi-Fi 5 23 | - Headset: Meta Quest 2, 3, or Pro 24 | 25 | **Recommended Setup:** 26 | - Processor: Intel Core i5-4590/AMD FX 8350 or better 27 | - Memory: 16 GB RAM 28 | - GPU: NVIDIA RTX2070 or better 29 | - Internet: Broadband connection 30 | - Router: Wi-Fi 6 or 6E 31 | - Wired network connection for the computer 32 | 33 | 🙏 **A Heartfelt Thank You to Our Community** 34 | The journey with OculusKiller has been nothing short of remarkable, thanks to your unwavering support and enthusiasm. As we pivot to embrace new technologies like Steam Link, we want to express our deepest gratitude to everyone who downloaded, used, and contributed to OculusKiller and its ReVamped edition. 35 | 36 | Your engagement and feedback were the lifeblood of this project, driving us to innovate and improve continuously. We are immensely thankful to our dedicated team, contributors, and users for their invaluable input and support. 37 | 38 | 🗃 **Archiving the Repository** 39 | While we step into this new phase, the OculusKiller repository will be archived but remain accessible for historical reference and any future needs. This marks not an end, but a transformation, as we continue to push the boundaries of virtual reality experiences. 40 | 41 | 🌟 **Thank You Again** 42 | Your support has been the cornerstone of OculusKiller's success. We look forward to your continued engagement as we explore new horizons in VR technology. 43 | 44 | With appreciation and excitement for the future, 45 | 46 | **The Oculus Killer Team** 🚀 47 | 48 | 49 | # Oculus Killer 🚀 50 | 51 | Oculus Killer has evolved! Now more efficient and user-friendly, it focuses on enhancing your VR experience by terminating unnecessary Oculus processes and seamlessly launching SteamVR. This latest version is a leap forward, featuring a modular design, smoother and faster performance, and an advanced logging system for better error tracking and process monitoring. 52 | 53 | **Original Author:** [@kaitlyndotmoe](https://github.com/kaitlyndotmoe) 54 | **Contributors:** @UnusualNorm, @HyrumGG 55 | **Original Repository:** [OculusKiller](https://github.com/kaitlyndotmoe/OculusKiller) 56 | 57 | This tool is a perfect companion to the [Oculus VR Dash Manager](https://github.com/DevOculus-Meta-Quest/Oculus-VR-Dash-Manager), ensuring a comprehensive and optimized VR experience. 58 | 59 | OculusKiller 60 | 61 | ## 🚩 Index 62 | - [Features](#-features) 63 | - [Download](#-download-) 64 | - [Installation](#-installation) 65 | - [Common Fixes](#-common-fixes) 66 | - [Support](#-support-oculus-killer) 67 | - [Changelog](Changelog.md) 68 | - [Logging](#-logging) 69 | - [Acknowledgements](#-acknowledgements) 70 | 71 | ## 🌟 Features 72 | - Modular Design for Enhanced Flexibility 73 | - Improved Performance for a Smoother Experience 74 | - Advanced Error Handling for Reliability 75 | - Real-Time Process Monitoring 76 | - Graceful Exit Detection for SteamVR 77 | - Efficient Logging System with Log Rotation 78 | 79 | ## ⬇️ Download ⬇️ 80 | 81 | Grab the latest release [here](https://github.com/DevOculus-Meta-Quest/OculusKiller/releases). 82 | 83 |

84 | HitCount 85 | GitHub Workflow Status 86 | GitHub release (latest by SemVer including pre-releases) 87 | GitHub all releases 88 | GitHub Downloads 89 | PayPal 90 |

91 | 92 | ## 📜 Logging 93 | - **Log Location:** All log files are located at `C:\Users\\AppData\Local\OculusKiller\OculusKiller.log`. 94 | - **Log Rotation:** To ensure efficiency and manageability, Oculus Killer implements a log rotation system. This means older logs are archived periodically, keeping the active log file fresh and concise. 95 | - **Error and Process Monitoring:** The logging system meticulously records all significant events, errors, and process activities. This allows for easy troubleshooting and understanding of the application's behavior. 96 | - **Reading Logs:** You can view the logs using any text editor. They provide detailed insights into the application's operations, including any issues encountered and actions taken by the software. 97 | 98 | ## 🚀 Support Oculus Killer 99 | 🚀 [Support Us with a Donation](https://www.paypal.com/donate/?business=X76ZW4RHA6T9C&no_recurring=0&item_name=Support+the+evolution+of+Oculus+VR+Dash+Manager%21+Your+donation+fuels+innovation+and+enhanced+virtual+experiences.+%F0%9F%9A%80%F0%9F%8C%90¤cy_code=USD) 100 | 101 | Every contribution, no matter the size, makes a monumental difference. Thank you for believing in Oculus Killer and for being an integral part of our community. Together, we're not just playing games; we're setting new standards for virtual reality. 102 | 103 | With gratitude, 104 | 105 | The Oculus Killer Team 🌟 106 | 107 | 108 | ## 🔄 Recent Updates 109 | - **Removed Auto-Restart:** We've removed the automatic restart function due to its potential to cause issues. Oculus Killer now focuses on efficiently terminating processes and monitoring for a more stable experience. 110 | - **Enhanced Exit Detection:** The process monitoring has been refined to better detect when users exit SteamVR, ensuring a more responsive and accurate shutdown of unnecessary processes. 111 | - **Advanced Logging:** The logging system has been upgraded for more detailed and informative logs, making it easier to track the application's performance and troubleshoot any issues. 112 | 113 | ## 🛠 Installation 114 | 1. Open Task Manager, go to Services and look for OVRService, right click on it and stop it. (If you have the Oculus app or any VR games open, they WILL close when stopping OVRService.) 115 | 2. Go to `C:\Program Files\Oculus\Support\oculus-dash\dash\bin` in Explorer. 116 | 3. Rename the original `OculusDash.exe` to `OculusDash.exe.bak` and move my replacement `OculusDash.exe` into the folder you just opened in Explorer. 117 | 4. Go back to Task Manager, look for OVRService again, right click on it and start it. 118 | 119 | ## 🛠 Common Fixes 120 | ### Headset Infinitely Loads (SteamVR doesn't launch) 121 | - Open "File Explorer" 122 | - Click the "View" tab (at the top) 123 | - Enable "File name extensions" 124 | - Follow the installation instructions 125 | 126 | ## 🙏 Acknowledgements 127 | We extend our heartfelt gratitude to everyone who has contributed to the development and evolution of Oculus Killer. This project is not just a product of our team's hard work but also a reflection of the invaluable support and feedback from our user community. 128 | 129 | **Special Thanks:** 130 | - **[@kaitlyndotmoe](https://github.com/kaitlyndotmoe):** For initiating this project and laying the foundation for what Oculus Killer has become today. 131 | - **Community Contributors:** To all the developers, testers, and users who have contributed their time, skills, and insights to improve Oculus Killer. Your pull requests, bug reports, and suggestions have been instrumental in shaping this tool. 132 | - **Oculus VR Dash Manager Team:** For their collaboration and support, which has been crucial in ensuring compatibility and enhancing the overall VR experience. 133 | - **Our Users:** To every individual who has downloaded, used, and provided feedback on Oculus Killer. Your engagement and enthusiasm keep us motivated and focused on continuous improvement. 134 | 135 | **Donors and Supporters:** 136 | - We are immensely thankful to those who have supported us through donations. Your generosity helps us keep the project alive and thriving. 137 | 138 | **Family and Friends:** 139 | - A special mention to our families and friends for their understanding, encouragement, and patience. Balancing development time with personal life is a challenge, and your support makes it all possible. 140 | 141 | As we continue to develop Oculus Killer, we remain committed to our community's needs and aspirations. Your ongoing support and feedback are the driving forces behind our innovation and dedication. 142 | 143 | Thank you for being a part of our journey. Together, we are not just enhancing a tool; we are shaping the future of virtual reality experiences. 144 | 145 | **The Oculus Killer Team** 🚀 146 | 147 | --- 148 | 149 | Oculus Killer continues to evolve, driven by community feedback and a commitment to enhancing your VR experience. Stay tuned for more updates and improvements! 🌟 150 | --------------------------------------------------------------------------------