Remove OemKill

This commit is contained in:
X9VoiD 2021-10-29 23:55:44 +08:00
parent 5a93b4d147
commit 4e078b1436
6 changed files with 1 additions and 262 deletions

View file

@ -15,7 +15,6 @@ jobs:
- { path: OutputMode, plugin: TouchEmu }
- { path: OutputMode, plugin: VMultiMode }
- { path: OutputMode, plugin: WindowsInk }
- { path: Tool, plugin: OemKill }
runs-on: ubuntu-latest

View file

@ -37,11 +37,7 @@ VoiDPlugins is a collection of extensions for [OpenTabletDriver](https://github.
Touch input emulation (RawInput incompatible)
Natural Scrolling everywhere
## Tools
### [OemKill](https://github.com/X9VoiD/VoiDPlugins/wiki/OemKill)
Automatically kill OEM Tablet Driver processes
## Bindings
### [ScriptRunner](https://github.com/X9VoiD/VoiDPlugins/wiki/ScriptRunner)

View file

@ -1,15 +0,0 @@
namespace VoiDPlugins.Tool
{
class IndexedInf
{
public int index;
public string inf;
public string name;
public IndexedInf(int index, string name, string inf)
{
this.index = index;
this.inf = inf;
this.name = name;
}
}
}

View file

@ -1,33 +0,0 @@
using System.Collections.Generic;
namespace VoiDPlugins.Tool
{
internal static class OemData
{
public static readonly List<string> OemProcesses = new List<string>
{
// XP-Pen
"PentabletService",
"PenTablet",
// Wacom
"WacomDesktopCenter",
"Wacom_Tablet",
"Pen_Tablet",
// Gaomon
"Gaomon Tablet",
"TabletDriverCore",
// VEIKK
"TabletDriverCenter",
"TabletDriverSetting"
};
public static readonly List<string> OemDrivers = new List<string>
{
// Gaomon, Huion
"Graphics Tablet"
};
}
}

View file

@ -1,191 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading;
using OpenTabletDriver.Plugin;
using OpenTabletDriver.Plugin.Attributes;
namespace VoiDPlugins.Tool
{
[PluginName("OEM Kill"), SupportedPlatform(PluginPlatform.Windows)]
public class OemKill : ITool
{
public bool Initialize()
{
Terminate();
return true;
}
[Action("Driver", "Kill OEM Drivers"), ToolTip("Terminate known OEM Drivers")]
public static void Terminate()
{
var processList = Process.GetProcesses();
var oemProcesses = from process in processList
where OemData.OemProcesses.Contains(process.ProcessName)
select process;
if (oemProcesses.ToList().Count == 0)
{
Log.Write("OemKill", "No oem process found");
return;
}
foreach (var process in oemProcesses)
{
try
{
process.Kill();
Log.Write("OemKill", "Killing " + process.ProcessName);
}
catch (Exception e)
{
Log.Write("OemKill", "Failed. Reason: " + e.Message, LogLevel.Error);
return;
}
}
Log.Write("OemKill", "Oem process killed successfully");
}
[Action("Driver", "Restore Driver Defaults"), ToolTip("Fix issues with remnant drivers from Huion and Gaomon")]
public static void RestoreDriver()
{
RunRestore(false);
}
[Action("Driver", "Simulate 'Restore Driver Defaults'"), ToolTip("Simulates driver restoration without actually doing any driver related action, and opens assets folder for inspection")]
public static void SimulateRestoreDriver()
{
RunRestore(true);
}
private static void RunRestore(bool simulate)
{
var location = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var assets = Path.Join(location, "assets");
if (!Directory.Exists(assets))
{
Directory.CreateDirectory(assets);
}
RunEnum(assets, out var enumOutput);
List<IndexedInf> oemDrivers = new List<IndexedInf>();
for (int i = 0; i < enumOutput.Length; i++)
{
var infMatch = inf.Match(enumOutput[i]);
if (infMatch.Success)
{
var infName = infMatch.Groups[1].Value;
var driverName = driver.Match(enumOutput[i + 1]).Groups[1].Value;
if (OemData.OemDrivers.Contains(driverName))
{
Log.Write("OemKill", $"Found '{driverName}' with driver '{infName}'");
oemDrivers.Add(new IndexedInf(i, driverName, infName));
}
}
}
if (oemDrivers.Count == 0)
{
Log.Write("OemKill", "No remnant driver found");
if (simulate)
{
Log.Write("OemKill", $"You may now inspect generated scripts on: '{assets}'");
var startInfo = new ProcessStartInfo("explorer", $"{assets}");
Process.Start(startInfo);
}
return;
}
var restoreHelperScript = Path.Join(assets, "restore.bat");
using (var restoreHelperStream = File.CreateText(restoreHelperScript))
{
restoreHelperStream.WriteLine("@echo off");
restoreHelperStream.WriteLine("echo WARNING! OTD will be closed after you press any key.");
restoreHelperStream.WriteLine("pause");
restoreHelperStream.WriteLine("taskkill /F /IM OpenTabletDriver.UX.Wpf.exe");
restoreHelperStream.WriteLine("taskkill /F /IM OpenTabletDriver.Daemon.exe");
restoreHelperStream.WriteLine("echo Script auto-generated by OemKill OTD plugin");
foreach (var oemDriver in oemDrivers)
{
restoreHelperStream.WriteLine($"echo Uninstalling '{oemDriver.name}' with driver '{oemDriver.inf}'...");
restoreHelperStream.WriteLine($"pnputil -f -d {oemDriver.inf}");
}
restoreHelperStream.WriteLine("echo Installing default driver...");
restoreHelperStream.WriteLine($"pnputil -i -a %SystemRoot%/INF/input.inf");
restoreHelperStream.WriteLine("echo Driver restore done! You may now start OTD again");
}
if (simulate)
{
Log.Write("OemKill", $"You may now inspect generated scripts on: '{assets}'");
var startInfo = new ProcessStartInfo("explorer", $"{assets}");
Process.Start(startInfo);
}
else
{
Terminate();
Call(restoreHelperScript, true);
}
}
private static void RunEnum(string assetsLocation, out string[] output)
{
var enumHelperScript = Path.Join(assetsLocation, "enumerator.bat");
var enumHelperOutput = Path.Join(assetsLocation, "drivers.txt");
using (var enumHelperStream = File.CreateText(enumHelperScript))
{
enumHelperStream.WriteLine(":: Script auto-generated by OemKill OTD plugin");
enumHelperStream.WriteLine($"pnputil -e > \"{enumHelperOutput}\"");
}
Log.Write("OemKill", "Enumerating oem driver installations");
Call(enumHelperScript);
while (!File.Exists(enumHelperOutput))
{
Thread.Sleep(100);
}
bool read = false;
while (!read)
{
try
{
output = File.ReadAllLines(enumHelperOutput);
read = true;
return;
} catch { }
}
output = null;
}
private static void Call(string file, bool asAdmin = false)
{
Log.Write("OemKill", $" Calling script: '{file}'");
var info = new ProcessStartInfo("powershell")
{
CreateNoWindow = true,
Arguments = asAdmin ? $"-c start -verb runas {file}" : $"-c start {file}"
};
var process = Process.Start(info);
process.WaitForExit();
}
private static readonly Regex inf = new Regex(":\\s*(.*\\.inf)$", RegexOptions.Compiled);
private static readonly Regex driver = new Regex(@":\s*(.*)$", RegexOptions.Compiled);
public void Dispose() { }
}
}

View file

@ -1,17 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net5</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<DebugType>none</DebugType>
<DebugSymbols>false</DebugSymbols>
<CopyOutputSymbolsToOutputDirectory>false</CopyOutputSymbolsToOutputDirectory>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../../.modules/OpenTabletDriver/OpenTabletDriver.Plugin/OpenTabletDriver.Plugin.csproj" />
</ItemGroup>
</Project>