Example #1
0
        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);
            }
        }