internal static extern bool EnumDependentServices( IntPtr serviceHandle, SERVICE_STATE_FLAGS serviceState, IntPtr bufferPtr, Int32 bufferSize, ref Int32 bufferNeeded, ref Int32 servicesReturned );
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);
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 );
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); } }
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); } }