public Service[] GetServices() { var serviceType = SERVICE_TYPE.SERVICE_WIN32_OWN_PROCESS | SERVICE_TYPE.SERVICE_WIN32_SHARE_PROCESS; var resumeHandle = 0; var enumerated = ADVANCED_API.EnumServicesStatusEx( _managerPtr, INFO_LEVEL.PROCESS_INFO, serviceType, SERVICE_ACTIVE_STATE.SERVICE_STATE_ALL, IntPtr.Zero, 0, out var bytesNeeded, out _, ref resumeHandle, null); if (enumerated) { return(Array.Empty <Service>()); } else { var error = Marshal.GetLastWin32Error(); if (error != ERROR.ERROR_MORE_DATA) { throw new Win32Exception(error); } } var memoryPtr = Marshal.AllocHGlobal(bytesNeeded); try { enumerated = ADVANCED_API.EnumServicesStatusEx( _managerPtr, INFO_LEVEL.PROCESS_INFO, serviceType, SERVICE_ACTIVE_STATE.SERVICE_STATE_ALL, memoryPtr, bytesNeeded, out bytesNeeded, out var servicesReturned, ref resumeHandle, null); if (!enumerated) { var error = Marshal.GetLastWin32Error(); throw new Win32Exception(error); } var services = new Service[servicesReturned]; var statusSize = Marshal.SizeOf <ENUM_SERVICE_STATUS_PROCESS>(); for (int i = 0; i < servicesReturned; i++) { var statusPtr = memoryPtr + i * statusSize; var status = Marshal.PtrToStructure <ENUM_SERVICE_STATUS_PROCESS>(statusPtr); services[i] = new Service(status); } return(services); } finally { Marshal.FreeHGlobal(memoryPtr); } }