diff --git a/winsup/cygwin/fhandler_pipe.cc b/winsup/cygwin/fhandler_pipe.cc index 9392a28c1..83c09d7c6 100644 --- a/winsup/cygwin/fhandler_pipe.cc +++ b/winsup/cygwin/fhandler_pipe.cc @@ -1201,50 +1201,32 @@ fhandler_pipe::get_query_hdl_per_process (WCHAR *name, NTSTATUS status; ULONG len; DWORD n_process = 256; - PSYSTEM_PROCESS_INFORMATION spi; + FILE_PROCESS_IDS_USING_FILE_INFORMATION *fpiufi; do - { /* Enumerate processes */ - DWORD nbytes = n_process * sizeof (SYSTEM_PROCESS_INFORMATION); - spi = (PSYSTEM_PROCESS_INFORMATION) HeapAlloc (GetProcessHeap (), - 0, nbytes); - if (!spi) + { /* Enumerate processes having the pipe handle. */ + IO_STATUS_BLOCK io; + DWORD nbytes = n_process * sizeof (ULONG) + + sizeof (FILE_PROCESS_IDS_USING_FILE_INFORMATION); + fpiufi = (FILE_PROCESS_IDS_USING_FILE_INFORMATION *) + HeapAlloc (GetProcessHeap (), 0, nbytes); + if (!fpiufi) return NULL; - status = NtQuerySystemInformation (SystemProcessInformation, - spi, nbytes, &len); + status = NtQueryInformationFile (get_handle (), &io, fpiufi, nbytes, + FileProcessIdsUsingFileInformation); if (NT_SUCCESS (status)) break; - HeapFree (GetProcessHeap (), 0, spi); + HeapFree (GetProcessHeap (), 0, fpiufi); n_process *= 2; } while (n_process < (1L<<20) && status == STATUS_INFO_LENGTH_MISMATCH); if (!NT_SUCCESS (status)) return NULL; - /* 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--) + for (ULONG i = 0; i < fpiufi->NumberOfProcessIdsInList; i++) { HANDLE proc = OpenProcess (PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION, - 0, proc_pids[i]); + 0, fpiufi->ProcessIdList[i]); if (!proc) continue; @@ -1298,7 +1280,7 @@ fhandler_pipe::get_query_hdl_per_process (WCHAR *name, query_hdl_proc = proc; query_hdl_value = (HANDLE)(intptr_t) phi->Handles[j].HandleValue; HeapFree (GetProcessHeap (), 0, phi); - HeapFree (GetProcessHeap (), 0, proc_pids); + HeapFree (GetProcessHeap (), 0, fpiufi); return h; } close_handle: @@ -1308,7 +1290,7 @@ close_handle: close_proc: CloseHandle (proc); } - HeapFree (GetProcessHeap (), 0, proc_pids); + HeapFree (GetProcessHeap (), 0, fpiufi); return NULL; }