From d865678b8057332c6df13d895214dffbf83e499c Mon Sep 17 00:00:00 2001 From: NextTurn <45985406+nxtn@users.noreply.github.com> Date: Sun, 12 Jul 2020 00:00:00 +0800 Subject: [PATCH] Internal updates --- src/WinSW.Core/Native/Service.cs | 29 +++++++++++++++-- src/WinSW/Program.cs | 55 +++++++++++--------------------- 2 files changed, 45 insertions(+), 39 deletions(-) diff --git a/src/WinSW.Core/Native/Service.cs b/src/WinSW.Core/Native/Service.cs index 66e5467..944f083 100644 --- a/src/WinSW.Core/Native/Service.cs +++ b/src/WinSW.Core/Native/Service.cs @@ -100,7 +100,7 @@ namespace WinSW.Native } /// - internal unsafe (IntPtr Services, int Count) EnumerateServices() + internal ServiceEnumerator EnumerateServices() { int resume = 0; _ = EnumServicesStatus( @@ -129,7 +129,7 @@ namespace WinSW.Native Throw.Command.Win32Exception("Failed to enumerate services."); } - return (services, count); + return new(services, count); } catch { @@ -183,6 +183,31 @@ namespace WinSW.Native this.handle = IntPtr.Zero; } + + internal ref struct ServiceEnumerator + { + private readonly IntPtr services; + private readonly int count; + + private int index; + + internal ServiceEnumerator(IntPtr services, int count) + { + this.services = services; + this.count = count; + this.index = -1; + } + + public unsafe ENUM_SERVICE_STATUS* Current => (ENUM_SERVICE_STATUS*)this.services + this.index; + + public void Dispose() => Marshal.FreeHGlobal(this.services); + + public ServiceEnumerator GetEnumerator() => this; + + public bool MoveNext() => ++this.index < this.count; + + public void Reset() => throw new NotImplementedException(); + } } internal ref struct Service diff --git a/src/WinSW/Program.cs b/src/WinSW/Program.cs index d2eb6c9..5cc7b06 100644 --- a/src/WinSW/Program.cs +++ b/src/WinSW/Program.cs @@ -10,7 +10,6 @@ using System.IO; using System.IO.Pipes; using System.Linq; using System.Reflection; -using System.Runtime.InteropServices; using System.Security.AccessControl; using System.Security.Principal; using System.ServiceProcess; @@ -889,39 +888,30 @@ namespace WinSW if (all) { using var scm = ServiceManager.Open(ServiceManagerAccess.EnumerateService); - (var services, int count) = scm.EnumerateServices(); - try + int prevProcessId = -1; + foreach (var status in scm.EnumerateServices()) { - int prevProcessId = -1; - for (int i = 0; i < count; i++) + using var sc = scm.OpenService(status->ServiceName, ServiceAccess.QueryConfig | ServiceAccess.QueryStatus); + if (sc.ExecutablePath.StartsWith($"\"{ExecutablePath}\"")) { - var status = (ENUM_SERVICE_STATUS*)services + i; - using var sc = scm.OpenService(status->ServiceName, ServiceAccess.QueryConfig | ServiceAccess.QueryStatus); - if (sc.ExecutablePath.StartsWith($"\"{ExecutablePath}\"")) + int processId = sc.ProcessId; + if (processId >= 0) { - int processId = sc.ProcessId; - if (processId >= 0) + if (prevProcessId >= 0) { - if (prevProcessId >= 0) - { - using var process = Process.GetProcessById(prevProcessId); - Draw(process, string.Empty, false); - } + using var process = Process.GetProcessById(prevProcessId); + Draw(process, string.Empty, false); } - - prevProcessId = processId; } - } - if (prevProcessId >= 0) - { - using var process = Process.GetProcessById(prevProcessId); - Draw(process, string.Empty, true); + prevProcessId = processId; } } - finally + + if (prevProcessId >= 0) { - Marshal.FreeHGlobal(services); + using var process = Process.GetProcessById(prevProcessId); + Draw(process, string.Empty, true); } } else @@ -996,23 +986,14 @@ namespace WinSW static unsafe void DevList() { using var scm = ServiceManager.Open(ServiceManagerAccess.EnumerateService); - (var services, int count) = scm.EnumerateServices(); - try + foreach (var status in scm.EnumerateServices()) { - for (int i = 0; i < count; i++) + using var sc = scm.OpenService(status->ServiceName, ServiceAccess.QueryConfig); + if (sc.ExecutablePath.StartsWith($"\"{ExecutablePath}\"")) { - var status = (ENUM_SERVICE_STATUS*)services + i; - using var sc = scm.OpenService(status->ServiceName, ServiceAccess.QueryConfig); - if (sc.ExecutablePath.StartsWith($"\"{ExecutablePath}\"")) - { - Console.WriteLine(status->ToString()); - } + Console.WriteLine(status->ToString()); } } - finally - { - Marshal.FreeHGlobal(services); - } } static void Customize(string output, string manufacturer)