internal static Process GetServiceProcess(string serviceName, out Exception exception) { exception = null; Process result = null; try { NativeMethods.SERVICE_STATUS_PROCESS serviceStatusInfo = ServiceOperations.GetServiceStatusInfo(serviceName); if (serviceStatusInfo != null) { if (serviceStatusInfo.currentState != 1 && serviceStatusInfo.processID != 0) { result = ServiceOperations.GetProcessByIdBestEffort(serviceStatusInfo.processID, out exception); } else { exception = new AmGetServiceProcessException(serviceName, serviceStatusInfo.currentState, serviceStatusInfo.processID); } } } catch (Win32Exception ex) { exception = ex; } if (exception != null) { ServiceOperations.Tracer.TraceError <string, Exception>(0L, "GetServiceProcess({0}) failed: {1}", serviceName, exception); } return(result); }
internal static NativeMethods.SERVICE_STATUS_PROCESS GetServiceStatusInfo(string serviceName) { NativeMethods.SERVICE_STATUS_PROCESS result; using (ServiceController serviceController = new ServiceController(serviceName)) { using (SafeHandle serviceHandle = serviceController.ServiceHandle) { NativeMethods.SERVICE_STATUS_PROCESS service_STATUS_PROCESS = null; int num = Marshal.SizeOf(typeof(NativeMethods.SERVICE_STATUS_PROCESS)); IntPtr intPtr = Marshal.AllocHGlobal(num); try { if (!NativeMethods.QueryServiceStatusEx(serviceHandle, 0, intPtr, num, out num)) { int lastWin32Error = Marshal.GetLastWin32Error(); ServiceOperations.Tracer.TraceError <int>(0L, "QueryServiceStatusEx() failed with error: {0}", lastWin32Error); throw new Win32Exception(); } NativeMethods.SERVICE_STATUS_PROCESS service_STATUS_PROCESS2 = (NativeMethods.SERVICE_STATUS_PROCESS)Marshal.PtrToStructure(intPtr, typeof(NativeMethods.SERVICE_STATUS_PROCESS)); service_STATUS_PROCESS = new NativeMethods.SERVICE_STATUS_PROCESS(); service_STATUS_PROCESS.serviceType = service_STATUS_PROCESS2.serviceType; service_STATUS_PROCESS.currentState = service_STATUS_PROCESS2.currentState; service_STATUS_PROCESS.controlsAccepted = service_STATUS_PROCESS2.controlsAccepted; service_STATUS_PROCESS.win32ExitCode = service_STATUS_PROCESS2.win32ExitCode; service_STATUS_PROCESS.serviceSpecificExitCode = service_STATUS_PROCESS2.serviceSpecificExitCode; service_STATUS_PROCESS.checkPoint = service_STATUS_PROCESS2.checkPoint; service_STATUS_PROCESS.waitHint = service_STATUS_PROCESS2.waitHint; service_STATUS_PROCESS.processID = service_STATUS_PROCESS2.processID; service_STATUS_PROCESS.serviceFlags = service_STATUS_PROCESS2.serviceFlags; } finally { Marshal.FreeHGlobal(intPtr); } result = service_STATUS_PROCESS; } } return(result); }