private static IEnumerable <ServiceTriggerInformation> GetTriggersForService(SafeServiceHandle service) { List <ServiceTriggerInformation> triggers = new List <ServiceTriggerInformation>(); using (var buf = new SafeStructureInOutBuffer <SERVICE_TRIGGER_INFO>(8192, false)) { if (!Win32NativeMethods.QueryServiceConfig2(service, SERVICE_CONFIG_TRIGGER_INFO, buf, buf.Length, out int required)) { return(triggers.AsReadOnly()); } SERVICE_TRIGGER_INFO trigger_info = buf.Result; if (trigger_info.cTriggers == 0) { return(triggers.AsReadOnly()); } SERVICE_TRIGGER[] trigger_arr; using (SafeHGlobalBuffer trigger_buffer = new SafeHGlobalBuffer(trigger_info.pTriggers, trigger_info.cTriggers * Marshal.SizeOf(typeof(SERVICE_TRIGGER)), false)) { trigger_arr = new SERVICE_TRIGGER[trigger_info.cTriggers]; trigger_buffer.ReadArray(0, trigger_arr, 0, trigger_arr.Length); } for (int i = 0; i < trigger_arr.Length; ++i) { triggers.Add(ServiceTriggerInformation.GetTriggerInformation(trigger_arr[i])); } return(triggers.AsReadOnly()); } }
private static IEnumerable <string> GetServiceRequiredPrivileges(SafeServiceHandle service) { using (var buf = new SafeHGlobalBuffer(8192)) { if (!Win32NativeMethods.QueryServiceConfig2(service, SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO, buf, buf.Length, out int needed)) { return(new string[0]); } IntPtr str_pointer = buf.Read <IntPtr>(0); if (str_pointer == IntPtr.Zero) { return(new string[0]); } SafeHGlobalBuffer str_buffer = new SafeHGlobalBuffer(str_pointer, 8192 - 8, false); ulong offset = 0; List <string> privs = new List <string>(); while (offset < str_buffer.ByteLength) { string s = str_buffer.ReadNulTerminatedUnicodeString(offset); if (s.Length == 0) { break; } privs.Add(s); offset += (ulong)(s.Length + 1) * 2; } return(privs.AsReadOnly()); } }
private static ServiceSidType GetServiceSidType(SafeServiceHandle service) { using (var buf = new SafeStructureInOutBuffer <SERVICE_SID_INFO>()) { if (!Win32NativeMethods.QueryServiceConfig2(service, SERVICE_CONFIG_SERVICE_SID_INFO, buf, buf.Length, out int needed)) { return(ServiceSidType.None); } return(buf.Result.dwServiceSidType); } }
private static ServiceLaunchProtectedType GetServiceLaunchProtectedType(SafeServiceHandle service) { using (var buf = new SafeStructureInOutBuffer <SERVICE_LAUNCH_PROTECTED_INFO>()) { if (!Win32NativeMethods.QueryServiceConfig2(service, SERVICE_CONFIG_LAUNCH_PROTECTED, buf, buf.Length, out int needed)) { return(ServiceLaunchProtectedType.None); } return(buf.Result.dwLaunchProtected); } }
private static IEnumerable <string> GetServiceRequiredPrivileges(SafeServiceHandle service) { using (var buf = new SafeHGlobalBuffer(8192)) { if (!Win32NativeMethods.QueryServiceConfig2(service, SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO, buf, buf.Length, out int needed)) { return(new string[0]); } return(buf.Read <IntPtr>(0).GetMultiString()); } }