/// <summary> /// Mocks <see cref="IRestartManagerService.GetProcesses(int, out int, ref int, RM_PROCESS_INFO[], out RebootReason)"/>. /// </summary> /// <param name="sessionId">Optional session ID to use. The default is 0.</param> /// <param name="processes">Optional array of <see cref="RM_PROCESS_INFO"/>. The default is <see cref="DefaultProcesses"/>.</param> /// <param name="rebootReason">Optional <see cref="RebootReason"/>. The default is <see cref="RebootReason.None"/>.</param> /// <param name="error">Optional error code to return for the first call. The default is 0 (no error).</param> /// <returns>The current instance for fluent calls.</returns> public MockRestartManagerService GetProcesses(int sessionId = DefaultSessionId, RM_PROCESS_INFO[] processes = null, RebootReason rebootReason = RebootReason.None, int error = NativeMethods.ERROR_SUCCESS) { processes = processes ?? DefaultProcesses; var processesLengthRequired = processes.Length; var processesLength = 0; var sequence = new MockSequence(); Mock.Setup(x => x.GetProcesses(sessionId, out processesLengthRequired, ref processesLength, null, out rebootReason)) .Returns(error == NativeMethods.ERROR_SUCCESS ? NativeMethods.ERROR_MORE_DATA : error) .Verifiable(); if (error == NativeMethods.ERROR_SUCCESS) { processesLength = processesLengthRequired; Mock.Setup(x => x.GetProcesses(sessionId, out processesLengthRequired, ref processesLength, It.IsAny <RM_PROCESS_INFO[]>(), out rebootReason)) .OutCallback((int sessionId_, out int processesLengthRequired_, ref int processesLengt_, RM_PROCESS_INFO[] processes_, out RebootReason rebootReason_) => { processesLengthRequired_ = processesLengthRequired; rebootReason_ = rebootReason; processes.CopyTo(processes_, 0); }) .Returns(NativeMethods.ERROR_SUCCESS) .Verifiable(); } return(this); }
public ProcessInfo[] GetList(out RebootReason reason) { UInt32 needed = 10; UInt32 size = needed; ProcessInfo.Native[] narr; for (; ;) { size = needed; narr = new ProcessInfo.Native[size]; var result = RmGetList(handle, ref needed, ref size, narr, out reason); if (result == Result.MoreData) { continue; } CheckResult(result); break; } ProcessInfo[] marr = new ProcessInfo[needed]; for (var i = 0; i < needed; ++i) { marr[i] = narr[i].AsNative(); } return(marr); }
/// <summary> /// Initializes a new instance of the <see cref="ProcessInfo"/> class. /// </summary> /// <param name="process">The <see cref="RM_PROCESS_INFO"/> to adapt.</param> /// <param name="reason">The <see cref="RebootReason"/> of why the computer must be restarted.</param> internal ProcessInfo(RM_PROCESS_INFO process, RebootReason reason) { var fileTime = ((long)process.Process.ProcessStartTime.dwHighDateTime << 32) + process.Process.ProcessStartTime.dwLowDateTime; Id = process.Process.dwProcessId; StartTime = DateTimeOffset.FromFileTime(fileTime); Description = process.strAppName; ServiceName = process.strServiceShortName; ApplicationType = process.ApplicationType; ApplicationStatus = process.AppStatus; IsRestartable = process.bRestartable; RebootReason = reason; }
/// <inheritdoc/> public int GetProcesses(int sessionId, out int processesLengthRequired, ref int processesLength, RM_PROCESS_INFO[] processes, out RebootReason rebootReason) => NativeMethods.RmGetList(sessionId, out processesLengthRequired, ref processesLength, processes, out rebootReason);
/// <summary> /// Gets a collection of default <see cref="IProcessInfo"/>. /// </summary> /// <param name="rebootReason">The <see cref="RebootReason"/> for each <see cref="IProcessInfo"/>.</param> /// <returns>A collection of default <see cref="IProcessInfo"/> from <see cref="DefaultProcesses"/>.</returns> public static IEnumerable <IProcessInfo> GetDefaultProcessesInfo(RebootReason rebootReason = RebootReason.None) => DefaultProcesses.Select(process => new ProcessInfo(process, rebootReason));
int IRestartManagerService.GetProcesses(int sessionId, out int processesLengthRequired, ref int processesLength, RM_PROCESS_INFO[] processes, out RebootReason rebootReason) { return(Object.GetProcesses(sessionId, out processesLengthRequired, ref processesLength, processes, out rebootReason)); }
private static extern Result RmGetList(UIntPtr handle, ref UInt32 nProcInfoNeeded, ref UInt32 nProcInfo, [In, Out][MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStruct)] ProcessInfo.Native[] affectedApps, out RebootReason reason );
internal static extern int RmGetList( [MarshalAs(UnmanagedType.U4)] int dwSessionHandle, [MarshalAs(UnmanagedType.U4)] out int pnProcInfoNeeded, [MarshalAs(UnmanagedType.U4)] ref int pnProcInfo, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2), Out] RM_PROCESS_INFO[] rgAffectedApps, [MarshalAs(UnmanagedType.U4)] out RebootReason lpdwRebootReasons);