From 6d6d747da9958af9da7df9d2eea262f51d5d7c77 Mon Sep 17 00:00:00 2001 From: ChsBuffer <33744752+chsbuffer@users.noreply.github.com> Date: Tue, 14 Jul 2020 17:09:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=8C=89=E9=92=AE=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8D=E5=8D=B8=E8=BD=BDNF=E9=A9=B1=E5=8A=A8?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Netch/Controllers/Mode/NFController.cs | 126 ++++++++++++------------- Netch/Forms/MainForm.Control.cs | 86 ++++++++--------- Netch/Forms/MainForm.MenuStrip.cs | 3 +- Netch/Models/State.cs | 13 +-- 4 files changed, 112 insertions(+), 116 deletions(-) diff --git a/Netch/Controllers/Mode/NFController.cs b/Netch/Controllers/Mode/NFController.cs index a77ece6c..f947fed3 100644 --- a/Netch/Controllers/Mode/NFController.cs +++ b/Netch/Controllers/Mode/NFController.cs @@ -13,65 +13,58 @@ namespace Netch.Controllers { public class NFController : ModeController { - /// - /// 流量变动处理器 - /// - /// 上传 - /// 下载 - public delegate void BandwidthUpdateHandler(long upload, long download); + private static readonly ServiceController NFService = new ServiceController("netfilter2"); - private readonly string _binDriverPath; + private static readonly string BinDriver = ""; + private static readonly string SystemDriver = $"{Environment.SystemDirectory}\\drivers\\netfilter2.sys"; - private readonly string _driverPath = $"{Environment.SystemDirectory}\\drivers\\netfilter2.sys"; - private readonly ServiceController _service = new ServiceController("netfilter2"); - private string _systemDriverVersion; + public static string DriverVersion(string file) + { + return File.Exists(file) ? FileVersionInfo.GetVersionInfo(file).FileVersion : ""; + } + + static NFController() + { + // 生成系统版本 + var winNTver = $"{Environment.OSVersion.Version.Major.ToString()}.{Environment.OSVersion.Version.Minor.ToString()}"; + switch (winNTver) + { + case "10.0": + BinDriver = "Win-10.sys"; + break; + case "6.3": + case "6.2": + BinDriver = "Win-8.sys"; + break; + case "6.1": + case "6.0": + BinDriver = "Win-7.sys"; + break; + default: + Logging.Error($"不支持的系统版本:{winNTver}"); + return; + } + + BinDriver = "bin\\" + BinDriver; + } public NFController() { MainFile = "Redirector"; + ExtFiles = new[] {Path.GetFileName(BinDriver)}; InitCheck(); - // 生成系统版本 - var winNTver = $"{Environment.OSVersion.Version.Major.ToString()}.{Environment.OSVersion.Version.Minor.ToString()}"; - var driverName = ""; - switch (winNTver) - { - case "10.0": - driverName = "Win-10.sys"; - break; - case "6.3": - case "6.2": - driverName = "Win-8.sys"; - break; - case "6.1": - case "6.0": - driverName = "Win-7.sys"; - break; - default: - Logging.Error($"不支持的系统版本:{winNTver}"); - Ready = false; - return; - } - _binDriverPath = "bin\\" + driverName; - - if (!File.Exists(_driverPath)) + if (!File.Exists(SystemDriver)) { InstallDriver(); } - // 驱动版本 - _systemDriverVersion = FileVersionInfo.GetVersionInfo(_driverPath).FileVersion; } - /// - /// 流量变动事件 - /// - public event BandwidthUpdateHandler OnBandwidthUpdated; - public override bool Start(Server server, Mode mode) { if (!CheckDriverReady()) { - if (File.Exists(_driverPath)) + if (File.Exists(SystemDriver)) UninstallDriver(); if (!InstallDriver()) return false; @@ -131,19 +124,19 @@ namespace Netch.Controllers { try { - switch (_service.Status) + switch (NFService.Status) { // 启动驱动服务 case ServiceControllerStatus.Running: // 防止其他程序占用 重置 NF 百万连接数限制 - _service.Stop(); - _service.WaitForStatus(ServiceControllerStatus.Stopped); + NFService.Stop(); + NFService.WaitForStatus(ServiceControllerStatus.Stopped); MainForm.Instance.StatusText(i18N.Translate("Starting netfilter2 Service")); - _service.Start(); + NFService.Start(); break; case ServiceControllerStatus.Stopped: MainForm.Instance.StatusText(i18N.Translate("Starting netfilter2 Service")); - _service.Start(); + NFService.Start(); break; } } @@ -167,22 +160,20 @@ namespace Netch.Controllers private bool CheckDriverReady() { // 检查驱动是否存在 - if (!File.Exists(_driverPath)) return false; + if (!File.Exists(SystemDriver)) return false; // 检查驱动版本号 - var binVersion = FileVersionInfo.GetVersionInfo(_binDriverPath).FileVersion; - return _systemDriverVersion.Equals(binVersion); + return DriverVersion(SystemDriver) == DriverVersion(BinDriver); } - public bool UninstallDriver() + public static bool UninstallDriver() { try { - var service = new ServiceController("netfilter2"); - if (service.Status == ServiceControllerStatus.Running) + if (NFService.Status == ServiceControllerStatus.Running) { - service.Stop(); - service.WaitForStatus(ServiceControllerStatus.Stopped); + NFService.Stop(); + NFService.WaitForStatus(ServiceControllerStatus.Stopped); } } catch (Exception) @@ -190,13 +181,12 @@ namespace Netch.Controllers // ignored } - if (!File.Exists(_driverPath)) return true; + if (!File.Exists(SystemDriver)) return true; try { NFAPI.nf_unRegisterDriver("netfilter2"); - File.Delete(_driverPath); - _systemDriverVersion = ""; + File.Delete(SystemDriver); return true; } catch (Exception ex) @@ -205,13 +195,12 @@ namespace Netch.Controllers } } - public bool InstallDriver() + public static bool InstallDriver() { - if (!Ready) return false; Logging.Info("安装驱动中"); try { - File.Copy(_binDriverPath, _driverPath); + File.Copy(BinDriver, SystemDriver); } catch (Exception e) { @@ -224,8 +213,7 @@ namespace Netch.Controllers var result = NFAPI.nf_registerDriver("netfilter2"); if (result == NF_STATUS.NF_STATUS_SUCCESS) { - _systemDriverVersion = FileVersionInfo.GetVersionInfo(_driverPath).FileVersion; - Logging.Info($"驱动安装成功,当前驱动版本:{_systemDriverVersion}"); + Logging.Info($"驱动安装成功,当前驱动版本:{DriverVersion(DriverVersion(SystemDriver))}"); } else { @@ -269,5 +257,17 @@ namespace Netch.Controllers { StopInstance(); } + + /// + /// 流量变动事件 + /// + public event BandwidthUpdateHandler OnBandwidthUpdated; + + /// + /// 流量变动处理器 + /// + /// 上传 + /// 下载 + public delegate void BandwidthUpdateHandler(long upload, long download); } } \ No newline at end of file diff --git a/Netch/Forms/MainForm.Control.cs b/Netch/Forms/MainForm.Control.cs index a36e6d0d..100a6925 100644 --- a/Netch/Forms/MainForm.Control.cs +++ b/Netch/Forms/MainForm.Control.cs @@ -52,18 +52,18 @@ namespace Netch.Forms { Task.Run(() => { + UpdateStatus(State.Started); + StatusText(i18N.Translate(StateExtension.GetStatusString(State)) + PortText(server.Type,mode.Type)); + LastUploadBandwidth = 0; //LastDownloadBandwidth = 0; //UploadSpeedLabel.Text = "↑: 0 KB/s"; DownloadSpeedLabel.Text = "↑↓: 0 KB/s"; UsedBandwidthLabel.Text = $"{i18N.Translate("Used",": ")}0 KB"; UsedBandwidthLabel.Visible = UploadSpeedLabel.Visible = DownloadSpeedLabel.Visible = true; - - UploadSpeedLabel.Visible = false; Bandwidth.NetTraffic(server, mode, MainController); }); - //MainController.pNFController.OnBandwidthUpdated += OnBandwidthUpdated; // 如果勾选启动后最小化 if (Global.Settings.MinimizeWhenStarted) @@ -86,45 +86,6 @@ namespace Netch.Forms Hide(); } - // TODO 是否需要移到一个函数中 - var text = new StringBuilder(" ("); - text.Append(Global.Settings.LocalAddress == "0.0.0.0" - ? i18N.Translate("Allow other Devices to connect") + " " - : ""); - if (server.Type == "Socks5") - { - // 不可控Socks5 - if (mode.Type == 3 || mode.Type == 5) - { - // 可控HTTP - text.Append( - $"HTTP {i18N.Translate("Local Port", ": ")}{Global.Settings.HTTPLocalPort}"); - } - else - { - // 不可控HTTP - text.Clear(); - } - } - else - { - // 可控Socks5 - text.Append( - $"Socks5 {i18N.Translate("Local Port", ": ")}{Global.Settings.Socks5LocalPort}"); - if (mode.Type == 3 || mode.Type == 5) - { - //有HTTP - text.Append( - $" | HTTP {i18N.Translate("Local Port", ": ")}{Global.Settings.HTTPLocalPort}"); - } - } - if (text.Length > 0) - { - text.Append(")"); - } - UpdateStatus(State.Started); - StatusText(i18N.Translate(StateExtension.GetStatusString(State)) + text); - if (Global.Settings.StartedTcping) { // 自动检测延迟 @@ -169,6 +130,47 @@ namespace Netch.Forms } } + private string PortText(string serverType,int modeType) + { + var text = new StringBuilder(" ("); + text.Append(Global.Settings.LocalAddress == "0.0.0.0" + ? i18N.Translate("Allow other Devices to connect") + " " + : ""); + if (serverType == "Socks5") + { + // 不可控Socks5 + if (modeType == 3 || modeType == 5) + { + // 可控HTTP + text.Append( + $"HTTP {i18N.Translate("Local Port", ": ")}{Global.Settings.HTTPLocalPort}"); + } + else + { + // 不可控HTTP + text.Clear(); + } + } + else + { + // 可控Socks5 + text.Append( + $"Socks5 {i18N.Translate("Local Port", ": ")}{Global.Settings.Socks5LocalPort}"); + if (modeType == 3 || modeType == 5) + { + //有HTTP + text.Append( + $" | HTTP {i18N.Translate("Local Port", ": ")}{Global.Settings.HTTPLocalPort}"); + } + } + if (text.Length > 0) + { + text.Append(")"); + } + + return text.ToString(); + } + public void OnBandwidthUpdated(long download) { try diff --git a/Netch/Forms/MainForm.MenuStrip.cs b/Netch/Forms/MainForm.MenuStrip.cs index 1ad44637..de7cb2ab 100644 --- a/Netch/Forms/MainForm.MenuStrip.cs +++ b/Netch/Forms/MainForm.MenuStrip.cs @@ -274,7 +274,7 @@ namespace Netch.Forms { try { - if (new NFController().UninstallDriver()) + if (NFController.UninstallDriver()) { MessageBoxX.Show(i18N.Translate("Service has been uninstalled"), owner: this); } @@ -286,6 +286,7 @@ namespace Netch.Forms throw; } + StatusText(i18N.Translate(StateExtension.GetStatusString(State.Waiting))); Enabled = true; }); } diff --git a/Netch/Models/State.cs b/Netch/Models/State.cs index a284008c..7a0cf49a 100644 --- a/Netch/Models/State.cs +++ b/Netch/Models/State.cs @@ -41,16 +41,9 @@ { public static string GetStatusString(State state) { - return state switch - { - State.Started => state.ToString(), - State.Stopping => state.ToString(), - State.Stopped => state.ToString(), - State.Terminating => state.ToString(), - State.Starting => state.ToString(), - State.Waiting => "Waiting for command", - _ => "" - }; + if (state == State.Waiting) + return "Waiting for command"; + return state.ToString(); } } } \ No newline at end of file