PortProxyGUI.1.4.1

This commit is contained in:
zmjack 2023-06-14 01:28:22 +08:00
parent 5bb57e43e9
commit fe77568021
19 changed files with 373 additions and 169 deletions

View File

@ -1,7 +1,6 @@
using PortProxyGUI.Utils;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
namespace PortProxyGUI

View File

@ -3,8 +3,11 @@
namespace PortProxyGUI.Native
{
[Flags]
public enum GenericRights : uint
internal enum GenericRights : uint
{
GENERIC_READ = 0x80000000,
GENERIC_WRITE = 0x40000000,
GENERIC_EXECUTE = 0x20000000,
GENERIC_ALL = 0x10000000,
}
}

View File

@ -6,17 +6,28 @@ namespace PortProxyGUI.Native
internal class NativeMethods
{
[DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);
internal static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);
[DllImport("advapi32.dll", EntryPoint = "OpenServiceW", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, ServiceRights dwDesiredAccess);
internal static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, ServiceRights dwDesiredAccess);
[DllImport("advapi32.dll", EntryPoint = "QueryServiceStatus", CharSet = CharSet.Auto)]
internal static extern bool QueryServiceStatus(IntPtr hService, ref ServiceStatus dwServiceStatus);
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ControlService(IntPtr hService, ServiceControls dwControl, ref ServiceStatus lpServiceStatus);
internal static extern bool ControlService(IntPtr hService, ServiceControls dwControl, ref ServiceStatus lpServiceStatus);
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseServiceHandle(IntPtr hSCObject);
internal static extern bool CloseServiceHandle(IntPtr hSCObject);
[DllImport("dnsapi.dll", EntryPoint = "DnsFlushResolverCache")]
internal static extern uint DnsFlushResolverCache();
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool StartService(IntPtr hService, int dwNumServiceArgs, string[] lpServiceArgVectors);
}
}

View File

@ -0,0 +1,21 @@
namespace PortProxyGUI.Native
{
internal enum ScmRights : uint
{
SC_MANAGER_CONNECT = 0x0001,
SC_MANAGER_CREATE_SERVICE = 0x0002,
SC_MANAGER_ENUMERATE_SERVICE = 0x0004,
SC_MANAGER_LOCK = 0x0008,
SC_MANAGER_QUERY_LOCK_STATUS = 0x0010,
SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020,
SC_MANAGER_ALL_ACCESS =
StandardRights.STANDARD_RIGHTS_REQUIRED
| SC_MANAGER_CONNECT
| SC_MANAGER_CREATE_SERVICE
| SC_MANAGER_ENUMERATE_SERVICE
| SC_MANAGER_LOCK
| SC_MANAGER_QUERY_LOCK_STATUS
| SC_MANAGER_MODIFY_BOOT_CONFIG
}
}

View File

