-
Notifications
You must be signed in to change notification settings - Fork 7.7k
Adding Parent extended property to System.Diagnostics.Process #2850
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
e3564c7
Adding Parent extended property to System.Diagnostics.Process
fea2f00
Adding test for process parent.
17441c7
Changing implementation for unix to use sysctl call.
e51230f
replace tabs with spaces
lzybkr ee1cecb
add newline at eof
lzybkr File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
91 changes: 91 additions & 0 deletions
91
src/System.Management.Automation/engine/ProcessCodeMethods.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
using System; | ||
using System.Diagnostics; | ||
using System.Management.Automation; | ||
using System.Runtime.InteropServices; | ||
|
||
namespace Microsoft.PowerShell { | ||
/// <summary> | ||
/// Helper functions for process info | ||
/// </summary> | ||
public static class ProcessCodeMethods | ||
{ | ||
const int InvalidProcessId = -1; | ||
|
||
internal static Process GetParent(this Process process) | ||
{ | ||
try | ||
{ | ||
var pid = GetParentPid(process); | ||
if (pid == InvalidProcessId) | ||
{ | ||
return null; | ||
} | ||
var candidate = Process.GetProcessById(pid); | ||
|
||
// if the candidate was started later than process, the pid has been recycled | ||
return candidate.StartTime > process.StartTime ? null : candidate; | ||
} | ||
catch (Exception) | ||
{ | ||
return null; | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// CodeMethod for getting the parent process of a process | ||
/// </summary> | ||
8000 /// <param name="obj"></param> | ||
/// <returns>the parent process, or null if the parent is no longer running</returns> | ||
public static PSObject GetParentProcess(PSObject obj) | ||
{ | ||
var process = PSObject.Base(obj) as Process; | ||
var parent = process?.GetParent(); | ||
return parent != null ? ClrFacade.AddProcessProperties(false, parent) : null; | ||
} | ||
|
||
/// <summary> | ||
/// Returns the parent id of a process or -1 if it fails | ||
/// </summary> | ||
/// <param name="process"></param> | ||
/// <returns>the pid of the parent process</returns> | ||
#if UNIX | ||
internal static int GetParentPid(Process process) | ||
{ | ||
return Platform.NonWindowsGetProcessParentPid(process.Id); | ||
} | ||
#else | ||
internal static int GetParentPid(Process process) | ||
{ | ||
Diagnostics.Assert(process != null, "Ensure process is not null before calling"); | ||
PROCESS_BASIC_INFORMATION pbi; | ||
int size; | ||
#if CORECLR | ||
var res = NtQueryInformationProcess(process.SafeHandle.DangerousGetHandle(), 0, out pbi, Marshal.SizeOf<PROCESS_BASIC_INFORMATION>(), out size); | ||
#else | ||
var res = NtQueryInformationProcess(process.Handle, 0, out pbi, Marshal.SizeOf<PROCESS_BASIC_INFORMATION>(), out size); | ||
#endif | ||
return res != 0 ? InvalidProcessId : pbi.InheritedFromUniqueProcessId.ToInt32(); | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
struct PROCESS_BASIC_INFORMATION | ||
{ | ||
public IntPtr ExitStatus; | ||
public IntPtr PebBaseAddress; | ||
public IntPtr AffinityMask; | ||
public IntPtr BasePriority; | ||
public IntPtr UniqueProcessId; | ||
public IntPtr InheritedFromUniqueProcessId; | ||
} | ||
|
||
[DllImport("ntdll.dll", SetLastError = true)] | ||
static extern int NtQueryInformationProcess( | ||
IntPtr processHandle, | ||
int processInformationClass, | ||
out PROCESS_BASIC_INFORMATION processInformation, | ||
int processInformationLength, | ||
out int returnLength); | ||
#endif | ||
|
||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tested this out, looks good to me.