public static ProcessInfo[] GetProcessInfos() { int num = 131072; int requiredSize = 0; GCHandle gCHandle = default(GCHandle); ProcessInfo[] processInfos; try { int num2; do { long[] value = new long[(num + 7) / 8]; gCHandle = GCHandle.Alloc(value, GCHandleType.Pinned); num2 = NativeMethods.NtQuerySystemInformation(5, gCHandle.AddrOfPinnedObject(), num, out requiredSize); if (num2 == -1073741820) { if (gCHandle.IsAllocated) { gCHandle.Free(); } num = NtProcessInfoHelper.GetNewBufferSize(num, requiredSize); } }while (num2 == -1073741820); if (num2 < 0) { throw new InvalidOperationException("CouldntGetProcessInfos", new Win32Exception(num2)); } processInfos = NtProcessInfoHelper.GetProcessInfos(gCHandle.AddrOfPinnedObject()); } finally { if (gCHandle.IsAllocated) { gCHandle.Free(); } } return(processInfos); }
private static ProcessInfo[] GetProcessInfos(IntPtr dataPtr) { Hashtable hashtable = new Hashtable(60); long num = 0L; while (true) { IntPtr intPtr = (IntPtr)((long)dataPtr + num); NtProcessInfoHelper.SystemProcessInformation systemProcessInformation = new NtProcessInfoHelper.SystemProcessInformation(); Marshal.PtrToStructure(intPtr, systemProcessInformation); ProcessInfo processInfo = new ProcessInfo(); processInfo.processId = systemProcessInformation.UniqueProcessId.ToInt32(); processInfo.handleCount = (int)systemProcessInformation.HandleCount; processInfo.sessionId = (int)systemProcessInformation.SessionId; processInfo.poolPagedBytes = (long)((ulong)systemProcessInformation.QuotaPagedPoolUsage); processInfo.poolNonpagedBytes = (long)((ulong)systemProcessInformation.QuotaNonPagedPoolUsage); processInfo.virtualBytes = (long)((ulong)systemProcessInformation.VirtualSize); processInfo.virtualBytesPeak = (long)((ulong)systemProcessInformation.PeakVirtualSize); processInfo.workingSetPeak = (long)((ulong)systemProcessInformation.PeakWorkingSetSize); processInfo.workingSet = (long)((ulong)systemProcessInformation.WorkingSetSize); processInfo.pageFileBytesPeak = (long)((ulong)systemProcessInformation.PeakPagefileUsage); processInfo.pageFileBytes = (long)((ulong)systemProcessInformation.PagefileUsage); processInfo.privateBytes = (long)((ulong)systemProcessInformation.PrivatePageCount); processInfo.basePriority = systemProcessInformation.BasePriority; if (systemProcessInformation.NamePtr == IntPtr.Zero) { if (processInfo.processId == NtProcessManager.SystemProcessID) { processInfo.processName = "System"; } else { if (processInfo.processId == 0) { processInfo.processName = "Idle"; } else { processInfo.processName = processInfo.processId.ToString(CultureInfo.InvariantCulture); } } } else { string text = NtProcessInfoHelper.GetProcessShortName(Marshal.PtrToStringUni(systemProcessInformation.NamePtr, (int)(systemProcessInformation.NameLength / 2))); processInfo.processName = text; } hashtable[processInfo.processId] = processInfo; intPtr = (IntPtr)((long)intPtr + (long)Marshal.SizeOf(systemProcessInformation)); int num2 = 0; while ((long)num2 < (long)((ulong)systemProcessInformation.NumberOfThreads)) { NtProcessInfoHelper.SystemThreadInformation systemThreadInformation = new NtProcessInfoHelper.SystemThreadInformation(); Marshal.PtrToStructure(intPtr, systemThreadInformation); ThreadInfo threadInfo = new ThreadInfo(); threadInfo.processId = (int)systemThreadInformation.UniqueProcess; threadInfo.threadId = (int)systemThreadInformation.UniqueThread; threadInfo.basePriority = systemThreadInformation.BasePriority; threadInfo.currentPriority = systemThreadInformation.Priority; threadInfo.startAddress = systemThreadInformation.StartAddress; threadInfo.threadState = (ThreadState)systemThreadInformation.ThreadState; threadInfo.threadWaitReason = NtProcessManager.GetThreadWaitReason((int)systemThreadInformation.WaitReason); processInfo.threadInfoList.Add(threadInfo); intPtr = (IntPtr)((long)intPtr + (long)Marshal.SizeOf(systemThreadInformation)); num2++; } if (systemProcessInformation.NextEntryOffset == 0u) { break; } num += (long)((ulong)systemProcessInformation.NextEntryOffset); } ProcessInfo[] array = new ProcessInfo[hashtable.Values.Count]; hashtable.Values.CopyTo(array, 0); return(array); }
public static ProcessInfo[] GetProcessInfos(string machineName) { return(NtProcessInfoHelper.GetProcessInfos()); }