コード例 #1
0
 internal static extern bool EnumDependentServices(
     IntPtr serviceHandle,
     SERVICE_STATE_FLAGS serviceState,
     IntPtr bufferPtr,
     Int32 bufferSize,
     ref Int32 bufferNeeded,
     ref Int32 servicesReturned
     );
コード例 #2
0
 internal static extern bool EnumServicesStatus(
     IntPtr serviceControlObject,
     SERVICE_TYPE serviceType,
     SERVICE_STATE_FLAGS serviceState,
     IntPtr bufferPtr,
     Int32 bufferSize,
     ref Int32 bufferNeeded,
     ref Int32 servicesReturned,
     ref UInt32 resumeHandle);
コード例 #3
0
 internal static extern bool EnumServicesStatusEx(IntPtr hSCManager,
                                                  int infoLevel,
                                                  SERVICE_TYPE serviceType,
                                                  SERVICE_STATE_FLAGS serviceState,
                                                  IntPtr services,
                                                  Int32 bufSize,
                                                  ref Int32 bytesNeeded,
                                                  ref Int32 servicesReturned,
                                                  ref UInt32 resumeHandle,
                                                  string groupName
                                                  );
コード例 #4
0
        public IEnumerable <ENUM_SERVICE_STATUS> EnumDependentServices(SERVICE_STATE_FLAGS states)
        {
            // ReSharper disable once InconsistentNaming
            const int ERROR_MORE_DATA = 234;

            int needed           = 0;
            int servicesReturned = 0;

            if (NativeMethods.EnumDependentServices(handle, states, IntPtr.Zero, 0, ref needed, ref servicesReturned))
            {
                yield break; // No dependent services
            }

            // We expect an ERROR_MORE_DATA error as the buffer size passed in was zero, otherwise something strage is going on
            if (Marshal.GetLastWin32Error() != ERROR_MORE_DATA)
            {
                throw new Win32Exception();
            }

            IntPtr bufferPtr = Marshal.AllocHGlobal(needed);
            var    ptr       = bufferPtr;

            try
            {
                if (!NativeMethods.EnumDependentServices(handle, states, bufferPtr, needed, ref needed, ref servicesReturned))
                {
                    throw new Win32Exception();
                }

                for (int i = 0; i < servicesReturned; i++)
                {
                    yield return((ENUM_SERVICE_STATUS)Marshal.PtrToStructure(ptr, typeof(ENUM_SERVICE_STATUS)));

                    ptr += Marshal.SizeOf(typeof(ENUM_SERVICE_STATUS));
                }
            }
            finally
            {
                Marshal.FreeHGlobal(bufferPtr);
            }
        }
コード例 #5
0
        public IEnumerable <ENUM_SERVICE_STATUS> EnumServicesStatus(SERVICE_TYPE serviceType, SERVICE_STATE_FLAGS serviceState)
        {
            int  needed           = 0;
            int  servicesReturned = 0;
            uint resumeHandle     = 0;

            if (NativeMethods.EnumServicesStatus(handle, serviceType, serviceState, IntPtr.Zero, 0, ref needed, ref servicesReturned, ref resumeHandle))
            {
                throw new Win32Exception(0, $"Unexpected success in {nameof(ServiceControlManager)}.{nameof(EnumServicesStatus)}");
            }

            // We expect an ERROR_MORE_DATA error as the buffer size passed in was zero, otherwise something strage is going on
            if (Marshal.GetLastWin32Error() != ERROR_MORE_DATA)
            {
                throw new Win32Exception();
            }

            IntPtr bufferPtr = Marshal.AllocHGlobal(needed);
            var    ptr       = bufferPtr;

            try
            {
                if (!NativeMethods.EnumServicesStatus(handle, serviceType, serviceState, bufferPtr, needed, ref needed, ref servicesReturned, ref resumeHandle))
                {
                    throw new Win32Exception();
                }

                for (int i = 0; i < servicesReturned; i++)
                {
                    yield return((ENUM_SERVICE_STATUS)Marshal.PtrToStructure(ptr, typeof(ENUM_SERVICE_STATUS)));

                    ptr += Marshal.SizeOf(typeof(ENUM_SERVICE_STATUS));
                }
            }
            finally
            {
                Marshal.FreeHGlobal(bufferPtr);
            }
        }