diff options
author | Jeremy Kloth <jeremy.kloth@gmail.com> | 2018-10-23 11:41:48 (GMT) |
---|---|---|
committer | Steve Dower <steve.dower@microsoft.com> | 2018-10-23 11:41:48 (GMT) |
commit | fa5329424f4206630c34f75629fa78738db647f0 (patch) | |
tree | 740348433474155b54fe663df9a58ed370387143 | |
parent | 4f399be0e70d8b5516b6213568b7665765bb3114 (diff) | |
download | cpython-fa5329424f4206630c34f75629fa78738db647f0.zip cpython-fa5329424f4206630c34f75629fa78738db647f0.tar.gz cpython-fa5329424f4206630c34f75629fa78738db647f0.tar.bz2 |
bpo-34980: P/Invoke QueryFullProcessImageName to get process names (GH-9901)
-rw-r--r-- | PCbuild/pyproject.props | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 7016130..6d36977 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -109,19 +109,34 @@ <FileName Required="true" /> </ParameterGroup> <Task> - <Code Type="Fragment" Language="cs"> + <Using Namespace="System.Diagnostics"/> + <Using Namespace="System.IO"/> + <Using Namespace="System.Runtime.InteropServices"/> + <Using Namespace="System.Text"/> + <Code Type="Method" Language="cs"> <![CDATA[ -string fullPath = System.IO.Path.GetFullPath(FileName); -Log.LogMessage("Looking for " + fullPath, MessageImportance.Normal); -foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses()) { - try { - Log.LogMessage("Found running process: " + p.MainModule.FileName, MessageImportance.Low); - if (fullPath.Equals(System.IO.Path.GetFullPath(p.MainModule.FileName), StringComparison.OrdinalIgnoreCase)) { - Log.LogMessage("Terminating " + p.MainModule.FileName, MessageImportance.High); - p.Kill(); +[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)] +public static extern bool QueryFullProcessImageName([In]IntPtr hProcess, [In]int dwFlags, + [Out]StringBuilder lpExeName, ref int lpdwSize); +public override bool Execute() { + string fullPath = Path.GetFullPath(FileName); + Log.LogMessage("Looking for " + fullPath, MessageImportance.Normal); + foreach (Process p in Process.GetProcesses()) { + try { + int pathLength = 32768; + StringBuilder pathBuilder = new StringBuilder(pathLength); + if (QueryFullProcessImageName(p.Handle, 0, pathBuilder, ref pathLength)) { + string exeName = Path.GetFullPath(pathBuilder.ToString()); + Log.LogMessage("Found running process: " + exeName, MessageImportance.Low); + if (fullPath.Equals(exeName, StringComparison.OrdinalIgnoreCase)) { + Log.LogMessage("Terminating " + exeName, MessageImportance.High); + p.Kill(); + } + } + } catch { } - } catch { } + return true; } ]]> </Code> |