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