ReactOS 0.4.15-dev-8428-g6910fa6
tlist.c
Go to the documentation of this file.
1/*
2 * ReactOS Project
3 * TList
4 *
5 * Copyright (c) 2000,2001 Emanuele Aliberti
6 */
7#include <reactos/buildno.h>
8#define WIN32_NO_STATUS
9#include <windows.h>
10#define NTOS_MODE_USER
11#include <ndk/ntndk.h>
12
13#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
16#include <ctype.h>
17
18#include <epsapi/epsapi.h>
19#include <getopt.h>
20
21#ifndef PAGE_SIZE
22#define PAGE_SIZE 4096
23#endif
24
25#define ALREADY_PROCESSED ((DWORD)-1)
26
28{
29 L"Initialized",
30 L"Ready",
31 L"Running",
32 L"Standby",
33 L"Terminated",
34 L"Wait",
35 L"Transition",
36 L"Unknown",
37 NULL
38};
39
41{
42 void * pBuf = NULL;
43 NTSTATUS nErrCode;
44
46 (
48 &pBuf,
49 0,
50 &size,
53 );
54
55 if(NT_SUCCESS(nErrCode)) return pBuf;
56 else return NULL;
57}
58
59void PsaiFree(void *ptr)
60{
61 SIZE_T nSize = 0;
62
64}
65
67{
68 printf ("ReactOS "KERNEL_VERSION_STR" T(ask)List\n");
69 printf ("Copyright (c) 2000,2001 Emanuele Aliberti\n\n");
70 return EXIT_SUCCESS;
71}
72
73int WINAPI PrintSynopsys (int nRetVal)
74{
75 PrintBanner ();
76 printf ("Usage: tlist [-t | PID | -l]\n\n"
77 " -t print the task list tree\n"
78 " PID print module information for this ID\n"
79 " -l print license information\n");
80 return nRetVal;
81}
82
84{
85 PrintBanner ();
86 printf (
87"This program is free software; you can redistribute it and/or modify\n"
88"it under the terms of the GNU General Public License as published by\n"
89"the Free Software Foundation; either version 2 of the License, or\n"
90"(at your option) any later version.\n\n");
91 printf (
92"This program is distributed in the hope that it will be useful,\n"
93"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
94"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
95"GNU General Public License for more details.\n\n");
96 printf (
97"You should have received a copy of the GNU General Public License\n"
98"along with this program; if not, write to the Free Software\n"
99"Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\n");
100 return EXIT_SUCCESS;
101}
102
104{
105 /* TODO: implement it */
106 return TRUE;
107}
108
109int WINAPI
111 HANDLE Pid,
113 )
114{
115 LONG Count = 0;
116
117 if (NULL == pInfo) return 0;
118 do {
119
121 {
122 if ((Pid != (HANDLE)pInfo->UniqueProcessId) && (Pid == (HANDLE)pInfo->InheritedFromUniqueProcessId))
123 {
124 ++ Count;
125 }
126 }
127 pInfo = (PSYSTEM_PROCESS_INFORMATION)((PBYTE)pInfo + pInfo->NextEntryOffset);
128
129 } while (0 != pInfo->NextEntryOffset);
130
131 return Count;
132}
133
134
138 LPWSTR * Module,
139 LPWSTR * Title
140 )
141{
142 *Module = (pInfo->ImageName.Length ? pInfo->ImageName.Buffer : L"System process");
143 *Title = L""; /* TODO: check if the process has any window */
144 return TRUE;
145}
146
149 LONG Depth
150 )
151{
152 INT d = 0;
153 LPWSTR Module = L"";
154 LPWSTR Title = L"";
155
156 for (d = 0; d < Depth; d ++) printf (" ");
157 GetProcessInfo (pInfo, & Module, & Title);
158 wprintf (
159 L"%s (%d, %d) %s\n",
160 Module,
163 Title
164 );
165 return EXIT_SUCCESS;
166}
167
168int WINAPI
172 LONG Depth
173 )
174{
175 HANDLE Pid = 0;
176
177 if (NULL == pInfo) return EXIT_FAILURE;
178 /* Print current pInfo process */
179 PrintProcessInfoDepth (pInfo, Depth ++);
181 /* Save current process' PID */
182 Pid = pInfo->UniqueProcessId;
183 /* Scan and print possible children */
184 do {
185
187 {
188 if (Pid == pInfo->InheritedFromUniqueProcessId)
189 {
190 if (ProcessHasDescendants (Pid, pInfoBase))
191 {
193 pInfo,
194 pInfoBase,
195 Depth
196 );
197 }
198 else
199 {
202 }
203 }
204 }
205 pInfo = (PSYSTEM_PROCESS_INFORMATION)((PBYTE)pInfo + pInfo->NextEntryOffset);
206
207 } while (0 != pInfo->NextEntryOffset);
208
209 return EXIT_SUCCESS;
210}
211
212int WINAPI PrintProcessList (BOOL DisplayTree)
213{
216 LPWSTR Module = L"";
217 LPWSTR Title = L"";
218
220 return EXIT_FAILURE;
221
222 pInfo = PsaWalkFirstProcess(pInfoBase);
223
224 while (pInfo)
225 {
226 if (FALSE == DisplayTree)
227 {
228 GetProcessInfo (pInfo, & Module, & Title);
229 wprintf (
230 L"%4d %-16s %s (%04d)\n",
232 Module,
233 Title,
235 );
236 }
237 else
238 {
240 {
241 PrintProcessAndDescendants (pInfo, pInfoBase, 0);
242 }
243 }
244
245 pInfo = PsaWalkNextProcess(pInfo);
246 }
247
248 PsaFreeCapture(pInfoBase);
249
250 return EXIT_SUCCESS;
251}
252
253
255{
256 ULONG i = 0;
259 OBJECT_ATTRIBUTES Oa = {0};
260 PVOID Win32StartAddress = NULL;
261 THREAD_BASIC_INFORMATION tInfo = {0};
264
265 if (NULL == pInfo) return EXIT_FAILURE;
266
267 CurThread = PsaWalkFirstThread(pInfo);
268
269 wprintf (L" NumberOfThreads: %d\n", pInfo->NumberOfThreads);
270
271 for (i = 0; i < pInfo->NumberOfThreads; i ++, CurThread = PsaWalkNextThread(CurThread))
272 {
274 & hThread,
276 & Oa,
277 & CurThread->ClientId
278 );
279 if (!NT_SUCCESS(Status))
280 {
281 continue;
282 }
283
285 hThread,
287 (PVOID) & tInfo,
288 sizeof tInfo,
290 );
291 if (!NT_SUCCESS(Status))
292 {
294 continue;
295 }
296
298 hThread,
300 (PVOID) & Win32StartAddress,
301 sizeof Win32StartAddress,
303 );
304 if (!NT_SUCCESS(Status))
305 {
307 continue;
308 }
309
311
312 /* Now print the collected information */
313 wprintf (L" %4d Win32StartAddr:0x%p LastErr:0x%08x State:%s\n",
315 Win32StartAddress,
316 0 /* FIXME: ((PTEB) tInfo.TebBaseAddress)->LastErrorValue */,
317 ThreadStateName[CurThread->ThreadState]
318 );
319 }
320 return EXIT_SUCCESS;
321}
322
324{
325 /* TODO */
326 return EXIT_SUCCESS;
327}
328
332 HANDLE Pid
333 )
334{
335 if (NULL == pInfoBase) return NULL;
336
337 pInfoBase = PsaWalkFirstProcess(pInfoBase);
338
339 while(pInfoBase)
340 {
341 if (Pid == pInfoBase->UniqueProcessId)
342 {
343 return pInfoBase;
344 }
345
346 pInfoBase = PsaWalkNextProcess(pInfoBase);
347 }
348
349 return NULL;
350}
351
352int WINAPI PrintProcess (char * PidStr)
353{
354 NTSTATUS Status = 0;
355 HANDLE hProcess = 0;
356 OBJECT_ATTRIBUTES Oa = {0};
357 CLIENT_ID ClientId = {0, 0};
358
359
361
362 if (FALSE == AcquirePrivileges ())
363 {
364 return EXIT_FAILURE;
365 }
366
368 & hProcess,
370 & Oa,
371 & ClientId
372 );
373 if (NT_SUCCESS(Status))
374 {
377 VM_COUNTERS PsVm;
380 LPWSTR Module = L"";
381 LPWSTR Title = L"";
382
384 hProcess,
386 & PsBasic,
387 sizeof (PsBasic),
389 );
390 if (!NT_SUCCESS(Status))
391 {
392 return EXIT_FAILURE;
393 }
395 hProcess,
397 & PsVm,
398 sizeof (PsVm),
400 );
401 if (!NT_SUCCESS(Status))
402 {
403 return EXIT_FAILURE;
404 }
405
406 if (!NT_SUCCESS(PsaCaptureProcessesAndThreads (&pInfoBase)))
407 return EXIT_FAILURE;
408
409 pInfo = GetProcessInfoPid (pInfoBase, ClientId.UniqueProcess);
410 if (NULL == pInfo) return EXIT_FAILURE;
411
412 GetProcessInfo (pInfo, & Module, & Title);
413
414 wprintf (L"%4d %s\n", HandleToUlong(ClientId.UniqueProcess), Module);
415#if 0
416 printf (" CWD: %s\n", ""); /* it won't appear if empty */
417 printf (" CmdLine: %s\n", ""); /* it won't appear if empty */
418#endif
419 printf (" VirtualSize: %5ld kb PeakVirtualSize: %5ld kb\n",
420 ((LONG) PsVm.VirtualSize / 1024),
421 ((LONG) PsVm.PeakVirtualSize / 1024)
422 );
423 printf (" WorkingSetSize: %5ld kb PeakWorkingSetSize: %5ld kb\n",
424 ((LONG) PsVm.WorkingSetSize / 1024),
425 ((LONG) PsVm.PeakWorkingSetSize / 1024)
426 );
427
428 PrintThreads (pInfo);
429
430 PrintModules ();
431
432 PsaFreeCapture(pInfoBase);
433
435
436 return EXIT_SUCCESS;
437 }
438 return EXIT_FAILURE;
439}
440
441
442int main (int argc, char * argv [])
443{
444 int c;
445
446 if(1 == argc) return PrintProcessList(FALSE);
447
448 while((c = getopt(argc, argv, "tl")) != -1)
449 {
450 switch(c)
451 {
452 case 't': return PrintProcessList(TRUE);
453 case 'l': return PrintLicense();
454 default: return PrintSynopsys(EXIT_FAILURE);
455 }
456 }
457
458 if(isdigit(argv[optind][0]))
459 return PrintProcess (argv[1]);
460
462}
463
464/* EOF */
static int argc
Definition: ServiceArgs.c:12
void PrintBanner(void)
Definition: Unfrag.cpp:85
#define isdigit(c)
Definition: acclib.h:68
LONG NTSTATUS
Definition: precomp.h:26
int getopt(int nargc, char *const *nargv, const char *ostr)
Definition: getopt.c:55
int optind
Definition: getopt.c:47
#define UlongToHandle(ul)
Definition: basetsd.h:97
#define HandleToUlong(h)
Definition: basetsd.h:79
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
static const WCHAR Title[]
Definition: oid.c:1259
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
@ ThreadQuerySetWin32StartAddress
Definition: compat.h:944
@ ThreadBasicInformation
Definition: compat.h:935
int main()
Definition: test.c:6
IN CINT OUT PVOID IN ULONG OUT PULONG ReturnLength
Definition: dumpinfo.c:43
unsigned int BOOL
Definition: ntddk_ex.h:94
#define printf
Definition: freeldr.h:97
Status
Definition: gdiplustypes.h:25
GLsizeiptr size
Definition: glext.h:5919
const GLubyte * c
Definition: glext.h:8905
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Check_return_ long __cdecl atol(_In_z_ const char *_Str)
#define PROCESS_QUERY_INFORMATION
Definition: pstypes.h:166
#define THREAD_QUERY_INFORMATION
Definition: pstypes.h:149
@ ProcessBasicInformation
Definition: winternl.h:394
@ ProcessVmCounters
Definition: winternl.h:859
#define EXIT_FAILURE
Definition: jerror.c:33
#define d
Definition: ke_i.h:81
#define c
Definition: ke_i.h:80
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:71
VOID NTAPI PsaFreeCapture(IN PVOID Capture)
Definition: processes.c:188
PSYSTEM_THREADS FASTCALL PsaWalkNextThread(IN PSYSTEM_THREADS CurrentThread)
PSYSTEM_PROCESSES FASTCALL PsaWalkNextProcess(IN PSYSTEM_PROCESSES CurrentProcess)
NTSTATUS NTAPI PsaCaptureProcessesAndThreads(OUT PSYSTEM_PROCESSES *ProcessesAndThreads)
PSYSTEM_THREADS FASTCALL PsaWalkFirstThread(IN PSYSTEM_PROCESSES CurrentProcess)
PSYSTEM_PROCESSES FASTCALL PsaWalkFirstProcess(IN PSYSTEM_PROCESSES ProcessesAndThreads)
static PVOID ptr
Definition: dispmode.c:27
#define argv
Definition: mplay32.c:18
struct _SYSTEM_PROCESS_INFORMATION * PSYSTEM_PROCESS_INFORMATION
HANDLE hThread
Definition: wizard.c:28
int Count
Definition: noreturn.cpp:7
#define PAGE_READWRITE
Definition: nt_native.h:1304
#define NtCurrentProcess()
Definition: nt_native.h:1657
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3402
#define MEM_RELEASE
Definition: nt_native.h:1316
#define MEM_COMMIT
Definition: nt_native.h:1313
NTSTATUS NTAPI NtFreeVirtualMemory(IN HANDLE ProcessHandle, IN PVOID *UBaseAddress, IN PSIZE_T URegionSize, IN ULONG FreeType)
Definition: virtual.c:5230
NTSTATUS NTAPI NtAllocateVirtualMemory(IN HANDLE ProcessHandle, IN OUT PVOID *UBaseAddress, IN ULONG_PTR ZeroBits, IN OUT PSIZE_T URegionSize, IN ULONG AllocationType, IN ULONG Protect)
Definition: virtual.c:4492
NTSTATUS NTAPI NtOpenProcess(OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId)
Definition: process.c:1440
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: query.c:2624
NTSTATUS NTAPI NtQueryInformationProcess(_In_ HANDLE ProcessHandle, _In_ PROCESSINFOCLASS ProcessInformationClass, _Out_ PVOID ProcessInformation, _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength)
Definition: query.c:59
NTSTATUS NTAPI NtOpenThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL)
Definition: thread.c:1013
#define L(x)
Definition: ntvdm.h:50
BYTE * PBYTE
Definition: pedump.c:66
long LONG
Definition: pedump.c:60
#define EXIT_SUCCESS
Definition: rdjpgcom.c:55
#define STATUS_SUCCESS
Definition: shellext.h:65
HANDLE UniqueThread
Definition: compat.h:826
HANDLE UniqueProcess
Definition: compat.h:825
UNICODE_STRING ImageName
Definition: extypes.h:902
HANDLE InheritedFromUniqueProcessId
Definition: extypes.h:905
SIZE_T PeakWorkingSetSize
Definition: winternl.h:1608
SIZE_T VirtualSize
Definition: winternl.h:1606
SIZE_T PeakVirtualSize
Definition: winternl.h:1605
SIZE_T WorkingSetSize
Definition: winternl.h:1609
void PsaiFree(void *ptr)
Definition: tlist.c:59
void * PsaiMalloc(SIZE_T size)
Definition: tlist.c:40
BOOL WINAPI AcquirePrivileges(VOID)
Definition: tlist.c:103
#define ALREADY_PROCESSED
Definition: tlist.c:25
int WINAPI PrintModules(VOID)
Definition: tlist.c:323
int WINAPI PrintProcessInfoDepth(PSYSTEM_PROCESS_INFORMATION pInfo, LONG Depth)
Definition: tlist.c:147
int WINAPI PrintProcess(char *PidStr)
Definition: tlist.c:352
BOOL WINAPI GetProcessInfo(PSYSTEM_PROCESS_INFORMATION pInfo, LPWSTR *Module, LPWSTR *Title)
Definition: tlist.c:136
int WINAPI PrintSynopsys(int nRetVal)
Definition: tlist.c:73
PSYSTEM_PROCESS_INFORMATION WINAPI GetProcessInfoPid(PSYSTEM_PROCESS_INFORMATION pInfoBase, HANDLE Pid)
Definition: tlist.c:330
int WINAPI ProcessHasDescendants(HANDLE Pid, PSYSTEM_PROCESS_INFORMATION pInfo)
Definition: tlist.c:110
LPWSTR ThreadStateName[]
Definition: tlist.c:27
int WINAPI PrintThreads(PSYSTEM_PROCESS_INFORMATION pInfo)
Definition: tlist.c:254
int WINAPI PrintProcessAndDescendants(PSYSTEM_PROCESS_INFORMATION pInfo, PSYSTEM_PROCESS_INFORMATION pInfoBase, LONG Depth)
Definition: tlist.c:169
int WINAPI PrintLicense(VOID)
Definition: tlist.c:83
int WINAPI PrintProcessList(BOOL DisplayTree)
Definition: tlist.c:212
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
#define wprintf(...)
Definition: whoami.c:18
*nSize LPSTR _Inout_ LPDWORD nSize
Definition: winbase.h:2084
#define WINAPI
Definition: msvc.h:6
_In_opt_ PALLOCATE_FUNCTION _In_opt_ PFREE_FUNCTION _In_ ULONG _In_ SIZE_T _In_ ULONG _In_ USHORT Depth
Definition: exfuncs.h:819
_Out_ PCLIENT_ID ClientId
Definition: kefuncs.h:1151
WCHAR * LPWSTR
Definition: xmlstorage.h:184