QueryServiceStatusEx (advapi32)
Last changed: -193.128.29.5

.
Summary
The QueryServiceStatusEx function retrieves the current status of the specified service based on the specified information level.

C# Signature:

[DllImport("advapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern unsafe bool QueryServiceStatusEx(IntPtr serviceHandle, int infoLevel, IntPtr buffer, int bufferSize, out int bytesNeeded);

VB.net Signature:

<DllImport("advapi32.dll", CharSet := CharSet.Unicode, SetLastError := True)> _
Public Shared Function QueryServiceStatusEx(serviceHandle As IntPtr, infoLevel As Integer, buffer As IntPtr, bufferSize As Integer, ByRef bytesNeeded As Integer) As Boolean
End Function

User-Defined Types:

None.

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

For infoLevel only SC_STATUS_PROCESS_INFO (0x0) is allowed .

See SERVICE_STATUS_PROCESS definition.

See OpenService to get the hService.

None.

Tips & Tricks:

Please add some!

Sample Code:

//This code is my first attempt at API calls, it works but has very little error handling so should only be used as a base not as final code.

//NB for this code to work you will need to change the SERVICE_STATUS_PROCESS class to a struct

//NB for this to work you will need to mark the assembly as Unsafe.

    public static SERVICE_STATUS_PROCESS QueryServiceStatusEx(SafeHandle serviceHandle)
    {
        unsafe
        {
        IntPtr pData=IntPtr.Zero;
        try
        {

            int iReqSize = 0;

             pData = Marshal.AllocHGlobal(sizeof(SERVICE_STATUS_PROCESS));
            bool bOk = QueryServiceStatusEx(serviceHandle.DangerousGetHandle(), 0, pData, sizeof(SERVICE_STATUS_PROCESS), out
                     iReqSize);
            if (!bOk)
            {
            throw new Win32Exception();
            }
            SERVICE_STATUS_PROCESS pStatus = (SERVICE_STATUS_PROCESS)Marshal.PtrToStructure(pData, typeof(SERVICE_STATUS_PROCESS));
            return pStatus;
        }
        finally
        {
            if (!pData.Equals(IntPtr.Zero))
            Marshal.FreeHGlobal(pData);
        }
        }

Documentation