* (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:
parent
56a85b9cea
commit
3b7cd74bfd
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue