* (winpids::add): Make sure to store always a Windows PID in

pidlist, even if pid is a Cygwin PID.
	(winpids::enum_processes): Fetch Cygwin processes from listing of
	shared cygwin object dir in the native NT namespace.  Only if winpid
	is true, fetch Windows processes using an additional call to
	NtQuerySystemInformation.
This commit is contained in:
Corinna Vinschen 2011-08-11 07:28:42 +00:00
parent 56a85b9cea
commit 3b7cd74bfd
2 changed files with 77 additions and 25 deletions

View File

@ -1,3 +1,12 @@
2011-08-11 Corinna Vinschen <corinna@vinschen.de>
* (winpids::add): Make sure to store always a Windows PID in
pidlist, even if pid is a Cygwin PID.
(winpids::enum_processes): Fetch Cygwin processes from listing of
shared cygwin object dir in the native NT namespace. Only if winpid
is true, fetch Windows processes using an additional call to
NtQuerySystemInformation.
2011-08-10 Corinna Vinschen <corinna@vinschen.de> 2011-08-10 Corinna Vinschen <corinna@vinschen.de>
* fhandler_process.cc (format_process_status): Always print process name * fhandler_process.cc (format_process_status): Always print process name

View File

@ -1212,16 +1212,48 @@ out:
} }
} }
if (p || winpid) if (p || winpid)
pidlist[nelem++] = pid; pidlist[nelem++] = !p ? pid : p->dwProcessId;
} }
DWORD DWORD
winpids::enum_processes (bool winpid) winpids::enum_processes (bool winpid)
{ {
DWORD nelem = 0;
DWORD cygwin_pid_nelem = 0;
NTSTATUS status;
ULONG context;
struct fdbi
{
DIRECTORY_BASIC_INFORMATION dbi;
WCHAR buf[2][NAME_MAX + 1];
} f;
HANDLE dir = get_shared_parent_dir ();
BOOLEAN restart = TRUE;
do
{
status = NtQueryDirectoryObject (dir, &f, sizeof f, TRUE, restart,
&context, NULL);
if (NT_SUCCESS (status))
{
restart = FALSE;
f.dbi.ObjectName.Buffer[f.dbi.ObjectName.Length / sizeof (WCHAR)]
= L'\0';
if (wcsncmp (f.dbi.ObjectName.Buffer, L"cygpid.", 7) == 0)
{
DWORD pid = wcstoul (f.dbi.ObjectName.Buffer + 7, NULL, 10);
add (nelem, false, pid);
}
}
}
while (NT_SUCCESS (status));
cygwin_pid_nelem = nelem;
if (winpid)
{
static DWORD szprocs; static DWORD szprocs;
static SYSTEM_PROCESSES *procs; static SYSTEM_PROCESSES *procs;
DWORD nelem = 0;
if (!szprocs) if (!szprocs)
procs = (SYSTEM_PROCESSES *) malloc (sizeof (*procs) + (szprocs = 200 * sizeof (*procs))); procs = (SYSTEM_PROCESSES *) malloc (sizeof (*procs) + (szprocs = 200 * sizeof (*procs)));
@ -1246,11 +1278,22 @@ winpids::enum_processes (bool winpid)
for (;;) for (;;)
{ {
if (px->ProcessId) if (px->ProcessId)
add (nelem, winpid, px->ProcessId); {
bool do_add = true;
for (unsigned i = 0; i < cygwin_pid_nelem; ++i)
if (pidlist[i] == px->ProcessId)
{
do_add = false;
break;
}
if (do_add)
add (nelem, true, px->ProcessId);
}
if (!px->NextEntryDelta) if (!px->NextEntryDelta)
break; break;
px = (SYSTEM_PROCESSES *) ((char *) px + px->NextEntryDelta); px = (SYSTEM_PROCESSES *) ((char *) px + px->NextEntryDelta);
} }
}
return nelem; return nelem;
} }