[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern bool QueryServiceStatusEx(IntPtr serviceHandle, int infoLevel, IntPtr buffer, int bufferSize, out int bytesNeeded);
<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
[Flags]
enum ServiceState : int
{
SERVICE_CONTINUE_PENDING= 0x00000005,
SERVICE_PAUSE_PENDING = 0x00000006,
SERVICE_PAUSED = 0x00000007,
SERVICE_RUNNING = 0x00000004,
SERVICE_START_PENDING = 0x00000002,
SERVICE_STOP_PENDING = 0x00000003,
SERVICE_STOPPED = 0x00000001
}
Do you know one? Please contribute it!
For infoLevel only SC_STATUS_PROCESS_INFO (0x0) is allowed .
See SERVICE_STATUS_PROCESS definition.
See OpenService to get the hService.
None.
Please add some!
public static SERVICE_STATUS_PROCESS QueryServiceStatusEx(IntPtr serviceHandle)
{
IntPtr buf = IntPtr.Zero;
try
{
int size = 0;
QueryServiceStatusEx(serviceHandle, 0, buf, size, out size);
buf = Marshal.AllocHGlobal(size);
if (!QueryServiceStatusEx(serviceHandle, 0, buf, size, out size))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
return (SERVICE_STATUS_PROCESS)Marshal.PtrToStructure(buf, typeof(SERVICE_STATUS_PROCESS));
}
finally
{
if (!buf.Equals(IntPtr.Zero))
Marshal.FreeHGlobal(buf);
}
}