Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
 public static ProcessInfo[] GetProcessInfos(string machineName)
 {
     return(NtProcessInfoHelper.GetProcessInfos());
 }