Example #1
0
        public SysInfoWindow()
        {
            InitializeComponent();
            this.AddEscapeToClose();

            this.Size     = Properties.Settings.Default.SysInfoWindowSize;
            this.Location = Utils.FitRectangle(new Rectangle(
                                                   Properties.Settings.Default.SysInfoWindowLocation, this.Size), this).Location;

            // Load the pool limit addresses.
            if (
                _mmSizeOfPagedPoolInBytes == IntPtr.Zero &&
                KProcessHacker.Instance != null
                )
            {
                WorkQueue.GlobalQueueWorkItemTag(new Action(() =>
                {
                    try
                    {
                        SymbolProvider symbols = new SymbolProvider();

                        symbols.LoadModule(Windows.KernelFileName, Windows.KernelBase);
                        _mmSizeOfPagedPoolInBytes =
                            symbols.GetSymbolFromName("MmSizeOfPagedPoolInBytes").Address.ToIntPtr();
                        _mmMaximumNonPagedPoolInBytes =
                            symbols.GetSymbolFromName("MmMaximumNonPagedPoolInBytes").Address.ToIntPtr();
                    }
                    catch
                    { }
                }), "load-mm-addresses");
            }
        }
Example #2
0
        private unsafe KVars GetKVars()
        {
            SymbolProvider symbols = new SymbolProvider();

            symbols.LoadModule(Windows.KernelFileName, Windows.KernelBase);

            KVars vars = new KVars();

            vars.NonPagedPoolStartAddress = symbols.GetSymbolFromName("MmNonPagedPoolStart").Address.ToIntPtr();
            vars.NonPagedPoolSizeAddress  = symbols.GetSymbolFromName("MmMaximumNonPagedPoolInBytes").Address.ToIntPtr();
            vars.PsProcessTypeAddress     = symbols.GetSymbolFromName("PsProcessType").Address.ToIntPtr();
            vars.PsThreadTypeAddress      = symbols.GetSymbolFromName("PsThreadType").Address.ToIntPtr();

            int bytesRead;

            KProcessHacker.Instance.KphReadVirtualMemoryUnsafe(
                ProcessHandle.Current,
                vars.NonPagedPoolStartAddress.ToInt32(),
                &vars.NonPagedPoolStart,
                IntPtr.Size,
                out bytesRead
                );
            KProcessHacker.Instance.KphReadVirtualMemoryUnsafe(
                ProcessHandle.Current,
                vars.NonPagedPoolSizeAddress.ToInt32(),
                &vars.NonPagedPoolSize,
                sizeof(uint),
                out bytesRead
                );
            KProcessHacker.Instance.KphReadVirtualMemoryUnsafe(
                ProcessHandle.Current,
                vars.PsProcessTypeAddress.ToInt32(),
                &vars.PsProcessType,
                IntPtr.Size,
                out bytesRead
                );
            KProcessHacker.Instance.KphReadVirtualMemoryUnsafe(
                ProcessHandle.Current,
                vars.PsThreadTypeAddress.ToInt32(),
                &vars.PsThreadType,
                IntPtr.Size,
                out bytesRead
                );

            symbols.Dispose();

            return(vars);
        }
