* (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,44 +1212,87 @@ 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)
|
||||||
{
|
{
|
||||||
static DWORD szprocs;
|
|
||||||
static SYSTEM_PROCESSES *procs;
|
|
||||||
|
|
||||||
DWORD nelem = 0;
|
DWORD nelem = 0;
|
||||||
if (!szprocs)
|
DWORD cygwin_pid_nelem = 0;
|
||||||
procs = (SYSTEM_PROCESSES *) malloc (sizeof (*procs) + (szprocs = 200 * sizeof (*procs)));
|
NTSTATUS status;
|
||||||
|
ULONG context;
|
||||||
NTSTATUS res;
|
struct fdbi
|
||||||
for (;;)
|
|
||||||
{
|
{
|
||||||
res = NtQuerySystemInformation (SystemProcessesAndThreadsInformation,
|
DIRECTORY_BASIC_INFORMATION dbi;
|
||||||
procs, szprocs, NULL);
|
WCHAR buf[2][NAME_MAX + 1];
|
||||||
if (res == 0)
|
} f;
|
||||||
break;
|
HANDLE dir = get_shared_parent_dir ();
|
||||||
|
BOOLEAN restart = TRUE;
|
||||||
|
|
||||||
if (res == STATUS_INFO_LENGTH_MISMATCH)
|
do
|
||||||
procs = (SYSTEM_PROCESSES *) realloc (procs, szprocs += 200 * sizeof (*procs));
|
{
|
||||||
else
|
status = NtQueryDirectoryObject (dir, &f, sizeof f, TRUE, restart,
|
||||||
|
&context, NULL);
|
||||||
|
if (NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
system_printf ("error %p reading system process information", res);
|
restart = FALSE;
|
||||||
return 0;
|
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;
|
||||||
|
|
||||||
SYSTEM_PROCESSES *px = procs;
|
if (winpid)
|
||||||
for (;;)
|
|
||||||
{
|
{
|
||||||
if (px->ProcessId)
|
static DWORD szprocs;
|
||||||
add (nelem, winpid, px->ProcessId);
|
static SYSTEM_PROCESSES *procs;
|
||||||
if (!px->NextEntryDelta)
|
|
||||||
break;
|
if (!szprocs)
|
||||||
px = (SYSTEM_PROCESSES *) ((char *) px + px->NextEntryDelta);
|
procs = (SYSTEM_PROCESSES *) malloc (sizeof (*procs) + (szprocs = 200 * sizeof (*procs)));
|
||||||
|
|
||||||
|
NTSTATUS res;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
res = NtQuerySystemInformation (SystemProcessesAndThreadsInformation,
|
||||||
|
procs, szprocs, NULL);
|
||||||
|
if (res == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (res == STATUS_INFO_LENGTH_MISMATCH)
|
||||||
|
procs = (SYSTEM_PROCESSES *) realloc (procs, szprocs += 200 * sizeof (*procs));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
system_printf ("error %p reading system process information", res);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SYSTEM_PROCESSES *px = procs;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (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)
|
||||||
|
break;
|
||||||
|
px = (SYSTEM_PROCESSES *) ((char *) px + px->NextEntryDelta);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nelem;
|
return nelem;
|
||||||
|
|
Loading…
Reference in New Issue