@ -3,7 +3,7 @@
namespace PortProxyGUI.Native
{
[Flags]
public enum ServiceControls : uint
internal enum ServiceControls : uint
{
SERVICE_CONTROL_PARAMCHANGE = 0x00000006,
}

View File

@ -3,8 +3,27 @@
namespace PortProxyGUI.Native
{
[Flags]
public enum ServiceRights : uint
internal enum ServiceRights : uint
{
SERVICE_QUERY_CONFIG = 0x0001,
SERVICE_CHANGE_CONFIG = 0x0002,
SERVICE_QUERY_STATUS = 0x0004,
SERVICE_ENUMERATE_DEPENDENTS = 0x0008,
SERVICE_START = 0x0010,
SERVICE_STOP = 0x0020,
SERVICE_PAUSE_CONTINUE = 0x0040,
SERVICE_INTERROGATE = 0x0080,
SERVICE_USER_DEFINED_CONTROL = 0x0100,
SERVICE_ALL_ACCESS =
SERVICE_QUERY_CONFIG
| SERVICE_CHANGE_CONFIG
| SERVICE_QUERY_STATUS
| SERVICE_ENUMERATE_DEPENDENTS
| SERVICE_START
| SERVICE_STOP
| SERVICE_PAUSE_CONTINUE
| SERVICE_INTERROGATE
| SERVICE_USER_DEFINED_CONTROL
}
}

View File

@ -0,0 +1,13 @@
namespace PortProxyGUI.Native
{
internal enum ServiceState : int
{
SERVICE_STOPPED = 0x00000001,
SERVICE_START_PENDING = 0x00000002,
SERVICE_STOP_PENDING = 0x00000003,
SERVICE_RUNNING = 0x00000004,
SERVICE_CONTINUE_PENDING = 0x00000005,
SERVICE_PAUSE_PENDING = 0x00000006,
SERVICE_PAUSED = 0x00000007,
}
}

View File

@ -3,10 +3,10 @@
namespace PortProxyGUI.Native
{
[StructLayout(LayoutKind.Sequential)]
public struct ServiceStatus
internal struct ServiceStatus
{
public uint dwServiceType;
public uint dwCurrentState;
public ServiceState dwCurrentState;
public uint dwControlsAccepted;
public uint dwWin32ExitCode;
public uint dwServiceSpecificExitCode;

View File

@ -0,0 +1,7 @@
namespace PortProxyGUI.Native
{
internal enum StandardRights : uint
{
STANDARD_RIGHTS_REQUIRED = 0x000F0000,
}
}

View File

@ -52,14 +52,18 @@
toolStripMenuItem_More = new System.Windows.Forms.ToolStripMenuItem();
toolStripMenuItem_Import = new System.Windows.Forms.ToolStripMenuItem();
toolStripMenuItem_Export = new System.Windows.Forms.ToolStripMenuItem();
toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
toolStripMenuItem_ResetWindowSize = new System.Windows.Forms.ToolStripMenuItem();
toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
toolStripMenuItem_About = new System.Windows.Forms.ToolStripMenuItem();
imageListProxies = new System.Windows.Forms.ImageList(components);
saveFileDialog_Export = new System.Windows.Forms.SaveFileDialog();
openFileDialog_Import = new System.Windows.Forms.OpenFileDialog();
toolStripMenuItem_ResetWindowSize = new System.Windows.Forms.ToolStripMenuItem();
toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
statusStrip_Footer = new System.Windows.Forms.StatusStrip();
toolStripStatusLabel_Status = new System.Windows.Forms.ToolStripStatusLabel();
toolStripStatusLabel_ServiceNotRunning = new System.Windows.Forms.ToolStripStatusLabel();
contextMenuStrip_RightClick.SuspendLayout();
statusStrip_Footer.SuspendLayout();
SuspendLayout();
//
// listViewProxies
@ -69,7 +73,6 @@
listViewProxies.ContextMenuStrip = contextMenuStrip_RightClick;
resources.ApplyResources(listViewProxies, "listViewProxies");
listViewProxies.FullRowSelect = true;
listViewProxies.HideSelection = false;
listViewProxies.Name = "listViewProxies";
listViewProxies.SmallImageList = imageListProxies;
listViewProxies.UseCompatibleStateImageBehavior = false;
@ -185,6 +188,17 @@
resources.ApplyResources(toolStripMenuItem_Export, "toolStripMenuItem_Export");
toolStripMenuItem_Export.Click += toolStripMenuItem_Export_Click;
//
// toolStripSeparator5
//
toolStripSeparator5.Name = "toolStripSeparator5";
resources.ApplyResources(toolStripSeparator5, "toolStripSeparator5");
//
// toolStripMenuItem_ResetWindowSize
//
toolStripMenuItem_ResetWindowSize.Name = "toolStripMenuItem_ResetWindowSize";
resources.ApplyResources(toolStripMenuItem_ResetWindowSize, "toolStripMenuItem_ResetWindowSize");
toolStripMenuItem_ResetWindowSize.Click += toolStripMenuItem_ResetWindowSize_Click;
//
// toolStripSeparator4
//
toolStripSeparator4.Name = "toolStripSeparator4";
@ -212,21 +226,30 @@
openFileDialog_Import.FileName = "openFileDialog1";
resources.ApplyResources(openFileDialog_Import, "openFileDialog_Import");
//
// toolStripMenuItem_ResetWindowSize
// statusStrip_Footer
//
toolStripMenuItem_ResetWindowSize.Name = "toolStripMenuItem_ResetWindowSize";
resources.ApplyResources(toolStripMenuItem_ResetWindowSize, "toolStripMenuItem_ResetWindowSize");
toolStripMenuItem_ResetWindowSize.Click += toolStripMenuItem_ResetWindowSize_Click;
statusStrip_Footer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripStatusLabel_Status, toolStripStatusLabel_ServiceNotRunning });
resources.ApplyResources(statusStrip_Footer, "statusStrip_Footer");
statusStrip_Footer.Name = "statusStrip_Footer";
//
// toolStripSeparator5
// toolStripStatusLabel_Status
//
toolStripSeparator5.Name = "toolStripSeparator5";
resources.ApplyResources(toolStripSeparator5, "toolStripSeparator5");
toolStripStatusLabel_Status.Name = "toolStripStatusLabel_Status";
resources.ApplyResources(toolStripStatusLabel_Status, "toolStripStatusLabel_Status");
//
// toolStripStatusLabel_ServiceNotRunning
//
toolStripStatusLabel_ServiceNotRunning.IsLink = true;
toolStripStatusLabel_ServiceNotRunning.LinkColor = System.Drawing.Color.Red;
toolStripStatusLabel_ServiceNotRunning.Name = "toolStripStatusLabel_ServiceNotRunning";
resources.ApplyResources(toolStripStatusLabel_ServiceNotRunning, "toolStripStatusLabel_ServiceNotRunning");
toolStripStatusLabel_ServiceNotRunning.Click += toolStripStatusLabel_ServiceNotRunning_Click;
//
// PortProxyGUI
//
resources.ApplyResources(this, "$this");
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
Controls.Add(statusStrip_Footer);
Controls.Add(listViewProxies);
Name = "PortProxyGUI";
FormClosing += PortProxyGUI_FormClosing;
@ -234,7 +257,10 @@
Shown += PortProxyGUI_Shown;
Resize += PortProxyGUI_Resize;
contextMenuStrip_RightClick.ResumeLayout(false);
statusStrip_Footer.ResumeLayout(false);
statusStrip_Footer.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
@ -267,6 +293,9 @@
private System.Windows.Forms.OpenFileDialog openFileDialog_Import;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_ResetWindowSize;
private System.Windows.Forms.StatusStrip statusStrip_Footer;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel_Status;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel_ServiceNotRunning;
}
}

