https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=1def2148d25fec8a150e5eac873d8ef4a0c71a50

commit 1def2148d25fec8a150e5eac873d8ef4a0c71a50
Author: Corinna Vinschen <cori...@vinschen.de>
Date:   Tue Mar 12 21:21:13 2019 +0100

    Cygwin: ps: simplify code
    
    Always use NtQuerySystemInformation(SystemProcessIdInformation).
    This drops two code paths calling NtQueryInformationProcess or
    GetModuleFileNameExW and only requires to open the process
    to fetch system time info.
    
    Signed-off-by: Corinna Vinschen <cori...@vinschen.de>

Diff:
---
 winsup/utils/ps.cc | 65 +++++++++++++++---------------------------------------
 1 file changed, 18 insertions(+), 47 deletions(-)

diff --git a/winsup/utils/ps.cc b/winsup/utils/ps.cc
index c655d74..4fce3e0 100644
--- a/winsup/utils/ps.cc
+++ b/winsup/utils/ps.cc
@@ -155,7 +155,6 @@ main (int argc, char *argv[])
   int aflag, lflag, fflag, sflag, proc_id;
   uid_t uid;
   bool found_proc_id = true;
-  DWORD proc_access = PROCESS_QUERY_LIMITED_INFORMATION;
   cygwin_getinfo_types query = CW_GETPINFO;
   const char *dtitle = "    PID  TTY        STIME COMMAND\n";
   const char *dfmt   = "%7d%4s%10s %s\n";
@@ -257,12 +256,6 @@ main (int argc, char *argv[])
        }
 
       drive_map = (void *) cygwin_internal (CW_ALLOC_DRIVE_MAP);
-      /* Check old Cygwin version. */
-      if (drive_map == (void *) -1)
-       drive_map = NULL;
-      /* Allow fallback to GetModuleFileNameEx. */
-      if (!drive_map)
-       proc_access = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ;
     }
 
   for (int pid = 0;
@@ -291,8 +284,6 @@ main (int argc, char *argv[])
       else if (p->process_state & PID_TTYOU)
        status = 'O';
 
-      /* Maximum possible path length under NT.  There's no official define
-        for that value. */
       if (p->ppid)
        {
          char *s;
@@ -309,49 +300,27 @@ main (int argc, char *argv[])
          HANDLE h;
          NTSTATUS status;
          wchar_t *win32path = NULL;
+         FILETIME ct, et, kt, ut;
 
-         h = OpenProcess (proc_access, FALSE, p->dwProcessId);
-         if (!h)
-           {
-             ucbuf.spii.ProcessId = (PVOID) (ULONG_PTR) p->dwProcessId;
-             ucbuf.spii.ImageName.Length = 0;
-             ucbuf.spii.ImageName.MaximumLength = NT_MAX_PATH * sizeof (WCHAR);
-             ucbuf.spii.ImageName.Buffer = ucbuf.buf;
-             status = NtQuerySystemInformation (SystemProcessIdInformation,
-                                                &ucbuf.spii, sizeof 
ucbuf.spii, NULL);
-             if (NT_SUCCESS (status))
-               {
-                 if (ucbuf.spii.ImageName.Length)
-                   ucbuf.spii.ImageName.Buffer[ucbuf.spii.ImageName.Length
-                                         / sizeof (WCHAR)] = L'\0';
-                 win32path = ucbuf.spii.ImageName.Buffer;
-               }
-           }
-         /* We use NtQueryInformationProcess in the first place, because
-            GetModuleFileNameEx does not work under WOW64 when trying
-            to fetch module names of 64 bit processes. */
-         else if (!(proc_access & PROCESS_VM_READ))
+         ucbuf.spii.ProcessId = (PVOID) (ULONG_PTR) p->dwProcessId;
+         ucbuf.spii.ImageName.Length = 0;
+         ucbuf.spii.ImageName.MaximumLength = NT_MAX_PATH * sizeof (WCHAR);
+         ucbuf.spii.ImageName.Buffer = ucbuf.buf;
+         status = NtQuerySystemInformation (SystemProcessIdInformation,
+                                            &ucbuf.spii, sizeof ucbuf.spii,
+                                            NULL);
+         if (NT_SUCCESS (status))
            {
-             status = NtQueryInformationProcess (h, ProcessImageFileName,
-                                                 &ucbuf.spii.ImageName,
-                                                 sizeof ucbuf - sizeof (PVOID),
-                                                 NULL);
-             if (NT_SUCCESS (status))
-               {
-                 if (ucbuf.spii.ImageName.Length)
-                   ucbuf.spii.ImageName.Buffer[ucbuf.spii.ImageName.Length / 
sizeof (WCHAR)] = L'\0';
-                 win32path = ucbuf.spii.ImageName.Buffer;
-               }
+             if (ucbuf.spii.ImageName.Length)
+               ucbuf.spii.ImageName.Buffer[ucbuf.spii.ImageName.Length
+                                     / sizeof (WCHAR)] = L'\0';
+             win32path = ucbuf.spii.ImageName.Buffer;
            }
-         else if (GetModuleFileNameExW (h, NULL, ucbuf.buf,
-                                        NT_MAX_PATH + 1))
-           win32path = ucbuf.buf;
          if (win32path)
            {
              /* Call CW_MAP_DRIVE_MAP to convert native NT device paths to
-                an ordinary Win32 path.  The returned pointer is a pointer
-                into the incoming buffer given as third argument.  It's
-                expected to be big enough. */
+                an ordinary Win32 path.  The returned pointer points into
+                the incoming buffer given as third argument. */
              if (win32path[0] == L'\\')
                win32path = (wchar_t *) cygwin_internal (CW_MAP_DRIVE_MAP,
                                                         drive_map, win32path);
@@ -359,7 +328,9 @@ main (int argc, char *argv[])
            }
          else
            strcpy (pname, p->dwProcessId == 4 ? "System" : "*** unknown ***");
-         FILETIME ct, et, kt, ut;
+
+         h = OpenProcess (PROCESS_QUERY_LIMITED_INFORMATION, FALSE,
+                          p->dwProcessId);
          if (h)
            {
              if (GetProcessTimes (h, &ct, &et, &kt, &ut))

Reply via email to