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());
            }
        }
Beispiel #3
0
 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);
     }
 }
Beispiel #4
0
 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);
     }
 }
Beispiel #5
0
        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());
            }
        }