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); }
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 }); }
private static unsafe bool IsZombie(SystemProcessInformation *info) => info->NumberOfThreads == 0;