]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-34980: P/Invoke QueryFullProcessImageName to get process names (GH-9901)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 23 Oct 2018 12:07:35 +0000 (05:07 -0700)
committerGitHub <noreply@github.com>
Tue, 23 Oct 2018 12:07:35 +0000 (05:07 -0700)
(cherry picked from commit fa5329424f4206630c34f75629fa78738db647f0)

Co-authored-by: Jeremy Kloth <jeremy.kloth@gmail.com>
PCbuild/pyproject.props

index 9a096bca6bd0072e1b3582cbda3e403ef2ba16fa..1602ebf5ec973346e1a4515a87a47da4e5ba8be5 100644 (file)
       <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>