Program.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using NetFilterHelper.Utils;
  2. using NetFilterHelper.Enums;
  3. using nfapinet;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Security.Principal;
  9. using System.ServiceProcess;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. namespace NetFilterHelper
  13. {
  14. class Program
  15. {
  16. static ServiceController NFService = new ServiceController("netfilter2");
  17. static string BinDriver = string.Empty;
  18. static string SystemDriver = $"{Environment.SystemDirectory}\\drivers\\netfilter2.sys";
  19. static int Main(string[] args)
  20. {
  21. if (!IsAdministrator())
  22. {
  23. return (int)ResultCode.NoPermission;
  24. }
  25. if (args.Length == 1)
  26. {
  27. // 在这里初始化
  28. Init();
  29. string command = args[0];
  30. switch (command)
  31. {
  32. case "install":
  33. return InstallDriver();
  34. case "uninstall":
  35. return UninstallDriver();
  36. case "reinstall":
  37. UninstallDriver();
  38. return InstallDriver();
  39. default:
  40. return (int)ResultCode.NotSupport;
  41. }
  42. }
  43. else
  44. {
  45. return (int)ResultCode.NotSupport;
  46. }
  47. }
  48. static void Init()
  49. {
  50. string fileName;
  51. switch ($"{Environment.OSVersion.Version.Major}.{Environment.OSVersion.Version.Minor}")
  52. {
  53. case "10.0": // Win 10
  54. case "6.3": // Win 8
  55. case "6.2": // Win 8
  56. case "6.1": // Win 7
  57. case "6.0": // Win 7
  58. if (SystemHelper.Is64BitOperatingSystem())
  59. fileName = "netfilter2-amd64.sys";
  60. else
  61. fileName = "netfilter2-i386.sys";
  62. break;
  63. default:
  64. return;
  65. }
  66. BinDriver = Path.Combine(Directory.GetCurrentDirectory(), $"{fileName}");
  67. }
  68. static bool IsAdministrator()
  69. {
  70. return (new WindowsPrincipal(WindowsIdentity.GetCurrent())).IsInRole(WindowsBuiltInRole.Administrator);
  71. }
  72. static int ValueWithCode(IntPtr wow64Value, ResultCode resultCode)
  73. {
  74. // 重新启用重定向
  75. SystemHelper.Wow64RevertWow64FsRedirection(wow64Value);
  76. // 返回对应值
  77. return (int)resultCode;
  78. }
  79. static int InstallDriver()
  80. {
  81. IntPtr wow64Value = IntPtr.Zero;
  82. // 禁用重定向
  83. SystemHelper.Wow64DisableWow64FsRedirection(ref wow64Value);
  84. try
  85. {
  86. File.Copy(BinDriver, SystemDriver);
  87. }
  88. catch (Exception)
  89. {
  90. return ValueWithCode(wow64Value, ResultCode.CopyFail);
  91. }
  92. // 注册驱动文件
  93. var result = NFAPI.nf_registerDriver("netfilter2");
  94. if (result != NF_STATUS.NF_STATUS_SUCCESS)
  95. {
  96. return ValueWithCode(wow64Value, ResultCode.CopyFail);
  97. }
  98. return ValueWithCode(wow64Value, ResultCode.Success);
  99. }
  100. static int UninstallDriver()
  101. {
  102. IntPtr wow64Value = IntPtr.Zero;
  103. // 禁用重定向
  104. SystemHelper.Wow64DisableWow64FsRedirection(ref wow64Value);
  105. try
  106. {
  107. if (NFService.Status == ServiceControllerStatus.Running)
  108. {
  109. NFService.Stop();
  110. NFService.WaitForStatus(ServiceControllerStatus.Stopped);
  111. }
  112. }
  113. catch (Exception)
  114. {
  115. // ignored
  116. }
  117. if (!File.Exists(SystemDriver))
  118. return ValueWithCode(wow64Value, ResultCode.Success);
  119. NFAPI.nf_unRegisterDriver("netfilter2");
  120. File.Delete(SystemDriver);
  121. return ValueWithCode(wow64Value, ResultCode.Success);
  122. }
  123. }
  124. }