View File

@ -4,7 +4,6 @@ using PortProxyGUI.UI;
using PortProxyGUI.Utils;
using System;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
@ -224,6 +223,9 @@ namespace PortProxyGUI
rules = Program.Database.Rules.ToArray();
InitProxyGroups(rules);
InitProxyItems(rules, proxies);
// CheckServiceStatus
toolStripStatusLabel_ServiceNotRunning.Visible = !PortPorxyUtil.IsServiceRunning();
}
private void contextMenuStrip_RightClick_MouseClick(object sender, MouseEventArgs e)
@ -239,25 +241,30 @@ namespace PortProxyGUI
case ToolStripMenuItem item when item == toolStripMenuItem_Disable: DisableSelectedProxies(); break;
case ToolStripMenuItem item when item == toolStripMenuItem_New:
if (SetProxyForm == null) SetProxyForm = new SetProxy(this);
SetProxyForm ??= new SetProxy(this);
SetProxyForm.UseNormalMode();
SetProxyForm.ShowDialog();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Modify:
if (SetProxyForm == null) SetProxyForm = new SetProxy(this);
SetProxyForm ??= new SetProxy(this);
SetProxyForUpdate(SetProxyForm);
SetProxyForm.ShowDialog();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Refresh:
RefreshProxyList();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_FlushDnsCache:
DnsUtil.FlushCache();
toolStripStatusLabel_Status.Text = $"{DateTime.Now} : Refreshed.";
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Delete: DeleteSelectedProxies(); break;
case ToolStripMenuItem item when item == toolStripMenuItem_FlushDnsCache:
DnsUtil.FlushCache();
toolStripStatusLabel_Status.Text = $"{DateTime.Now} : DNS cache cleared.";
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Delete:
DeleteSelectedProxies();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_About:
if (AboutForm == null)
@ -290,7 +297,7 @@ namespace PortProxyGUI
var selectAny = listView.SelectedItems.OfType<ListViewItem>().Any();
if (selectAny)
{
if (SetProxyForm == null) SetProxyForm = new SetProxy(this);
SetProxyForm ??= new SetProxy(this);
SetProxyForUpdate(SetProxyForm);
SetProxyForm.ShowDialog();
}
@ -394,5 +401,11 @@ namespace PortProxyGUI
AppConfig = new AppConfig();
ResetWindowSize();
}
private void toolStripStatusLabel_ServiceNotRunning_Click(object sender, EventArgs e)
{
PortPorxyUtil.StartService();
toolStripStatusLabel_ServiceNotRunning.Visible = false;
}
}
}

