LenovoLegionToolkit
50 строк · 1.7 Кб
1using System;
2using System.Runtime.InteropServices;
3using System.ServiceProcess;
4using Windows.Win32;
5using Windows.Win32.Security;
6using Windows.Win32.System.Services;
7
8namespace LenovoLegionToolkit.Lib.Extensions;
9
10internal static class ServiceControllerExtension
11{
12public static unsafe void ChangeStartMode(this ServiceController svc, bool enabled)
13{
14var scManagerHandle = new SC_HANDLE();
15var serviceHandle = new SC_HANDLE();
16
17try
18{
19scManagerHandle = PInvoke.OpenSCManager(null as string, null, PInvoke.SC_MANAGER_ALL_ACCESS);
20if (scManagerHandle == IntPtr.Zero)
21throw new ExternalException("Open Service Manager Error");
22
23serviceHandle = PInvoke.OpenService(scManagerHandle, svc.ServiceName, PInvoke.SERVICE_CHANGE_CONFIG);
24if (serviceHandle == IntPtr.Zero)
25throw new ExternalException("Open Service Error");
26
27var result = PInvoke.ChangeServiceConfig(serviceHandle,
28(ENUM_SERVICE_TYPE)PInvoke.SERVICE_NO_CHANGE,
29enabled ? SERVICE_START_TYPE.SERVICE_AUTO_START : SERVICE_START_TYPE.SERVICE_DISABLED,
30SERVICE_ERROR.SERVICE_ERROR_NORMAL,
31null as string,
32null,
33null,
34null,
35null,
36null,
37null);
38
39if (result)
40return;
41
42PInvokeExtensions.ThrowIfWin32Error($"Could not change service: {svc.ServiceName}");
43}
44finally
45{
46PInvoke.CloseServiceHandle(serviceHandle);
47PInvoke.CloseServiceHandle(scManagerHandle);
48}
49}
50}
51