* [PATCH] Cygwin: pipe: Use NtQuerySystemInformation() instead of EnumProcesses().
@ 2021-10-19 8:40 Takashi Yano
2021-10-19 11:07 ` Corinna Vinschen
0 siblings, 1 reply; 2+ messages in thread
From: Takashi Yano @ 2021-10-19 8:40 UTC (permalink / raw)
To: cygwin-patches
- Using EnumProcess() breaks Windows Vista compatibility. This patch
replaces EnumProcesses() with NtQuerySystemInformation().
Addresses:
https://cygwin.com/pipermail/cygwin-developers/2021-October/012422.html
---
winsup/cygwin/fhandler_pipe.cc | 50 +++++++++++++++++++++++-----------
1 file changed, 34 insertions(+), 16 deletions(-)
diff --git a/winsup/cygwin/fhandler_pipe.cc b/winsup/cygwin/fhandler_pipe.cc
index dd8b4f317..63e432160 100644
--- a/winsup/cygwin/fhandler_pipe.cc
+++ b/winsup/cygwin/fhandler_pipe.cc
@@ -20,7 +20,6 @@ details. */
#include "pinfo.h"
#include "shared_info.h"
#include "tls_pbuf.h"
-#include <psapi.h>
/* This is only to be used for writing. When reading,
STATUS_PIPE_EMPTY simply means there's no data to be read. */
@@ -1190,27 +1189,47 @@ HANDLE
fhandler_pipe::get_query_hdl_per_process (WCHAR *name,
OBJECT_NAME_INFORMATION *ntfn)
{
+ NTSTATUS status;
ULONG len;
- BOOL res;
DWORD n_process = 256;
- DWORD *proc_pids;
+ PSYSTEM_PROCESS_INFORMATION spi;
do
{ /* Enumerate processes */
- DWORD nbytes = n_process * sizeof (DWORD);
- proc_pids = (DWORD *) HeapAlloc (GetProcessHeap (), 0, nbytes);
- if (!proc_pids)
+ DWORD nbytes = n_process * sizeof (SYSTEM_PROCESS_INFORMATION);
+ spi = (PSYSTEM_PROCESS_INFORMATION) HeapAlloc (GetProcessHeap (),
+ 0, nbytes);
+ if (!spi)
return NULL;
- res = EnumProcesses (proc_pids, nbytes, &len);
- if (res && len < nbytes)
+ status = NtQuerySystemInformation (SystemProcessInformation,
+ spi, nbytes, &len);
+ if (NT_SUCCESS (status))
break;
- res = FALSE;
- HeapFree (GetProcessHeap (), 0, proc_pids);
+ HeapFree (GetProcessHeap (), 0, spi);
n_process *= 2;
}
- while (n_process < (1L<<20));
- if (!res)
+ while (n_process < (1L<<20) && status == STATUS_INFO_LENGTH_MISMATCH);
+ if (!NT_SUCCESS (status))
return NULL;
- n_process = len / sizeof (DWORD);
+
+ /* In most cases, it is faster to check the processes in reverse order.
+ To do this, store PIDs into an array. */
+ DWORD *proc_pids = (DWORD *) HeapAlloc (GetProcessHeap (), 0,
+ n_process * sizeof (DWORD));
+ if (!proc_pids)
+ {
+ HeapFree (GetProcessHeap (), 0, spi);
+ return NULL;
+ }
+ PSYSTEM_PROCESS_INFORMATION p = spi;
+ n_process = 0;
+ while (true)
+ {
+ proc_pids[n_process++] = (DWORD)(intptr_t) p->UniqueProcessId;
+ if (!p->NextEntryOffset)
+ break;
+ p = (PSYSTEM_PROCESS_INFORMATION) ((char *) p + p->NextEntryOffset);
+ }
+ HeapFree (GetProcessHeap (), 0, spi);
for (LONG i = (LONG) n_process - 1; i >= 0; i--)
{
@@ -1221,7 +1240,6 @@ fhandler_pipe::get_query_hdl_per_process (WCHAR *name,
continue;
/* Retrieve process handles */
- NTSTATUS status;
DWORD n_handle = 256;
PPROCESS_HANDLE_SNAPSHOT_INFORMATION phi;
do
@@ -1255,8 +1273,8 @@ fhandler_pipe::get_query_hdl_per_process (WCHAR *name,
/* Retrieve handle */
HANDLE h = (HANDLE)(intptr_t) phi->Handles[j].HandleValue;
- res = DuplicateHandle (proc, h, GetCurrentProcess (), &h,
- FILE_READ_DATA, 0, 0);
+ BOOL res = DuplicateHandle (proc, h, GetCurrentProcess (), &h,
+ FILE_READ_DATA, 0, 0);
if (!res)
continue;
--
2.33.0
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Cygwin: pipe: Use NtQuerySystemInformation() instead of EnumProcesses().
2021-10-19 8:40 [PATCH] Cygwin: pipe: Use NtQuerySystemInformation() instead of EnumProcesses() Takashi Yano
@ 2021-10-19 11:07 ` Corinna Vinschen
0 siblings, 0 replies; 2+ messages in thread
From: Corinna Vinschen @ 2021-10-19 11:07 UTC (permalink / raw)
To: cygwin-patches
On Oct 19 17:40, Takashi Yano wrote:
> - Using EnumProcess() breaks Windows Vista compatibility. This patch
> replaces EnumProcesses() with NtQuerySystemInformation().
>
> Addresses:
> https://cygwin.com/pipermail/cygwin-developers/2021-October/012422.html
> ---
> winsup/cygwin/fhandler_pipe.cc | 50 +++++++++++++++++++++++-----------
> 1 file changed, 34 insertions(+), 16 deletions(-)
Pushed.
Thanks,
Corinna
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-10-19 11:07 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-19 8:40 [PATCH] Cygwin: pipe: Use NtQuerySystemInformation() instead of EnumProcesses() Takashi Yano
2021-10-19 11:07 ` Corinna Vinschen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).