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