private static unsafe ListenerUnsafeNativeMethods.SERVICE_STATUS_PROCESS GetStatusForService(string serviceName) { ListenerUnsafeNativeMethods.SERVICE_STATUS_PROCESS service_status_process; SafeServiceHandle scManager = OpenSCManager(); try { SafeServiceHandle hService = OpenService(scManager, serviceName, 4); try { int num; if (!ListenerUnsafeNativeMethods.QueryServiceStatusEx(hService, 0, null, 0, out num)) { int error = Marshal.GetLastWin32Error(); if (error != 0x7a) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new Win32Exception(error)); } } byte[] pBuffer = new byte[num]; if (!ListenerUnsafeNativeMethods.QueryServiceStatusEx(hService, 0, pBuffer, pBuffer.Length, out num)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new Win32Exception()); } try { fixed(byte *numRef = pBuffer) { service_status_process = (ListenerUnsafeNativeMethods.SERVICE_STATUS_PROCESS)Marshal.PtrToStructure((IntPtr)numRef, typeof(ListenerUnsafeNativeMethods.SERVICE_STATUS_PROCESS)); } } finally { numRef = null; } } finally { hService.Close(); } } finally { scManager.Close(); } return(service_status_process); }
static ListenerUnsafeNativeMethods.SERVICE_STATUS_PROCESS GetStatusForService(string serviceName) { SafeServiceHandle scManager = OpenSCManager(); try { SafeServiceHandle service = OpenService(scManager, serviceName, ListenerUnsafeNativeMethods.SERVICE_QUERY_STATUS); try { int lpnLengthNeeded; bool success = ListenerUnsafeNativeMethods.QueryServiceStatusEx(service, ListenerUnsafeNativeMethods.SC_STATUS_PROCESS_INFO, null, 0, out lpnLengthNeeded); if (!success) { int errorCode = Marshal.GetLastWin32Error(); if (errorCode != ListenerUnsafeNativeMethods.ERROR_INSUFFICIENT_BUFFER) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new Win32Exception(errorCode)); } } byte[] serviceStatusProcess = new byte[lpnLengthNeeded]; #pragma warning suppress 56523 // Microsoft, Win32Exception ctor calls Marshal.GetLastWin32Error() success = ListenerUnsafeNativeMethods.QueryServiceStatusEx(service, ListenerUnsafeNativeMethods.SC_STATUS_PROCESS_INFO, serviceStatusProcess, serviceStatusProcess.Length, out lpnLengthNeeded); if (!success) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new Win32Exception()); } fixed(byte *pServiceStatusProcess = serviceStatusProcess) { return((ListenerUnsafeNativeMethods.SERVICE_STATUS_PROCESS)Marshal.PtrToStructure((IntPtr)pServiceStatusProcess, typeof(ListenerUnsafeNativeMethods.SERVICE_STATUS_PROCESS))); } } finally { service.Close(); } } finally { scManager.Close(); } }