Example #3
0
        public SysInfoWindow()
        {
            this.InitializeComponent();

            //if (!Settings.Instance.SysInfoWindowBounds.IsEmpty)
            //this.DesktopBounds = Utils.FitRectangle(Settings.Instance.SysInfoWindowBounds, this);

            // Load the pool limit addresses.
            if (_mmSizeOfPagedPoolInBytes == IntPtr.Zero)
            {
                WorkQueue.GlobalQueueWorkItemTag(new Action(() =>
                {
                    try
                    {
                        using (SymbolProvider symbols = new SymbolProvider())
                        {
                            symbols.LoadModule(Windows.KernelFileName, Windows.KernelBase);

                            _mmSizeOfPagedPoolInBytes     = (IntPtr)symbols.GetSymbolFromName("MmSizeOfPagedPoolInBytes").Address;
                            _mmMaximumNonPagedPoolInBytes = (IntPtr)symbols.GetSymbolFromName("MmMaximumNonPagedPoolInBytes").Address;
                        }
                    }
                    catch (Exception) { }
                }), "load-mm-addresses");
            }

            this.trackerMemory.values    = Program.ProcessProvider.PhysicalMemoryHistory;
            this.trackerMemory.DrawColor = Settings.Instance.PlotterMemoryPrivateColor;

            this.trackerCommit.Maximum   = (int)Program.ProcessProvider.Performance.CommitLimit;
            this.trackerCommit.values    = Program.ProcessProvider.CommitHistory;
            this.trackerCommit.DrawColor = Settings.Instance.PlotterMemoryWSColor;

            // Set indicators color
            this.indicatorCpu.Color1 = Settings.Instance.PlotterCPUUserColor;
            this.indicatorCpu.Color2 = Settings.Instance.PlotterCPUKernelColor;

            this.indicatorIO.Color1       = Settings.Instance.PlotterIOROColor;
            this.indicatorPhysical.Color1 = Settings.Instance.PlotterMemoryPrivateColor;

            this.plotterCPU.LineColor2 = Settings.Instance.PlotterCPUKernelColor;
            this.plotterCPU.LineColor1 = Settings.Instance.PlotterCPUUserColor;

            this.plotterIO.LineColor1 = Settings.Instance.PlotterIOROColor;
            this.plotterIO.LineColor2 = Settings.Instance.PlotterIOWColor;

            // Maximum physical memory.
            this.indicatorPhysical.Maximum = _pages;

            // Set up the plotter controls.
            plotterCPU.Data1      = Program.ProcessProvider.CpuKernelHistory;
            plotterCPU.Data2      = Program.ProcessProvider.CpuUserHistory;
            plotterCPU.GetToolTip = i =>
                                    Program.ProcessProvider.MostCpuHistory[i] + "\n" +
                                    ((plotterCPU.Data1[i] + plotterCPU.Data2[i]) * 100).ToString("N2") +
                                    "% (K " + (plotterCPU.Data1[i] * 100).ToString("N2") +
                                    "%, U " + (plotterCPU.Data2[i] * 100).ToString("N2") + "%)" + "\n" +
                                    Program.ProcessProvider.TimeHistory[i].ToString();

            plotterIO.LongData1  = Program.ProcessProvider.IoReadOtherHistory;
            plotterIO.LongData2  = Program.ProcessProvider.IoWriteHistory;
            plotterIO.GetToolTip = i =>
                                   Program.ProcessProvider.MostIoHistory[i] + "\n" +
                                   "R+O: " + Utils.FormatSize(plotterIO.LongData1[i]) + "\n" +
                                   "W: " + Utils.FormatSize(plotterIO.LongData2[i]) + "\n" +
                                   Program.ProcessProvider.TimeHistory[i].ToString();

            //plotterMemory.Data1 = Program.ProcessProvider.CommitHistory;
            //plotterMemory.Data2 = Program.ProcessProvider.PhysicalMemoryHistory;
            //plotterMemory.GetToolTip = i => "Commit: " + plotterMemory.Data1[i] + "\n" +
            //    "Phys. Memory: " + plotterMemory.Data2[i] + "\n" + Program.ProcessProvider.TimeHistory[i].ToString();

            // Create a plotter per CPU.
            _cpuPlotters          = new Plotter[_noOfCPUs];
            tableCPUs.ColumnCount = (int)_noOfCPUs;
            tableCPUs.ColumnStyles.Clear();
            tableCPUs.Dock = DockStyle.Fill;

            for (int i = 0; i < _cpuPlotters.Length; i++)
            {
                Plotter plotter;

                tableCPUs.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 1.0f / _noOfCPUs));
                _cpuPlotters[i] = plotter = new Plotter();

                plotter.BackColor     = Color.Black;
                plotter.Dock          = DockStyle.Fill;
                plotter.Margin        = new Padding(i == 0 ? 0 : 3, 0, 0, 0); // nice spacing
                plotter.UseSecondLine = true;
                plotter.Data1         = Program.ProcessProvider.CpusKernelHistory[i];
                plotter.Data2         = Program.ProcessProvider.CpusUserHistory[i];
                plotter.GetToolTip    = j =>
                                        Program.ProcessProvider.MostCpuHistory[j] + "\n" +
                                        ((plotter.Data1[j] + plotter.Data2[j]) * 100).ToString("N2") +
                                        "% (K " + (plotter.Data1[j] * 100).ToString("N2") +
                                        "%, U " + (plotter.Data2[j] * 100).ToString("N2") + "%)" + "\n" +
                                        Program.ProcessProvider.TimeHistory[j].ToString();

                this.tableCPUs.Controls.Add(plotter, i, 0);
            }

            this.checkShowOneGraphPerCPU.Checked = Settings.Instance.ShowOneGraphPerCPU;

            if (_noOfCPUs == 1)
            {
                checkShowOneGraphPerCPU.Enabled = false;
            }

            Program.ProcessProvider.Updated += ProcessProvider_Updated;

            //We need to do this here or TopMost property gets over-rided by AlwaysOnTopCheckbox
            this.TopMost = Settings.Instance.AlwaysOnTop;

            this.UpdateGraphs();
            this.UpdateInfo();
        }