View File

@ -14,7 +14,7 @@
<PackageTags>portproxy TCP/IP redirector</PackageTags>
<PackageLicenseFile>LICENSE.md</PackageLicenseFile>
<Copyright>Copyright © nstandard.net 2020</Copyright>
<Version>1.4.0</Version>
<Version>1.4.1</Version>
<ApplicationIcon>icon.ico</ApplicationIcon>
<ApplicationDefaultFont>Microsoft Sans Serif, 8pt</ApplicationDefaultFont>
<AssemblyName>PPGUI</AssemblyName>

View File

@ -164,6 +164,94 @@
<data name="contextMenuStrip_RightClick.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>17, 17</value>
</data>
<data name="contextMenuStrip_RightClick.Size" type="System.Drawing.Size, System.Drawing">
<value>175, 226</value>
</data>
<data name="&gt;&gt;contextMenuStrip_RightClick.Name" xml:space="preserve">
<value>contextMenuStrip_RightClick</value>
</data>
<data name="&gt;&gt;contextMenuStrip_RightClick.Type" xml:space="preserve">
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="listViewProxies.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="listViewProxies.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="listViewProxies.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="listViewProxies.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="listViewProxies.Size" type="System.Drawing.Size, System.Drawing">
<value>704, 461</value>
</data>
<data name="imageListProxies.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>239, 17</value>
</data>
<data name="imageListProxies.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc
CAAAAk1TRnQBSQFMAgEBAgEAAdABAQHYAQEBEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wQACvQ0AAH/AZQKFwGU
Af8CAAH/AboKlQG6Af8iAAGUDBcBlAIAAboMlQG6IgAOFwIADpUiAAQXARYB9AL/AfQBFgQXAgAOlSIA
AxcBFgH/Ab0BFgGUAfQB/wEWAxcCAAWVArsHlSIAAxcB9AG9AhcBlAH/AvQDFwIABJUBugL/AcEGlSIA
AxcB/wEWARcBlAH/ApQB/wMXAgADlQG6Af8BwQG6Af8BwQWVIgADFwH/ApQB/wGUARcBFgH/AxcCAAOV
Af8BwQKVAboB/wHBBJUiAAMXAvQB/wGUAhcBvQH0AxcCAAiVAboB/wHBA5UiAAMXARYB/wH0AZQBFgG9
Af8BFgMXAgAJlQG6Af8DlSIABBcBFgH0Av8B9AEWBBcB/wEADpUB/yEADhcB/wEADpUB/yEAAZQMFwGU
AgABugyVAboiAAH/AZQKFwGUAf8CAAH/AboKlQG6Af80AAH/CPQkAAFCAU0BPgcAAT4DAAEoAwABQAMA
ARADAAEBAQABAQUAAYAXAAP/AQAB4AEHAv8EAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGA
AQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGA
AQEBgAEBBAABgAEAAYAFAAGAAQABgAUAAYABAQGAAQEEAAGAAQEBgAEBBAAC/wHgAQ8aAAs=
</value>
</data>
<data name="listViewProxies.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;listViewProxies.Name" xml:space="preserve">
<value>listViewProxies</value>
</data>
<data name="&gt;&gt;listViewProxies.Type" xml:space="preserve">
<value>System.Windows.Forms.ListView, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;listViewProxies.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;listViewProxies.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="toolStripMenuItem_Enable.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 22</value>
</data>
@ -218,33 +306,33 @@
<data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing">
<value>171, 6</value>
</data>
<data name="toolStripMenuItem_Import.Size" type="System.Drawing.Size, System.Drawing">
<value>186, 22</value>
</data>
<data name="toolStripMenuItem_Import.Text" xml:space="preserve">
<value>Import</value>
</data>
<data name="toolStripMenuItem_Export.Size" type="System.Drawing.Size, System.Drawing">
<value>186, 22</value>
</data>
<data name="toolStripMenuItem_Export.Text" xml:space="preserve">
<value>Export</value>
</data>
<data name="toolStripSeparator5.Size" type="System.Drawing.Size, System.Drawing">
<value>183, 6</value>
</data>
<data name="toolStripMenuItem_ResetWindowSize.Size" type="System.Drawing.Size, System.Drawing">
<value>186, 22</value>
</data>
<data name="toolStripMenuItem_ResetWindowSize.Text" xml:space="preserve">
<value>Reset Window</value>
</data>
<data name="toolStripMenuItem_More.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 22</value>
</data>
<data name="toolStripMenuItem_More.Text" xml:space="preserve">
<value>More</value>
</data>
<data name="toolStripMenuItem_Import.Size" type="System.Drawing.Size, System.Drawing">
<value>159, 22</value>
</data>
<data name="toolStripMenuItem_Import.Text" xml:space="preserve">
<value>Import</value>
</data>
<data name="toolStripMenuItem_Export.Size" type="System.Drawing.Size, System.Drawing">
<value>159, 22</value>
</data>
<data name="toolStripMenuItem_Export.Text" xml:space="preserve">
<value>Export</value>
</data>
<data name="toolStripSeparator5.Size" type="System.Drawing.Size, System.Drawing">
<value>156, 6</value>
</data>
<data name="toolStripMenuItem_ResetWindowSize.Size" type="System.Drawing.Size, System.Drawing">
<value>159, 22</value>
</data>
<data name="toolStripMenuItem_ResetWindowSize.Text" xml:space="preserve">
<value>Reset Window</value>
</data>
<data name="toolStripSeparator4.Size" type="System.Drawing.Size, System.Drawing">
<value>171, 6</value>
</data>
@ -254,94 +342,6 @@
<data name="toolStripMenuItem_About.Text" xml:space="preserve">
<value>About</value>
</data>
<data name="contextMenuStrip_RightClick.Size" type="System.Drawing.Size, System.Drawing">
<value>175, 226</value>
</data>
<data name="&gt;&gt;contextMenuStrip_RightClick.Name" xml:space="preserve">
<value>contextMenuStrip_RightClick</value>
</data>
<data name="&gt;&gt;contextMenuStrip_RightClick.Type" xml:space="preserve">
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="listViewProxies.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="listViewProxies.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="listViewProxies.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="listViewProxies.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="listViewProxies.Size" type="System.Drawing.Size, System.Drawing">
<value>704, 461</value>
</data>
<data name="imageListProxies.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>239, 17</value>
</data>
<data name="imageListProxies.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc
CAAAAk1TRnQBSQFMAgEBAgEAAYwBAQGQAQEBEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wQACvQ0AAH/AZQKFwGU
Af8CAAH/AboKlQG6Af8iAAGUDBcBlAIAAboMlQG6IgAOFwIADpUiAAQXARYB9AL/AfQBFgQXAgAOlSIA
AxcBFgH/Ab0BFgGUAfQB/wEWAxcCAAWVArsHlSIAAxcB9AG9AhcBlAH/AvQDFwIABJUBugL/AcEGlSIA
AxcB/wEWARcBlAH/ApQB/wMXAgADlQG6Af8BwQG6Af8BwQWVIgADFwH/ApQB/wGUARcBFgH/AxcCAAOV
Af8BwQKVAboB/wHBBJUiAAMXAvQB/wGUAhcBvQH0AxcCAAiVAboB/wHBA5UiAAMXARYB/wH0AZQBFgG9
Af8BFgMXAgAJlQG6Af8DlSIABBcBFgH0Av8B9AEWBBcB/wEADpUB/yEADhcB/wEADpUB/yEAAZQMFwGU
AgABugyVAboiAAH/AZQKFwGUAf8CAAH/AboKlQG6Af80AAH/CPQkAAFCAU0BPgcAAT4DAAEoAwABQAMA
ARADAAEBAQABAQUAAYAXAAP/AQAB4AEHAv8EAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGA
AQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGA
AQEBgAEBBAABgAEAAYAFAAGAAQABgAUAAYABAQGAAQEEAAGAAQEBgAEBBAAC/wHgAQ8aAAs=
</value>
</data>
<data name="listViewProxies.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;listViewProxies.Name" xml:space="preserve">
<value>listViewProxies</value>
</data>
<data name="&gt;&gt;listViewProxies.Type" xml:space="preserve">
<value>System.Windows.Forms.ListView, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;listViewProxies.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;listViewProxies.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="saveFileDialog_Export.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>389, 17</value>
</data>
@ -354,6 +354,48 @@
<data name="openFileDialog_Import.Filter" xml:space="preserve">
<value>Database File|*.db</value>
</data>
<data name="statusStrip_Footer.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>755, 17</value>
</data>
<data name="statusStrip_Footer.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 439</value>
</data>
<data name="statusStrip_Footer.Size" type="System.Drawing.Size, System.Drawing">
<value>704, 22</value>
</data>
<data name="statusStrip_Footer.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="statusStrip_Footer.Text" xml:space="preserve">
<value>FooterStrip</value>
</data>
<data name="&gt;&gt;statusStrip_Footer.Name" xml:space="preserve">
<value>statusStrip_Footer</value>
</data>
<data name="&gt;&gt;statusStrip_Footer.Type" xml:space="preserve">
<value>System.Windows.Forms.StatusStrip, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;statusStrip_Footer.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;statusStrip_Footer.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="toolStripStatusLabel_Status.Size" type="System.Drawing.Size, System.Drawing">
<value>171, 17</value>
</data>
<data name="toolStripStatusLabel_Status.Text" xml:space="preserve">
<value>Welcome to Port Proxy GUI !</value>
</data>
<data name="toolStripStatusLabel_ServiceNotRunning.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 17</value>
</data>
<data name="toolStripStatusLabel_ServiceNotRunning.Text" xml:space="preserve">
<value>IP Helper service is not running (Click to start)</value>
</data>
<data name="toolStripStatusLabel_ServiceNotRunning.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="$this.Localizable" type="System.Boolean, mscorlib">
<value>True</value>
</data>
@ -2650,6 +2692,18 @@
<data name="&gt;&gt;toolStripMenuItem_Export.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator5.Name" xml:space="preserve">
<value>toolStripSeparator5</value>
</data>
<data name="&gt;&gt;toolStripSeparator5.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_ResetWindowSize.Name" xml:space="preserve">
<value>toolStripMenuItem_ResetWindowSize</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_ResetWindowSize.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator4.Name" xml:space="preserve">
<value>toolStripSeparator4</value>
</data>
@ -2680,17 +2734,17 @@
<data name="&gt;&gt;openFileDialog_Import.Type" xml:space="preserve">
<value>System.Windows.Forms.OpenFileDialog, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_ResetWindowSize.Name" xml:space="preserve">
<value>toolStripMenuItem_ResetWindowSize</value>
<data name="&gt;&gt;toolStripStatusLabel_Status.Name" xml:space="preserve">
<value>toolStripStatusLabel_Status</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_ResetWindowSize.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;toolStripStatusLabel_Status.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator5.Name" xml:space="preserve">
<value>toolStripSeparator5</value>
<data name="&gt;&gt;toolStripStatusLabel_ServiceNotRunning.Name" xml:space="preserve">
<value>toolStripStatusLabel_ServiceNotRunning</value>
</data>
<data name="&gt;&gt;toolStripSeparator5.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;toolStripStatusLabel_ServiceNotRunning.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PortProxyGUI</value>

