예제 #1
0
        private static unsafe void FillResult(List <ProcessInfo> result, SystemProcessInformation *proc)
        {
            var info = new ProcessInfo
            {
                Id       = (int)proc->UniqueProcessId,
                Name     = new string((char *)proc->NamePtr),
                ParentId = (int)proc->InheritedFromUniqueProcessId
            };

            result.Add(info);
        }
예제 #2
0
        private unsafe void Visit(SystemProcessInformation *info, Dictionary <int, long> newTimes, List <ProcessMetrics> processes, TimeSpan period)
        {
            var pid          = (int)info->UniqueProcessId;
            var currentTimes = info->KernelTime + info->UserTime;
            var prevTimes    = times.TryGetValue(pid, out var t) ? t : currentTimes;

            newTimes[pid] = currentTimes;

            processes.Add(new ProcessMetrics
            {
                BasePriority     = info->BasePriority,
                HandlesCount     = (int)info->HandleCount,
                Name             = GetProcessName(info->NamePtr),
                PeakPrivateBytes = (long)info->PeakPagefileUsage,
                WorkingSet       = (long)info->WorkingSetSize,
                PrivateBytes     = (long)info->PrivatePageCount,
                ProcessId        = (int)info->UniqueProcessId,
                SessionId        = (int)info->SessionId,
                PeakWorkingSet   = (long)info->PeakWorkingSetSize,
                ThreadsCount     = (int)info->NumberOfThreads,
                Cpu = (currentTimes - prevTimes) / (double)period.Ticks / Environment.ProcessorCount
            });
        }
예제 #3
0
 private static unsafe bool IsZombie(SystemProcessInformation *info) => info->NumberOfThreads == 0;