From 80fcf7fd80889cd4320d7b69aaf68df0c9528f81 Mon Sep 17 00:00:00 2001 From: wj32 Date: Thu, 16 Apr 2009 10:46:08 +0000 Subject: [PATCH] added Private, Shared and Shareable Working Set columns git-svn-id: svn://svn.code.sf.net/p/processhacker/code@1074 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- trunk/NProcessHacker/NProcessHacker.vcproj | 4 +- trunk/NProcessHacker/process.c | 49 ++++++++++-- trunk/NProcessHacker/process.h | 2 - .../Components/ProcessTree/ProcessNode.cs | 72 +++++++++++++++-- .../ProcessTree/ProcessTree.Designer.cs | 78 +++++++++++++++++++ .../Components/ProcessTree/ProcessTree.cs | 10 +-- .../ProcessTree/ProcessTreeModel.cs | 12 +-- trunk/ProcessHacker/Forms/HackerWindow.cs | 30 +++---- trunk/ProcessHacker/Forms/ProcessWindow.cs | 4 +- trunk/ProcessHacker/Program/NProcessHacker.cs | 36 +++++++++ trunk/ProcessHacker/Program/Program.cs | 8 +- .../Providers/ProcessSystemProvider.cs | 4 +- 12 files changed, 257 insertions(+), 52 deletions(-) diff --git a/trunk/NProcessHacker/NProcessHacker.vcproj b/trunk/NProcessHacker/NProcessHacker.vcproj index 64577a36c..b5720bb26 100644 --- a/trunk/NProcessHacker/NProcessHacker.vcproj +++ b/trunk/NProcessHacker/NProcessHacker.vcproj @@ -59,7 +59,7 @@ /> @@ -131,7 +131,7 @@ /> 1) + sharedCount++; + if (block.ShareCount == 0) + privateCount++; + if (block.Shared) + shareableCount++; } + + PhFree(wsInfo); + + switch (WsInformationClass) + { + case WsCount: + *(PULONG)WsInformation = count; + break; + case WsPrivateCount: + *(PULONG)WsInformation = privateCount; + break; + case WsSharedCount: + *(PULONG)WsInformation = sharedCount; + break; + case WsShareableCount: + *(PULONG)WsInformation = shareableCount; + break; + case WsAllCounts: + { + PWS_ALL_COUNTS allCounts = (PWS_ALL_COUNTS)WsInformation; + + allCounts->Count = count; + allCounts->PrivateCount = privateCount; + allCounts->SharedCount = sharedCount; + allCounts->ShareableCount = shareableCount; + break; + } + } + + return STATUS_SUCCESS; } - default: + break; + default: return STATUS_INVALID_PARAMETER; } } diff --git a/trunk/NProcessHacker/process.h b/trunk/NProcessHacker/process.h index 3f4479eff..6b3a3d8db 100644 --- a/trunk/NProcessHacker/process.h +++ b/trunk/NProcessHacker/process.h @@ -31,7 +31,6 @@ typedef enum _WS_INFORMATION_CLASS WsPrivateCount, WsSharedCount, WsShareableCount, - WsLockedCount, WsAllCounts } WS_INFORMATION_CLASS, *PWS_INFORMATION_CLASS; @@ -41,7 +40,6 @@ typedef struct _WS_ALL_COUNTS ULONG PrivateCount; ULONG SharedCount; ULONG ShareableCount; - ULONG LockedCount; } WS_ALL_COUNTS, *PWS_ALL_COUNTS; #endif \ No newline at end of file diff --git a/trunk/ProcessHacker/Components/ProcessTree/ProcessNode.cs b/trunk/ProcessHacker/Components/ProcessTree/ProcessNode.cs index ebfa8d488..204bdcafe 100644 --- a/trunk/ProcessHacker/Components/ProcessTree/ProcessNode.cs +++ b/trunk/ProcessHacker/Components/ProcessTree/ProcessNode.cs @@ -37,7 +37,7 @@ namespace ProcessHacker public ProcessNode(ProcessItem pitem) { _pitem = pitem; - this.Tag = pitem.PID; + this.Tag = pitem.Pid; if (_pitem.Icon == null) { @@ -151,8 +151,8 @@ namespace ProcessHacker { get { - if (_pitem.PID >= 0) - return _pitem.PID.ToString(); + if (_pitem.Pid >= 0) + return _pitem.Pid.ToString(); else return ""; } @@ -160,12 +160,12 @@ namespace ProcessHacker public int PID { - get { return _pitem.PID; } + get { return _pitem.Pid; } } public int PPID { - get { if (_pitem.PID == _pitem.ParentPid) return -1; else return _pitem.ParentPid; } + get { if (_pitem.Pid == _pitem.ParentPid) return -1; else return _pitem.ParentPid; } } public string PvtMemory @@ -175,7 +175,10 @@ namespace ProcessHacker public string WorkingSet { - get { return Misc.GetNiceSizeName(_pitem.Process.VirtualMemoryCounters.WorkingSetSize); } + get + { + return Misc.GetNiceSizeName(_pitem.Process.VirtualMemoryCounters.WorkingSetSize); + } } public string PeakWorkingSet @@ -183,6 +186,63 @@ namespace ProcessHacker get { return Misc.GetNiceSizeName(_pitem.Process.VirtualMemoryCounters.PeakWorkingSetSize); } } + private int GetWorkingSetNumber(NProcessHacker.WS_INFORMATION_CLASS WsInformationClass) + { + int wsInfo; + int retLen; + + try + { + using (var phandle = new Win32.ProcessHandle(_pitem.Pid, + Win32.PROCESS_RIGHTS.PROCESS_QUERY_INFORMATION | + Win32.PROCESS_RIGHTS.PROCESS_VM_READ)) + { + if ((retLen = NProcessHacker.PhpQueryProcessWs(phandle, WsInformationClass, out wsInfo, + 4, out retLen)) == 0) + return wsInfo * Program.ProcessProvider.System.PageSize; + } + } + catch + { } + + return 0; + } + + public int WorkingSetNumber + { + get { return this.GetWorkingSetNumber(NProcessHacker.WS_INFORMATION_CLASS.WsCount); } + } + + public int PrivateWorkingSetNumber + { + get { return this.GetWorkingSetNumber(NProcessHacker.WS_INFORMATION_CLASS.WsPrivateCount); } + } + + public string PrivateWorkingSet + { + get { return Misc.GetNiceSizeName(this.PrivateWorkingSetNumber); } + } + + public int SharedWorkingSetNumber + { + get { return this.GetWorkingSetNumber(NProcessHacker.WS_INFORMATION_CLASS.WsSharedCount); } + } + + public string SharedWorkingSet + { + get { return Misc.GetNiceSizeName(this.SharedWorkingSetNumber); } + } + + public int ShareableWorkingSetNumber + { + get { return this.GetWorkingSetNumber(NProcessHacker.WS_INFORMATION_CLASS.WsShareableCount); } + } + + public string ShareableWorkingSet + { + get { return Misc.GetNiceSizeName(this.ShareableWorkingSetNumber); } + } + public string VirtualSize { get { return Misc.GetNiceSizeName(_pitem.Process.VirtualMemoryCounters.VirtualSize); } diff --git a/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.Designer.cs b/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.Designer.cs index 29567e5da..f1df06f9a 100644 --- a/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.Designer.cs +++ b/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.Designer.cs @@ -34,6 +34,7 @@ this.columnPvtMemory = new Aga.Controls.Tree.TreeColumn(); this.columnWorkingSet = new Aga.Controls.Tree.TreeColumn(); this.columnPeakWorkingSet = new Aga.Controls.Tree.TreeColumn(); + this.columnPrivateWorkingSet = new Aga.Controls.Tree.TreeColumn(); this.columnVirtualSize = new Aga.Controls.Tree.TreeColumn(); this.columnPeakVirtualSize = new Aga.Controls.Tree.TreeColumn(); this.columnPagefileUsage = new Aga.Controls.Tree.TreeColumn(); @@ -80,6 +81,11 @@ this.nodeIoTotal = new Aga.Controls.Tree.NodeControls.NodeTextBox(); this.nodeIoReadOther = new Aga.Controls.Tree.NodeControls.NodeTextBox(); this.nodeIoWrite = new Aga.Controls.Tree.NodeControls.NodeTextBox(); + this.nodePrivateWorkingSet = new Aga.Controls.Tree.NodeControls.NodeTextBox(); + this.columnSharedWorkingSet = new Aga.Controls.Tree.TreeColumn(); + this.columnShareableWorkingSet = new Aga.Controls.Tree.TreeColumn(); + this.nodeSharedWorkingSet = new Aga.Controls.Tree.NodeControls.NodeTextBox(); + this.nodeShareableWorkingSet = new Aga.Controls.Tree.NodeControls.NodeTextBox(); this.SuspendLayout(); // // treeProcesses @@ -91,6 +97,9 @@ this.treeProcesses.Columns.Add(this.columnPvtMemory); this.treeProcesses.Columns.Add(this.columnWorkingSet); this.treeProcesses.Columns.Add(this.columnPeakWorkingSet); + this.treeProcesses.Columns.Add(this.columnPrivateWorkingSet); + this.treeProcesses.Columns.Add(this.columnSharedWorkingSet); + this.treeProcesses.Columns.Add(this.columnShareableWorkingSet); this.treeProcesses.Columns.Add(this.columnVirtualSize); this.treeProcesses.Columns.Add(this.columnPeakVirtualSize); this.treeProcesses.Columns.Add(this.columnPagefileUsage); @@ -129,6 +138,9 @@ this.treeProcesses.NodeControls.Add(this.nodePeakWorkingSet); this.treeProcesses.NodeControls.Add(this.nodeVirtualSize); this.treeProcesses.NodeControls.Add(this.nodePeakVirtualSize); + this.treeProcesses.NodeControls.Add(this.nodePrivateWorkingSet); + this.treeProcesses.NodeControls.Add(this.nodeSharedWorkingSet); + this.treeProcesses.NodeControls.Add(this.nodeShareableWorkingSet); this.treeProcesses.NodeControls.Add(this.nodePagefileUsage); this.treeProcesses.NodeControls.Add(this.nodePeakPagefileUsage); this.treeProcesses.NodeControls.Add(this.nodePageFaults); @@ -202,6 +214,16 @@ this.columnPeakWorkingSet.TooltipText = null; this.columnPeakWorkingSet.Width = 70; // + // columnPrivateWorkingSet + // + this.columnPrivateWorkingSet.Header = "Private WS"; + this.columnPrivateWorkingSet.IsVisible = false; + this.columnPrivateWorkingSet.Sortable = true; + this.columnPrivateWorkingSet.SortOrder = System.Windows.Forms.SortOrder.None; + this.columnPrivateWorkingSet.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.columnPrivateWorkingSet.TooltipText = null; + this.columnPrivateWorkingSet.Width = 70; + // // columnVirtualSize // this.columnVirtualSize.Header = "Virtual Size"; @@ -640,6 +662,56 @@ this.nodeIoWrite.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; this.nodeIoWrite.Trimming = System.Drawing.StringTrimming.EllipsisCharacter; // + // nodePrivateWorkingSet + // + this.nodePrivateWorkingSet.DataPropertyName = "PrivateWorkingSet"; + this.nodePrivateWorkingSet.EditEnabled = false; + this.nodePrivateWorkingSet.IncrementalSearchEnabled = true; + this.nodePrivateWorkingSet.LeftMargin = 3; + this.nodePrivateWorkingSet.ParentColumn = this.columnPrivateWorkingSet; + this.nodePrivateWorkingSet.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.nodePrivateWorkingSet.Trimming = System.Drawing.StringTrimming.EllipsisCharacter; + // + // columnSharedWorkingSet + // + this.columnSharedWorkingSet.Header = "Shared WS"; + this.columnSharedWorkingSet.IsVisible = false; + this.columnSharedWorkingSet.Sortable = true; + this.columnSharedWorkingSet.SortOrder = System.Windows.Forms.SortOrder.None; + this.columnSharedWorkingSet.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.columnSharedWorkingSet.TooltipText = null; + this.columnSharedWorkingSet.Width = 70; + // + // columnShareableWorkingSet + // + this.columnShareableWorkingSet.Header = "Shareable WS"; + this.columnShareableWorkingSet.IsVisible = false; + this.columnShareableWorkingSet.Sortable = true; + this.columnShareableWorkingSet.SortOrder = System.Windows.Forms.SortOrder.None; + this.columnShareableWorkingSet.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.columnShareableWorkingSet.TooltipText = null; + this.columnShareableWorkingSet.Width = 70; + // + // nodeSharedWorkingSet + // + this.nodeSharedWorkingSet.DataPropertyName = "SharedWorkingSet"; + this.nodeSharedWorkingSet.EditEnabled = false; + this.nodeSharedWorkingSet.IncrementalSearchEnabled = true; + this.nodeSharedWorkingSet.LeftMargin = 3; + this.nodeSharedWorkingSet.ParentColumn = this.columnSharedWorkingSet; + this.nodeSharedWorkingSet.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.nodeSharedWorkingSet.Trimming = System.Drawing.StringTrimming.EllipsisCharacter; + // + // nodeShareableWorkingSet + // + this.nodeShareableWorkingSet.DataPropertyName = "ShareableWorkingSet"; + this.nodeShareableWorkingSet.EditEnabled = false; + this.nodeShareableWorkingSet.IncrementalSearchEnabled = true; + this.nodeShareableWorkingSet.LeftMargin = 3; + this.nodeShareableWorkingSet.ParentColumn = this.columnShareableWorkingSet; + this.nodeShareableWorkingSet.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.nodeShareableWorkingSet.Trimming = System.Drawing.StringTrimming.EllipsisCharacter; + // // ProcessTree // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -706,5 +778,11 @@ private Aga.Controls.Tree.NodeControls.NodeTextBox nodeIoTotal; private Aga.Controls.Tree.NodeControls.NodeTextBox nodeIoReadOther; private Aga.Controls.Tree.NodeControls.NodeTextBox nodeIoWrite; + private Aga.Controls.Tree.TreeColumn columnPrivateWorkingSet; + private Aga.Controls.Tree.NodeControls.NodeTextBox nodePrivateWorkingSet; + private Aga.Controls.Tree.TreeColumn columnSharedWorkingSet; + private Aga.Controls.Tree.TreeColumn columnShareableWorkingSet; + private Aga.Controls.Tree.NodeControls.NodeTextBox nodeSharedWorkingSet; + private Aga.Controls.Tree.NodeControls.NodeTextBox nodeShareableWorkingSet; } } diff --git a/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.cs b/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.cs index 24691ba3b..201eff010 100644 --- a/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.cs +++ b/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.cs @@ -265,8 +265,8 @@ namespace ProcessHacker else if (Properties.Settings.Default.UseColorPackedProcesses && p.IsPacked) return Properties.Settings.Default.ColorPackedProcesses; else if (Properties.Settings.Default.UseColorServiceProcesses && - Program.HackerWindow.ProcessServices.ContainsKey(p.PID) && - Program.HackerWindow.ProcessServices[p.PID].Count > 0) + Program.HackerWindow.ProcessServices.ContainsKey(p.Pid) && + Program.HackerWindow.ProcessServices[p.Pid].Count > 0) return Properties.Settings.Default.ColorServiceProcesses; else if (Properties.Settings.Default.UseColorSystemProcesses && p.Username == "NT AUTHORITY\\SYSTEM") return Properties.Settings.Default.ColorSystemProcesses; @@ -284,7 +284,7 @@ namespace ProcessHacker { _treeModel.Add(item); - TreeNodeAdv node = this.FindTreeNode(item.PID); + TreeNodeAdv node = this.FindTreeNode(item.Pid); if (node != null) { @@ -316,7 +316,7 @@ namespace ProcessHacker if (newItem.FullUpdate) { - TreeNodeAdv node = this.FindTreeNode(newItem.PID); + TreeNodeAdv node = this.FindTreeNode(newItem.Pid); if (node != null) { @@ -333,7 +333,7 @@ namespace ProcessHacker { lock (_listLock) { - TreeNodeAdv node = this.FindTreeNode(item.PID); + TreeNodeAdv node = this.FindTreeNode(item.Pid); if (node != null) { diff --git a/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs b/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs index c3b206bd2..704acdf0c 100644 --- a/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs +++ b/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs @@ -48,14 +48,14 @@ namespace ProcessHacker else _roots.Add(itemNode); - _processes.Add(item.PID, itemNode); + _processes.Add(item.Pid, itemNode); ProcessNode[] rootNodes = _roots.ToArray(); // find this process' children foreach (ProcessNode node in rootNodes) { - if (node.ProcessItem.HasParent && node.PPID == item.PID) + if (node.ProcessItem.HasParent && node.PPID == item.Pid) { _roots.Remove(node); itemNode.Children.Add(node); @@ -67,7 +67,7 @@ namespace ProcessHacker public void Modify(ProcessItem oldItem, ProcessItem newItem) { - ProcessNode node = _processes[newItem.PID]; + ProcessNode node = _processes[newItem.Pid]; node.ProcessItem = newItem; @@ -79,7 +79,7 @@ namespace ProcessHacker public void Remove(ProcessItem item) { - ProcessNode targetNode = _processes[item.PID]; + ProcessNode targetNode = _processes[item.Pid]; ProcessNode[] nodes = _roots.ToArray(); ProcessNode[] targetChildren = null; @@ -87,7 +87,7 @@ namespace ProcessHacker foreach (ProcessNode node in nodes) { - if (node.PID == item.PID) + if (node.PID == item.Pid) { _roots.Remove(node); this.MoveChildrenToRoot(node); @@ -107,7 +107,7 @@ namespace ProcessHacker } } - _processes.Remove(item.PID); + _processes.Remove(item.Pid); this.StructureChanged(this, new TreePathEventArgs(new TreePath())); foreach (ProcessNode n in targetChildren) diff --git a/trunk/ProcessHacker/Forms/HackerWindow.cs b/trunk/ProcessHacker/Forms/HackerWindow.cs index a9e0817b7..689293b82 100644 --- a/trunk/ProcessHacker/Forms/HackerWindow.cs +++ b/trunk/ProcessHacker/Forms/HackerWindow.cs @@ -511,7 +511,7 @@ namespace ProcessHacker { foreach (var process in processP.Dictionary.Values) { - if (process.PID > 0) + if (process.Pid > 0) { processes.Add(process); } @@ -548,14 +548,14 @@ namespace ProcessHacker MenuItem resumeItem = new MenuItem(); MenuItem propertiesItem = new MenuItem(); - processItem.Text = process.Name + " (" + process.PID.ToString() + ")"; + processItem.Text = process.Name + " (" + process.Pid.ToString() + ")"; processItem.Tag = process; terminateItem.Click += new EventHandler((sender_, e_) => { ProcessItem item = (ProcessItem)((MenuItem)sender_).Parent.Tag; - ProcessActions.Terminate(this, new int[] { item.PID }, new string[] { item.Name }, true); + ProcessActions.Terminate(this, new int[] { item.Pid }, new string[] { item.Name }, true); }); terminateItem.Text = "Terminate"; @@ -563,7 +563,7 @@ namespace ProcessHacker { ProcessItem item = (ProcessItem)((MenuItem)sender_).Parent.Tag; - ProcessActions.Suspend(this, new int[] { item.PID }, new string[] { item.Name }, true); + ProcessActions.Suspend(this, new int[] { item.Pid }, new string[] { item.Name }, true); }); suspendItem.Text = "Suspend"; @@ -571,7 +571,7 @@ namespace ProcessHacker { ProcessItem item = (ProcessItem)((MenuItem)sender_).Parent.Tag; - ProcessActions.Resume(this, new int[] { item.PID }, new string[] { item.Name }, true); + ProcessActions.Resume(this, new int[] { item.Pid }, new string[] { item.Name }, true); }); resumeItem.Text = "Resume"; @@ -581,7 +581,7 @@ namespace ProcessHacker { ProcessItem item = (ProcessItem)((MenuItem)sender_).Parent.Tag; - ProcessWindow pForm = Program.GetProcessWindow(processP.Dictionary[item.PID], + ProcessWindow pForm = Program.GetProcessWindow(processP.Dictionary[item.Pid], new Program.PWindowInvokeAction(delegate(ProcessWindow f) { f.Show(); @@ -599,7 +599,7 @@ namespace ProcessHacker processItem.MenuItems.AddRange(new MenuItem[] { terminateItem, suspendItem, resumeItem, propertiesItem }); processesMenuItem.MenuItems.Add(processItem); - vistaMenu.SetImage(processItem, (treeProcesses.Tree.Model as ProcessTreeModel).Nodes[process.PID].Icon); + vistaMenu.SetImage(processItem, (treeProcesses.Tree.Model as ProcessTreeModel).Nodes[process.Pid].Icon); } } catch @@ -1261,7 +1261,7 @@ namespace ProcessHacker { parent = processP.Dictionary[item.ParentPid]; - parentText += " started by " + parent.Name + " (PID " + parent.PID.ToString() + ")"; + parentText += " started by " + parent.Name + " (PID " + parent.Pid.ToString() + ")"; } catch (Exception ex) { @@ -1269,25 +1269,25 @@ namespace ProcessHacker } } - this.QueueMessage("New Process: " + item.Name + " (PID " + item.PID.ToString() + ")" + parentText, item.Icon); + this.QueueMessage("New Process: " + item.Name + " (PID " + item.Pid.ToString() + ")" + parentText, item.Icon); if (NPMenuItem.Checked) notifyIcon.ShowBalloonTip(2000, "New Process", - "The process " + item.Name + " (" + item.PID.ToString() + + "The process " + item.Name + " (" + item.Pid.ToString() + ") was started" + ((parentText != "") ? " by " + - parent.Name + " (PID " + parent.PID.ToString() + ")" : "") + ".", ToolTipIcon.Info); + parent.Name + " (PID " + parent.Pid.ToString() + ")" : "") + ".", ToolTipIcon.Info); } public void processP_DictionaryRemoved(ProcessItem item) { - this.QueueMessage("Terminated Process: " + item.Name + " (PID " + item.PID.ToString() + ")", null); + this.QueueMessage("Terminated Process: " + item.Name + " (PID " + item.Pid.ToString() + ")", null); - if (processServices.ContainsKey(item.PID)) - processServices.Remove(item.PID); + if (processServices.ContainsKey(item.Pid)) + processServices.Remove(item.Pid); if (TPMenuItem.Checked) notifyIcon.ShowBalloonTip(2000, "Terminated Process", - "The process " + item.Name + " (" + item.PID.ToString() + ") was terminated.", ToolTipIcon.Info); + "The process " + item.Name + " (" + item.Pid.ToString() + ") was terminated.", ToolTipIcon.Info); } private void serviceP_Updated() diff --git a/trunk/ProcessHacker/Forms/ProcessWindow.cs b/trunk/ProcessHacker/Forms/ProcessWindow.cs index 350a0ae6b..170e79658 100644 --- a/trunk/ProcessHacker/Forms/ProcessWindow.cs +++ b/trunk/ProcessHacker/Forms/ProcessWindow.cs @@ -55,7 +55,7 @@ namespace ProcessHacker InitializeComponent(); _processItem = process; - _pid = process.PID; + _pid = process.Pid; this.Text = process.Name + " (PID " + _pid.ToString() + ")"; @@ -844,7 +844,7 @@ namespace ProcessHacker private void buttonTerminate_Click(object sender, EventArgs e) { - ProcessActions.Terminate(this, new int[] { _processItem.PID }, new string[] { _processItem.Name }, true); + ProcessActions.Terminate(this, new int[] { _processItem.Pid }, new string[] { _processItem.Name }, true); } private void buttonEditDEP_Click(object sender, EventArgs e) diff --git a/trunk/ProcessHacker/Program/NProcessHacker.cs b/trunk/ProcessHacker/Program/NProcessHacker.cs index 0c6c8b9af..693506bcf 100644 --- a/trunk/ProcessHacker/Program/NProcessHacker.cs +++ b/trunk/ProcessHacker/Program/NProcessHacker.cs @@ -29,7 +29,43 @@ namespace ProcessHacker { public class NProcessHacker { + public enum WS_INFORMATION_CLASS + { + WsCount = 0, + WsPrivateCount, + WsSharedCount, + WsShareableCount, + WsAllCounts + } + + [StructLayout(LayoutKind.Sequential)] + public struct WS_ALL_COUNTS + { + public int Count; + public int PrivateCount; + public int SharedCount; + public int ShareableCount; + } + [DllImport("nprocesshacker.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public static extern Win32.VerifyResult PhvVerifyFile(string FileName); + + [DllImport("nprocesshacker.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)] + public static extern int PhpQueryProcessWs( + int ProcessHandle, + WS_INFORMATION_CLASS WsInformationClass, + out int WsInformation, + int WsInformationLength, + out int ReturnLength + ); + + [DllImport("nprocesshacker.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)] + public static extern int PhpQueryProcessWs( + int ProcessHandle, + WS_INFORMATION_CLASS WsInformationClass, + out WS_ALL_COUNTS WsInformation, + int WsInformationLength, + out int ReturnLength + ); } } diff --git a/trunk/ProcessHacker/Program/Program.cs b/trunk/ProcessHacker/Program/Program.cs index 07621a8fe..237ac51a0 100644 --- a/trunk/ProcessHacker/Program/Program.cs +++ b/trunk/ProcessHacker/Program/Program.cs @@ -911,9 +911,9 @@ namespace ProcessHacker { ProcessWindow pw = null; - if (PWindows.ContainsKey(process.PID)) + if (PWindows.ContainsKey(process.Pid)) { - pw = PWindows[process.PID]; + pw = PWindows[process.Pid]; pw.Invoke(action, pw); @@ -935,13 +935,13 @@ namespace ProcessHacker catch { } - Program.PThreads.Remove(process.PID); + Program.PThreads.Remove(process.Pid); })); t.SetApartmentState(ApartmentState.STA); t.Start(); - Program.PThreads.Add(process.PID, t); + Program.PThreads.Add(process.Pid, t); } else { diff --git a/trunk/ProcessHacker/Providers/ProcessSystemProvider.cs b/trunk/ProcessHacker/Providers/ProcessSystemProvider.cs index e01f73b15..dbd9e1ce1 100644 --- a/trunk/ProcessHacker/Providers/ProcessSystemProvider.cs +++ b/trunk/ProcessHacker/Providers/ProcessSystemProvider.cs @@ -43,7 +43,7 @@ namespace ProcessHacker return base.MemberwiseClone(); } - public int PID; + public int Pid; public Icon Icon; public string CmdLine; @@ -542,7 +542,7 @@ namespace ProcessHacker catch { } } - item.PID = pid; + item.Pid = pid; item.Process = processInfo; item.SessionId = processInfo.SessionId; item.Threads = procs[pid].Threads;