View File

@ -197,7 +197,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc
CAAAAk1TRnQBSQFMAgEBAgEAASABAQEwAQEBEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo
CAAAAk1TRnQBSQFMAgEBAgEAASABAQE4AQEBEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@ -2611,4 +2611,13 @@
<data name="toolStripMenuItem_ResetWindowSize.Text" xml:space="preserve">
<value>重置窗口</value>
</data>
<data name="statusStrip_Footer.Text" xml:space="preserve">
<value>FooterStrip</value>
</data>
<data name="toolStripStatusLabel_ServiceNotRunning.Text" xml:space="preserve">
<value>IP Helper 服务未启动(点击启动)</value>
</data>
<data name="toolStripStatusLabel_Status.Text" xml:space="preserve">
<value>欢迎使用 Port Proxy GUI </value>
</data>
</root>

View File

@ -1,8 +1,6 @@
using PortProxyGUI.Data;
using System;
using System.Globalization;
using System.IO;
using System.Threading;
using System.Windows.Forms;
namespace PortProxyGUI

View File

@ -2,7 +2,6 @@
using PortProxyGUI.Data;
using PortProxyGUI.Utils;
using System;
using System.Drawing;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;

View File

@ -1,16 +1,13 @@
using System;
using System.Runtime.InteropServices;
using PortProxyGUI.Native;
using System;
namespace PortProxyGUI.Utils
{
internal class DnsUtil
{
[DllImport("dnsapi.dll", EntryPoint = "DnsFlushResolverCache")]
static extern uint DnsFlushResolverCache();
public static void FlushCache()
{
var status = DnsFlushResolverCache();
var status = NativeMethods.DnsFlushResolverCache();
if (status == 0) throw new InvalidOperationException("Flush DNS Cache failed.");
}

View File

@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Drawing;
namespace PortProxyGUI.Utils
{

View File

@ -4,12 +4,14 @@ using PortProxyGUI.Native;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
namespace PortProxyGUI.Utils
{
public static class PortPorxyUtil
{
internal static readonly string ServiceName = "iphlpsvc";
internal static readonly string ServiceFriendlyName = "IP Helper";
private static InvalidOperationException InvalidPortProxyType(string type) => new($"Invalid port proxy type ({type}).");
private static readonly string[] ProxyTypes = new[] { "v4tov4", "v4tov6", "v6tov4", "v6tov6" };
@ -85,29 +87,62 @@ namespace PortProxyGUI.Utils
catch { }
}
public static void ParamChange()
public static bool IsServiceRunning()
{
var hManager = NativeMethods.OpenSCManager(null, null, (uint)GenericRights.GENERIC_READ);
if (hManager == IntPtr.Zero) throw new InvalidOperationException("Open SC Manager failed.");
var serviceName = "iphlpsvc";
var hService = NativeMethods.OpenService(hManager, serviceName, ServiceRights.SERVICE_PAUSE_CONTINUE);
var hService = NativeMethods.OpenService(hManager, ServiceName, ServiceRights.SERVICE_QUERY_STATUS);
if (hService == IntPtr.Zero)
{
NativeMethods.CloseServiceHandle(hManager);
throw new InvalidOperationException($"Open Service ({serviceName}) failed.");
throw new InvalidOperationException($"Open Service ({ServiceName}) failed.");
}
var serviceStatus = new ServiceStatus();
var success = NativeMethods.ControlService(hService, ServiceControls.SERVICE_CONTROL_PARAMCHANGE, ref serviceStatus);
var status = new ServiceStatus();
NativeMethods.QueryServiceStatus(hService, ref status);
NativeMethods.CloseServiceHandle(hService);
NativeMethods.CloseServiceHandle(hManager);
if (!success)
return status.dwCurrentState == ServiceState.SERVICE_RUNNING;
}
public static void StartService()
{
var hManager = NativeMethods.OpenSCManager(null, null, (uint)GenericRights.GENERIC_READ | (uint)ScmRights.SC_MANAGER_CONNECT);
if (hManager == IntPtr.Zero) throw new InvalidOperationException("Open SC Manager failed.");
var hService = NativeMethods.OpenService(hManager, ServiceName, ServiceRights.SERVICE_PAUSE_CONTINUE | ServiceRights.SERVICE_START);
if (hService == IntPtr.Zero)
{
throw new InvalidOperationException($"Control Service ({serviceName}) ParamChange failed.");
NativeMethods.CloseServiceHandle(hManager);
throw new InvalidOperationException($"Open Service ({ServiceName}) failed.");
}
NativeMethods.StartService(hService, 0, null);
NativeMethods.CloseServiceHandle(hService);
NativeMethods.CloseServiceHandle(hManager);
}
public static void ParamChange()
{
var hManager = NativeMethods.OpenSCManager(null, null, (uint)GenericRights.GENERIC_READ | (uint)ScmRights.SC_MANAGER_CONNECT);
if (hManager == IntPtr.Zero) throw new InvalidOperationException("Open SC Manager failed.");
var hService = NativeMethods.OpenService(hManager, ServiceName, ServiceRights.SERVICE_PAUSE_CONTINUE);
if (hService == IntPtr.Zero)
{
NativeMethods.CloseServiceHandle(hManager);
throw new InvalidOperationException($"Open Service ({ServiceName}) failed.");
}
var status = new ServiceStatus();
NativeMethods.ControlService(hService, ServiceControls.SERVICE_CONTROL_PARAMCHANGE, ref status);
NativeMethods.CloseServiceHandle(hService);
NativeMethods.CloseServiceHandle(hManager);
}
}