[TASKMGR]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 23 Nov 2014 20:10:15 +0000 (20:10 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 23 Nov 2014 20:10:15 +0000 (20:10 +0000)
- Show programs command line in taskmgr.
  Patch by Ismael Ferreras Morezuelas with minor modifications by me.
- int nMaxCount --> ULONG nMaxCount (that makes everything clearer and removes MSVC warnings).
CORE-5467 #resolve #comment Feature committed in revision 65469, cheers ;)

svn path=/trunk/; revision=65469

34 files changed:
reactos/base/applications/taskmgr/column.c
reactos/base/applications/taskmgr/column.h
reactos/base/applications/taskmgr/lang/bg-BG.rc
reactos/base/applications/taskmgr/lang/cs-CZ.rc
reactos/base/applications/taskmgr/lang/da-DK.rc
reactos/base/applications/taskmgr/lang/de-DE.rc
reactos/base/applications/taskmgr/lang/el-GR.rc
reactos/base/applications/taskmgr/lang/en-US.rc
reactos/base/applications/taskmgr/lang/es-ES.rc
reactos/base/applications/taskmgr/lang/fr-FR.rc
reactos/base/applications/taskmgr/lang/he-IL.rc
reactos/base/applications/taskmgr/lang/hu-HU.rc
reactos/base/applications/taskmgr/lang/id-ID.rc
reactos/base/applications/taskmgr/lang/it-IT.rc
reactos/base/applications/taskmgr/lang/ja-JP.rc
reactos/base/applications/taskmgr/lang/ko-KR.rc
reactos/base/applications/taskmgr/lang/nl-NL.rc
reactos/base/applications/taskmgr/lang/no-NO.rc
reactos/base/applications/taskmgr/lang/pl-PL.rc
reactos/base/applications/taskmgr/lang/pt-BR.rc
reactos/base/applications/taskmgr/lang/ro-RO.rc
reactos/base/applications/taskmgr/lang/ru-RU.rc
reactos/base/applications/taskmgr/lang/sk-SK.rc
reactos/base/applications/taskmgr/lang/sq-AL.rc
reactos/base/applications/taskmgr/lang/sv-SE.rc
reactos/base/applications/taskmgr/lang/tr-TR.rc
reactos/base/applications/taskmgr/lang/uk-UA.rc
reactos/base/applications/taskmgr/lang/zh-CN.rc
reactos/base/applications/taskmgr/lang/zh-TW.rc
reactos/base/applications/taskmgr/perfdata.c
reactos/base/applications/taskmgr/perfdata.h
reactos/base/applications/taskmgr/procpage.c
reactos/base/applications/taskmgr/resource.h
reactos/base/applications/taskmgr/taskmgr.c

index 093f783..71b8db3 100644 (file)
@@ -54,6 +54,7 @@ const PresetColumnEntry ColumnPresets[COLUMN_NMAX] = {
     DECLARE_COLUMN_PRESET(IOREADBYTES,       70, FALSE)
     DECLARE_COLUMN_PRESET(IOWRITEBYTES,      70, FALSE)
     DECLARE_COLUMN_PRESET(IOOTHERBYTES,      70, FALSE)
+    DECLARE_COLUMN_PRESET(COMMANDLINE,      450, FALSE)
 };
 
 static int          InsertColumn(int nCol, LPCWSTR lpszColumnHeading, int nFormat, int nWidth, int nSubItem);
index 9aeb3ec..a92efa3 100644 (file)
@@ -47,7 +47,8 @@
 #define COLUMN_IOREADBYTES          22
 #define COLUMN_IOWRITEBYTES         23
 #define COLUMN_IOOTHERBYTES         24
-#define COLUMN_NMAX                 25
+#define COLUMN_COMMANDLINE          25
+#define COLUMN_NMAX                 26
 
 /*
  * temporary fix:
@@ -104,6 +105,7 @@ extern const PresetColumnEntry ColumnPresets[COLUMN_NMAX];
 #define Column_IOWriteBytes         Columns[COLUMN_IOWRITEBYTES]
 #define Column_IOOther              Columns[COLUMN_IOOTHER]
 #define Column_IOOtherBytes         Columns[COLUMN_IOOTHERBYTES]
+#define Column_CommandLine          Columns[COLUMN_COMMANDLINE]
 
 void ProcessPage_OnViewSelectColumns(void);
 void AddColumns(void);
index 3d838d9..9a38102 100644 (file)
@@ -315,6 +315,7 @@ BEGIN
     CONTROL "В/И байтове за писане", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 125, 127, 65, 10
     CONTROL "Други В/И", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 125, 138, 115, 10
     CONTROL "Други В/И байтове", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 125, 149, 115, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 125, 160, 65, 10
 END
 
 /* String Tables */
@@ -410,6 +411,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "В/И прочетени байтове"
     IDS_TAB_IOWRITESBYTES "В/И записани байтове"
     IDS_TAB_IOOTHERBYTES "В/И други байтове"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Избор на стълбове..."
     IDS_MENU_16BITTASK "&Показване на 16битови задачи"
     IDS_MENU_WINDOWS "&Прозорци"
index 79571b8..ac024b8 100644 (file)
@@ -315,6 +315,7 @@ BEGIN
     CONTROL "I/O zapsané bajty", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 72, 10
     CONTROL "I/O ostatní", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 48, 10
     CONTROL "I/O ostatní bajty", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -410,6 +411,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O přečtené bajty"
     IDS_TAB_IOWRITESBYTES "I/O zapsané bajty"
     IDS_TAB_IOOTHERBYTES "I/O ostatní bajty"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Vybrat sloupce..."
     IDS_MENU_16BITTASK "&Zobrazit 16-bitové úlohy"
     IDS_MENU_WINDOWS "&Okna"
index a42d42e..26dbe41 100644 (file)
@@ -315,6 +315,7 @@ BEGIN
     CONTROL "I/O Skrevet Bytes", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "I/O Andet", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "I/O Andre Bytes", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -410,6 +411,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O Read Bytes"
     IDS_TAB_IOWRITESBYTES "I/O Write Bytes"
     IDS_TAB_IOOTHERBYTES "I/O Other Bytes"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Select Columns..."
     IDS_MENU_16BITTASK "&Show 16-bit tasks"
     IDS_MENU_WINDOWS "&Windows"
index b1990af..bc4cd00 100644 (file)
@@ -317,6 +317,7 @@ BEGIN
     CONTROL "E/A-Bytes (Schreiben)", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 127, 105, 10 // 107
     CONTROL "E/A (Andere)", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 138, 105, 10 // 107
     CONTROL "E/A-Bytes (Andere)", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 149, 110, 10 // 107
+    CONTROL "Befeh&lszeile", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 160, 65, 10 // 107
 END
 
 /* String Tables */
@@ -412,6 +413,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "E/A-Bytes (Lesen)"
     IDS_TAB_IOWRITESBYTES "E/A-Bytes (Schreiben)"
     IDS_TAB_IOOTHERBYTES "E/A-Bytes (Andere)"
+    IDS_TAB_COMMANDLINE "Befehlszeile"
     IDS_MENU_SELECTCOLUMNS "&Spalten auswählen..."
     IDS_MENU_16BITTASK "&16-Bit-Tasks anzeigen"
     IDS_MENU_WINDOWS "&Fenster"
index 2aa31e0..7a65c88 100644 (file)
@@ -317,6 +317,7 @@ BEGIN
     CONTROL "I/O Write Bytes", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "I/O Other", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "I/O Other Bytes", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -412,6 +413,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O Read Bytes"
     IDS_TAB_IOWRITESBYTES "I/O Write Bytes"
     IDS_TAB_IOOTHERBYTES "I/O Other Bytes"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Select Columns..."
     IDS_MENU_16BITTASK "&Show 16-bit tasks"
     IDS_MENU_WINDOWS "&Windows"
index 010d4ea..d25de52 100644 (file)
@@ -313,6 +313,7 @@ BEGIN
     CONTROL "I/O Write Bytes", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "I/O Other", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "I/O Other Bytes", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -408,6 +409,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O Read Bytes"
     IDS_TAB_IOWRITESBYTES "I/O Write Bytes"
     IDS_TAB_IOOTHERBYTES "I/O Other Bytes"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Select Columns..."
     IDS_MENU_16BITTASK "&Show 16-bit tasks"
     IDS_MENU_WINDOWS "&Windows"
index 5dabd18..768703c 100644 (file)
@@ -292,7 +292,7 @@ BEGIN
     DEFPUSHBUTTON "Aceptar", IDOK, 126, 178, 50, 14 // 84
     PUSHBUTTON "Cancelar", IDCANCEL, 180, 178, 50, 14 // 138
     LTEXT "Seleccione las columnas que aparecerán en la página de Procesos del Administrador de tareas.", IDC_STATIC, 7, 7, 221, 17 // 181
-    CONTROL "Nombre de ruta de la &imagen", IDC_IMAGENAME, "Button", BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP, 7, 28, 88, 10 // 56
+    CONTROL "Nombre de ruta de la &imagen", IDC_IMAGENAME, "Button", BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP, 7, 28, 105, 10 // 56
     CONTROL "Identificador de proceso (&PID)", IDC_PID, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 39, 120, 10 // 88
     CONTROL "Uso de &CPU", IDC_CPUUSAGE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 50, 53, 10
     CONTROL "Ti&empo de CPU", IDC_CPUTIME, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 61, 65, 10 // 48
@@ -301,8 +301,8 @@ BEGIN
     CONTROL "Uso má&ximo de la memoria", IDC_PEAKMEMORYUSAGE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 94, 120, 10 // 82
     CONTROL "Err&ores de página", IDC_PAGEFAULTS, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 105, 80, 10 // 53
     CONTROL "O&bjetos de USUARIO", IDC_USEROBJECTS, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 116, 80, 10 // 62
-    CONTROL "Lecturas de E/S", IDC_IOREADS, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 127, 60, 10 // 49
-    CONTROL "Bytes de lectura de E/S", IDC_IOREADBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 138, 65, 10
+    CONTROL "Lecturas de E/S", IDC_IOREADS, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 127, 70, 10 // 49
+    CONTROL "Bytes de lectura de E/S", IDC_IOREADBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 138, 85, 10
     CONTROL "I&d. de sesión", IDC_SESSIONID, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 149, 65, 10 // 50
     CONTROL "&Nombre de usuario", IDC_USERNAME, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 160, 75, 10 // 51
     CONTROL "Diferencia de erro&res de página", IDC_PAGEFAULTSDELTA, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 28, 120, 10 // 107, 60
@@ -310,13 +310,14 @@ BEGIN
     CONTROL "B&loque paginado", IDC_PAGEDPOOL, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 50, 67, 10 // 107, 53
     CONTROL "Blo&que no paginado", IDC_NONPAGEDPOOL, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 61, 115, 10 // 107
     CONTROL "P&rioridad base", IDC_BASEPRIORITY, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 72, 80, 10 // 107
-    CONTROL "&Recuento de identificadores", IDC_HANDLECOUNT, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 83, 59, 10 // 107
-    CONTROL "Nú&mero de subprocesos", IDC_THREADCOUNT, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 94, 59, 10 // 107
+    CONTROL "&Recuento de identificadores", IDC_HANDLECOUNT, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 83, 105, 10 // 107
+    CONTROL "Nú&mero de subprocesos", IDC_THREADCOUNT, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 94, 85, 10 // 107
     CONTROL "Objetos &GDI", IDC_GDIOBJECTS, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 105, 55, 10 // 107
     CONTROL "Escrituras de E/S", IDC_IOWRITES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 116, 90, 10 // 107
     CONTROL "Bytes de escritura de E/S", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 127, 105, 10 // 107
     CONTROL "Otros de E/S", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 138, 60, 10
     CONTROL "Otros bytes de E/S", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 149, 75, 10
+    CONTROL "&Línea de comandos", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 127, 160, 75, 10
 END
 
 /* String Tables */
@@ -412,6 +413,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "Bytes de lectura de E/S"
     IDS_TAB_IOWRITESBYTES "Bytes de escritura de E/S"
     IDS_TAB_IOOTHERBYTES "Otros bytes de E/S"
+    IDS_TAB_COMMANDLINE "Línea de comandos"
     IDS_MENU_SELECTCOLUMNS "&Seleccionar columnas..."
     IDS_MENU_16BITTASK "Mos&trar tareas de 16-bit"
     IDS_MENU_WINDOWS "&Ventanas"
index 4d8e64b..94d3c58 100644 (file)
@@ -317,6 +317,7 @@ BEGIN
     CONTROL "Octets d'écriture E/S", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 129, 127, 108, 10
     CONTROL "Autres E/S", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 129, 138, 108, 10
     CONTROL "Octets d'autres E/S", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 129, 149, 108, 10
+    CONTROL "&Ligne de commande", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 129, 160, 95, 10
 END
 
 /* String Tables */
@@ -412,6 +413,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "Octets de lecture E/S"
     IDS_TAB_IOWRITESBYTES "Octets d'écriture E/S"
     IDS_TAB_IOOTHERBYTES "Octets d'autres E/S"
+    IDS_TAB_COMMANDLINE "Ligne de commande"
     IDS_MENU_SELECTCOLUMNS "&Sélectionner les colonnes..."
     IDS_MENU_16BITTASK "&Afficher les tâches 16 bits"
     IDS_MENU_WINDOWS "&Fenêtres"
index 6ac0d15..518e0b8 100644 (file)
@@ -317,6 +317,7 @@ BEGIN
     CONTROL "I/O Write Bytes", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "I/O Other", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "I/O Other Bytes", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -412,6 +413,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O Read Bytes"
     IDS_TAB_IOWRITESBYTES "I/O Write Bytes"
     IDS_TAB_IOOTHERBYTES "I/O Other Bytes"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Select Columns..."
     IDS_MENU_16BITTASK "&Show 16-bit tasks"
     IDS_MENU_WINDOWS "&Windows"
index 2fea5c5..9a42941 100644 (file)
@@ -317,6 +317,7 @@ BEGIN
     CONTROL "I/O Írott bájtok", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "Egyéb I/O    mûveletek", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "Egyéb I/O mûveletek bájtjai", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -412,6 +413,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O Olvasott bájtok"
     IDS_TAB_IOWRITESBYTES "I/O Írott bájtok"
     IDS_TAB_IOOTHERBYTES "Egyéb I/O bájtok"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Oszlopok kiválasztása..."
     IDS_MENU_16BITTASK "&16bites feladatok megjelenítése"
     IDS_MENU_WINDOWS "&Ablak"
index 724c5a2..ff67ec3 100644 (file)
@@ -317,6 +317,7 @@ BEGIN
     CONTROL "I/O Write Bytes", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "I/O Other", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "I/O Other Bytes", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -412,6 +413,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O Read Bytes"
     IDS_TAB_IOWRITESBYTES "I/O Write Bytes"
     IDS_TAB_IOOTHERBYTES "I/O Other Bytes"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Select Columns..."
     IDS_MENU_16BITTASK "&Show 16-bit tasks"
     IDS_MENU_WINDOWS "&Windows"
index 31deb63..a3197c4 100644 (file)
@@ -315,6 +315,7 @@ BEGIN
     CONTROL "Scritture I/O Byte", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 69, 10
     CONTROL "Altro I/O", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "Altro I/O  Bytes", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "&Linea di comando", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -410,6 +411,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O Letture Bytes"
     IDS_TAB_IOWRITESBYTES "I/O Scritture Bytes"
     IDS_TAB_IOOTHERBYTES "I/O Altro Bytes"
+    IDS_TAB_COMMANDLINE "Linea di comando"
     IDS_MENU_SELECTCOLUMNS "&Selezione Colonne..."
     IDS_MENU_16BITTASK "&Mostra task 16-bit"
     IDS_MENU_WINDOWS "&Finestre"
index 6f78c03..38be086 100644 (file)
@@ -315,6 +315,7 @@ BEGIN
     CONTROL "I/O 書き込みバイト数", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "I/O その他", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "I/O その他のバイト数", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -410,6 +411,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O 読み取りバイト数"
     IDS_TAB_IOWRITESBYTES "I/O 書き込みバイト数"
     IDS_TAB_IOOTHERBYTES "I/O その他のバイト数"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "列の選択(&S)..."
     IDS_MENU_16BITTASK "16 ビット タスクの表示(&S)"
     IDS_MENU_WINDOWS "ウィンドウ(&W)"
index 88d4ec0..b54eda8 100644 (file)
@@ -317,6 +317,7 @@ BEGIN
     CONTROL "I/O 쓰기 바이트", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "I/O 기타", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "I/O 기타 바이트", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -412,6 +413,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O 읽기 바이트"
     IDS_TAB_IOWRITESBYTES "I/O 쓰기 바이트"
     IDS_TAB_IOOTHERBYTES "I/O 기타 바이트"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "열 선택(&S)"
     IDS_MENU_16BITTASK "16비트 작업 보이기(&S)"
     IDS_MENU_WINDOWS "창(&W)"
index ac7e845..ddeb52a 100644 (file)
@@ -315,6 +315,7 @@ BEGIN
     CONTROL "I/O: geschreven bytes", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 117, 127, 100, 10
     CONTROL "I/O: overig", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 117, 138, 100, 10
     CONTROL "I/O: overige bytes", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 117, 149, 100, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 117, 160, 65, 10
 END
 
 /* String Tables */
@@ -410,6 +411,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O: gelezen bytes"
     IDS_TAB_IOWRITESBYTES "I/O: geschreven bytes"
     IDS_TAB_IOOTHERBYTES "I/O: overige bytes"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Kolommen selecteren..."
     IDS_MENU_16BITTASK "16-&bits taken weergeven"
     IDS_MENU_WINDOWS "&Vensters"
index 5e785e7..1e538c9 100644 (file)
@@ -315,6 +315,7 @@ BEGIN
     CONTROL "I/O skrevne byte", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 70, 10
     CONTROL "I/O Annet", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "I/O Andre byte", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -410,6 +411,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O Leser Byte"
     IDS_TAB_IOWRITESBYTES "I/O Skriver Byte"
     IDS_TAB_IOOTHERBYTES "I/O Annet Byte"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Velg kolonner..."
     IDS_MENU_16BITTASK "&Vis 16-biter oppgave"
     IDS_MENU_WINDOWS "&Vinduer"
index 06bf6f4..a3643c8 100644 (file)
@@ -323,6 +323,7 @@ BEGIN
     CONTROL "Zapisy We/Wy w bajtach", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "Inne We/Wy", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "Inne We/Wy w bajtach", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Linia poleceń", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -418,6 +419,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "Odczyty We/Wy w bajtach"
     IDS_TAB_IOWRITESBYTES "Zapisy We/Wy w bajtach"
     IDS_TAB_IOOTHERBYTES "Inne We/Wy w bajtach"
+    IDS_TAB_COMMANDLINE "Linia poleceń"
     IDS_MENU_SELECTCOLUMNS "Wybierz &kolumny..."
     IDS_MENU_16BITTASK "Pokaż 16-&bitowe zadania"
     IDS_MENU_WINDOWS "O&kna"
index a708bd2..fe940cf 100644 (file)
@@ -315,6 +315,7 @@ BEGIN
     CONTROL "Bytes de gravação de E/S", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 123, 127, 97, 10
     CONTROL "Outras E/S", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 123, 138, 47, 10
     CONTROL "Outros bytes de E/S", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 123, 149, 77, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 123, 160, 95, 10
 END
 
 /* String Tables */
@@ -410,6 +411,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "Bytes de leitura de E/S"
     IDS_TAB_IOWRITESBYTES "Bytes de gravação de E/S"
     IDS_TAB_IOOTHERBYTES "Outros Bytes de E/S"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Selecionar colunas..."
     IDS_MENU_16BITTASK "&Exibir tarefas de 16 bits"
     IDS_MENU_WINDOWS "&Janelas"
index 9362ceb..60deced 100644 (file)
@@ -321,6 +321,7 @@ BEGIN
     CONTROL "In/Ex octeți scriși", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 120, 127, 110, 10
     CONTROL "In/Ex altceva", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 120, 138, 110, 10
     CONTROL "In/Ex octeți din altceva", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 120, 149, 110, 10
+    CONTROL "&Linia de comandă", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 120, 160, 65, 10
 END
 
 /* String Tables */
@@ -416,6 +417,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "In/Ex octeți citiți"
     IDS_TAB_IOWRITESBYTES "In/Ex octeți scriși"
     IDS_TAB_IOOTHERBYTES "In/Ex octeți din altceva"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Selectare coloane…"
     IDS_MENU_16BITTASK "Afișează activități pe 16 &biți"
     IDS_MENU_WINDOWS "F&erestre"
index c134186..f001896 100644 (file)
@@ -317,6 +317,7 @@ BEGIN
     CONTROL "Записано байт", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "Прочий ввод-вывод", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 90, 10
     CONTROL "Прочих байт при вводе-выводе", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 122, 10
+    CONTROL "Коммандная строка", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 90, 10
 END
 
 /* String Tables */
@@ -412,6 +413,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "Прочитано байт"
     IDS_TAB_IOWRITESBYTES "Записано байт"
     IDS_TAB_IOOTHERBYTES "Прочих байт при вводе-выводе"
+    IDS_TAB_COMMANDLINE "Коммандная строка"
     IDS_MENU_SELECTCOLUMNS "В&ыбрать столбцы..."
     IDS_MENU_16BITTASK "&Отображать 16-разрядные задачи"
     IDS_MENU_WINDOWS "&Окна"
index a306b23..0598c83 100644 (file)
@@ -317,6 +317,7 @@ BEGIN
     CONTROL "Vstup a výstup - zapísané bajty", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 130, 127, 112, 10
     CONTROL "Vstup a výstup - iné", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 130, 138, 77, 10
     CONTROL "Vstup a výstup - iné bajty", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 130, 149, 97, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 130, 160, 95, 10
 END
 
 /* String Tables */
@@ -412,6 +413,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "Vstup a výstup - prečítané bajty"
     IDS_TAB_IOWRITESBYTES "Vstup a výstup - zapísané bajty"
     IDS_TAB_IOOTHERBYTES "Vstup a výstup - iné bajty"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Vybrať stĺpce..."
     IDS_MENU_16BITTASK "&Zobraziť 16-bitové úlohy"
     IDS_MENU_WINDOWS "&Okna"
index 21b0dae..5d6196e 100644 (file)
@@ -317,6 +317,7 @@ BEGIN
     CONTROL "Shkruan I/O Bytes", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "I/O te tjere", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "I/O Byte te tjere", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -412,6 +413,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O Lexo Bytes"
     IDS_TAB_IOWRITESBYTES "I/O Shkruaj Bytes"
     IDS_TAB_IOOTHERBYTES "I/O te tjere Bytes"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "Zgjidh kolonat..."
     IDS_MENU_16BITTASK "&Shfaq 16-bit tasks"
     IDS_MENU_WINDOWS "Dritare"
index a20c225..4f85436 100644 (file)
@@ -317,6 +317,7 @@ BEGIN
     CONTROL "I/O, &antal tecken skrivna", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 133, 127, 113, 10
     CONTROL "And&ra I/O åtgärder", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 133, 138, 89, 10
     CONTROL "Antal tecken, andra I/O åtgärder", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 133, 149, 141, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 133, 160, 95, 10
 END
 
 /* String Tables */
@@ -412,6 +413,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "Antal tecken lästa, andra I/O-åtgärder"
     IDS_TAB_IOWRITESBYTES "Antal tecken skrivna, andra I/O-åtgärder"
     IDS_TAB_IOOTHERBYTES "I/O, antal tecken"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Välj kolumner..."
     IDS_MENU_16BITTASK "&Visa 16-bitsprocesser"
     IDS_MENU_WINDOWS "&Fönster"
index c414f40..41deace 100644 (file)
@@ -315,6 +315,7 @@ BEGIN
     CONTROL "G/Ç Yazma Çokluları", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "G/Ç Başka", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "G/Ç Başka Çoklular", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -410,6 +411,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "G/Ç Okuma Çokluları"
     IDS_TAB_IOWRITESBYTES "G/Ç Yazma Çokluları"
     IDS_TAB_IOOTHERBYTES "G/Ç Başka Çoklular"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "&Dikeçleri Seç..."
     IDS_MENU_16BITTASK "&16 Bitlik Görevleri Göster"
     IDS_MENU_WINDOWS "&Pencereler"
index 79883af..370b382 100644 (file)
@@ -315,6 +315,7 @@ BEGIN
     CONTROL "Записано байтів", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 67, 10
     CONTROL "Інший ввід-вивід", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 71, 10
     CONTROL "Інших байтів при вводі-виводі", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 114, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -410,6 +411,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "Прочитано байтів"
     IDS_TAB_IOWRITESBYTES "Записано байтів"
     IDS_TAB_IOOTHERBYTES "Інших байтів під час вводу-виводу"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "В&ибрати стовпці..."
     IDS_MENU_16BITTASK "&Відображати 16-розрядні завдання"
     IDS_MENU_WINDOWS "В&ікна"
index ff773f6..d42e0dd 100644 (file)
@@ -321,6 +321,7 @@ BEGIN
     CONTROL "I/O 写入字节", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "I/O 其他", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "I/O 其他字节", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -416,6 +417,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O Read Bytes"
     IDS_TAB_IOWRITESBYTES "I/O Write Bytes"
     IDS_TAB_IOOTHERBYTES "I/O Other Bytes"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "选择列(&S)..."
     IDS_MENU_16BITTASK "显示 16 位任务(&S)"
     IDS_MENU_WINDOWS "窗口(&W)"
index 6c607ed..eb6ee18 100644 (file)
@@ -323,6 +323,7 @@ BEGIN
     CONTROL "I/O 寫入位元組", IDC_IOWRITEBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 127, 65, 10
     CONTROL "其他 I/O", IDC_IOOTHER, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 138, 46, 10
     CONTROL "其他 I/O 位元組", IDC_IOOTHERBYTES, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 149, 65, 10
+    CONTROL "Command &Line", IDC_COMMANDLINE, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 107, 160, 65, 10
 END
 
 /* String Tables */
@@ -418,6 +419,7 @@ BEGIN
     IDS_TAB_IOREADBYTES "I/O 讀取位元組"
     IDS_TAB_IOWRITESBYTES "I/O 寫入位元組"
     IDS_TAB_IOOTHERBYTES "其他 I/O 位元組"
+    IDS_TAB_COMMANDLINE "Command Line"
     IDS_MENU_SELECTCOLUMNS "選擇列(&S)..."
     IDS_MENU_16BITTASK "顯示 16 位工作(&S)"
     IDS_MENU_WINDOWS "窗口(&W)"
index ac23b16..3ecb0d8 100644 (file)
@@ -3,7 +3,8 @@
  *
  *  perfdata.c
  *
- *  Copyright (C) 1999 - 2001  Brian Palmer  <brianp@reactos.org>
+ *  Copyright (C) 1999 - 2001  Brian Palmer                <brianp@reactos.org>
+ *  Copyright (C)        2014  Ismael Ferreras Morezuelas  <swyterzone+ros@gmail.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 #include <aclapi.h>
 
 #define NTOS_MODE_USER
+#include <ndk/psfuncs.h>
 #include <ndk/exfuncs.h>
 
 CRITICAL_SECTION                           PerfDataCriticalSection;
 PPERFDATA                                  pPerfDataOld = NULL;    /* Older perf data (saved to establish delta values) */
-PPERFDATA                                  pPerfData = NULL;    /* Most recent copy of perf data */
+PPERFDATA                                  pPerfData = NULL;       /* Most recent copy of perf data */
 ULONG                                      ProcessCountOld = 0;
 ULONG                                      ProcessCount = 0;
 double                                     dbIdleTime;
@@ -46,6 +48,10 @@ SYSTEM_HANDLE_INFORMATION                  SystemHandleInfo;
 PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION  SystemProcessorTimeInfo = NULL;
 PSID                                       SystemUserSid = NULL;
 
+PCMD_LINE_CACHE global_cache = NULL;
+
+#define CMD_LINE_MIN(a, b) (a < b ? a - sizeof(WCHAR) : b)
+
 typedef struct _SIDTOUSERNAME
 {
     LIST_ENTRY List;
@@ -371,7 +377,7 @@ void PerfDataRefresh(void)
         pPerfData[Idx].HandleCount = pSPI->HandleCount;
         pPerfData[Idx].ThreadCount = pSPI->NumberOfThreads;
         pPerfData[Idx].SessionId = pSPI->SessionId;
-        pPerfData[Idx].UserName[0] = L'\0';
+        pPerfData[Idx].UserName[0] = UNICODE_NULL;
         pPerfData[Idx].USERObjectCount = 0;
         pPerfData[Idx].GDIObjectCount = 0;
         ProcessUser = SystemUserSid;
@@ -472,7 +478,7 @@ ULONG PerfDataGetProcessorSystemUsage(void)
     return (ULONG)dbKernelTime;
 }
 
-BOOL PerfDataGetImageName(ULONG Index, LPWSTR lpImageName, int nMaxCount)
+BOOL PerfDataGetImageName(ULONG Index, LPWSTR lpImageName, ULONG nMaxCount)
 {
     BOOL  bSuccessful;
 
@@ -504,7 +510,7 @@ ULONG PerfDataGetProcessId(ULONG Index)
     return ProcessId;
 }
 
-BOOL PerfDataGetUserName(ULONG Index, LPWSTR lpUserName, int nMaxCount)
+BOOL PerfDataGetUserName(ULONG Index, LPWSTR lpUserName, ULONG nMaxCount)
 {
     BOOL  bSuccessful;
 
@@ -522,6 +528,130 @@ BOOL PerfDataGetUserName(ULONG Index, LPWSTR lpUserName, int nMaxCount)
     return bSuccessful;
 }
 
+BOOL PerfDataGetCommandLine(ULONG Index, LPWSTR lpCommandLine, ULONG nMaxCount)
+{
+    static const LPWSTR ellipsis = L"...";
+
+    PROCESS_BASIC_INFORMATION pbi = {0};
+    UNICODE_STRING CommandLineStr = {0};
+
+    PVOID ProcessParams = NULL;
+    HANDLE hProcess;
+    ULONG ProcessId;
+
+    NTSTATUS Status;
+    BOOL result;
+
+    PCMD_LINE_CACHE new_entry;
+    LPWSTR new_string;
+
+    PCMD_LINE_CACHE cache = global_cache;
+
+    /* [A] Search for a string already in cache? If so, use it */
+    while (cache && cache->pnext != NULL)
+    {
+        if (cache->idx == Index && cache->str != NULL)
+        {
+            /* Found it. Use it, and add some ellipsis at the very end to make it cute */
+            wcsncpy(lpCommandLine, cache->str, CMD_LINE_MIN(nMaxCount, cache->len));
+            wcscpy(lpCommandLine + CMD_LINE_MIN(nMaxCount, cache->len) - sizeof(ellipsis)/sizeof(WCHAR), ellipsis);
+            return TRUE;
+        }
+
+        cache = cache->pnext;
+    }
+
+    /* [B] We don't; let's allocate and load a value from the process mem... and cache it */
+    ProcessId = PerfDataGetProcessId(Index);
+
+    /* Default blank command line in case things don't work out */
+    wcsncpy(lpCommandLine, L"", nMaxCount);
+
+    /* Ask for a handle to the target process so that we can read its memory and query stuff */
+    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessId);
+    if (!hProcess)
+        goto cleanup;
+
+    /* First off, get the ProcessEnvironmentBlock location in that process' address space */
+    Status = NtQueryInformationProcess(hProcess, 0, &pbi, sizeof(pbi), NULL);
+    if (!NT_SUCCESS(Status))
+        goto cleanup;
+
+    /* Then get the PEB.ProcessParameters member pointer */
+    result = ReadProcessMemory(hProcess,
+                               (PVOID)((ULONG_PTR)pbi.PebBaseAddress + FIELD_OFFSET(PEB, ProcessParameters)),
+                               &ProcessParams,
+                               sizeof(ProcessParams),
+                               NULL);
+    if (!result)
+        goto cleanup;
+
+    /* Then copy the PEB->ProcessParameters.CommandLine member
+       to get the pointer to the string buffer and its size */
+    result = ReadProcessMemory(hProcess,
+                               (PVOID)((ULONG_PTR)ProcessParams + FIELD_OFFSET(RTL_USER_PROCESS_PARAMETERS, CommandLine)),
+                               &CommandLineStr,
+                               sizeof(CommandLineStr),
+                               NULL);
+    if (!result)
+        goto cleanup;
+
+    /* Allocate the next cache entry and its accompanying string in one go */
+    new_entry = HeapAlloc(GetProcessHeap(),
+                          HEAP_ZERO_MEMORY,
+                          sizeof(CMD_LINE_CACHE) + CommandLineStr.Length + sizeof(UNICODE_NULL));
+    if (!new_entry)
+        goto cleanup;
+
+    new_string = (LPWSTR)((ULONG_PTR)new_entry + sizeof(CMD_LINE_CACHE));
+
+    /* Bingo, the command line should be stored there,
+       copy the string from the other process */
+    result = ReadProcessMemory(hProcess,
+                               CommandLineStr.Buffer,
+                               new_string,
+                               CommandLineStr.Length,
+                               NULL);
+    if (!result)
+    {
+        /* Weird, after sucessfully reading the mem of that process
+           various times it fails now, forget it and bail out */
+        HeapFree(GetProcessHeap(), 0, new_entry);
+        goto cleanup;
+    }
+
+    /* Add our pointer to the cache... */
+    new_entry->idx = Index;
+    new_entry->str = new_string;
+    new_entry->len = CommandLineStr.Length;
+
+    if (!global_cache)
+        global_cache = new_entry;
+    else
+        cache->pnext = new_entry;
+
+    /* ... and print the buffer for the first time */
+    wcsncpy(lpCommandLine, new_string, CMD_LINE_MIN(nMaxCount, CommandLineStr.Length));
+
+cleanup:
+    if (hProcess) CloseHandle(hProcess);
+    return TRUE;
+}
+
+void PerfDataDeallocCommandLineCache()
+{
+    PCMD_LINE_CACHE cache = global_cache;
+    PCMD_LINE_CACHE cache_old;
+
+    while (cache && cache->pnext != NULL)
+    {
+        cache_old = cache;
+        cache = cache->pnext;
+
+        HeapFree(GetProcessHeap(), 0, cache_old);
+    }
+}
+
 ULONG PerfDataGetSessionId(ULONG Index)
 {
     ULONG  SessionId;
index 6bb7005..51e11f4 100644 (file)
@@ -55,19 +55,31 @@ typedef struct _PERFDATA
        LARGE_INTEGER           KernelTime;
 } PERFDATA, *PPERFDATA;
 
+typedef struct _CMD_LINE_CACHE
+{
+     DWORD idx;
+    LPWSTR str;
+     ULONG len;
+    struct _CMD_LINE_CACHE* pnext;
+} CMD_LINE_CACHE, *PCMD_LINE_CACHE;
+
 BOOL   PerfDataInitialize(void);
 void   PerfDataUninitialize(void);
 void   PerfDataRefresh(void);
 
-BOOL    PerfDataGet(ULONG Index, PPERFDATA *lppData);
-ULONG   PerfDataGetProcessIndex(ULONG pid);
+BOOL   PerfDataGet(ULONG Index, PPERFDATA *lppData);
+ULONG  PerfDataGetProcessIndex(ULONG pid);
 ULONG  PerfDataGetProcessCount(void);
 ULONG  PerfDataGetProcessorUsage(void);
 ULONG  PerfDataGetProcessorSystemUsage(void);
 
-BOOL   PerfDataGetImageName(ULONG Index, LPTSTR lpImageName, int nMaxCount);
+BOOL   PerfDataGetImageName(ULONG Index, LPWSTR lpImageName, ULONG nMaxCount);
 ULONG  PerfDataGetProcessId(ULONG Index);
-BOOL   PerfDataGetUserName(ULONG Index, LPTSTR lpUserName, int nMaxCount);
+BOOL   PerfDataGetUserName(ULONG Index, LPWSTR lpUserName, ULONG nMaxCount);
+
+BOOL   PerfDataGetCommandLine(ULONG Index, LPWSTR lpCommandLine, ULONG nMaxCount);
+void   PerfDataDeallocCommandLineCache();
+
 ULONG  PerfDataGetSessionId(ULONG Index);
 ULONG  PerfDataGetCPUUsage(ULONG Index);
 LARGE_INTEGER  PerfDataGetCPUTime(ULONG Index);
index 40739e3..35a7b32 100644 (file)
@@ -52,9 +52,9 @@ void AddProcess(ULONG Index);
 void UpdateProcesses();
 void gethmsfromlargeint(LARGE_INTEGER largeint, DWORD *dwHours, DWORD *dwMinutes, DWORD *dwSeconds);
 void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam);
-void CommaSeparateNumberString(LPWSTR strNumber, int nMaxCount);
+void CommaSeparateNumberString(LPWSTR strNumber, ULONG nMaxCount);
 void ProcessPageShowContextMenu(DWORD dwProcessId);
-BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCount);
+BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, ULONG nMaxCount);
 DWORD WINAPI ProcessPageRefreshThread(void *lpParameter);
 int ProcessRunning(ULONG ProcessId);
 
@@ -245,7 +245,7 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam)
             Index = PerfDataGetProcessIndex(pData->ProcessId);
             ColumnIndex = pnmdi->item.iSubItem;
 
-            PerfDataGetText(Index, ColumnIndex, pnmdi->item.pszText, pnmdi->item.cchTextMax);
+            PerfDataGetText(Index, ColumnIndex, pnmdi->item.pszText, (ULONG)pnmdi->item.cchTextMax);
 
             break;
 
@@ -290,7 +290,7 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam)
     }
 }
 
-void CommaSeparateNumberString(LPWSTR strNumber, int nMaxCount)
+void CommaSeparateNumberString(LPWSTR strNumber, ULONG nMaxCount)
 {
     WCHAR  temp[260];
     UINT   i, j, k;
@@ -530,7 +530,7 @@ void AddProcess(ULONG Index)
     }
 }
 
-BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCount)
+BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, ULONG nMaxCount)
 {
     IO_COUNTERS    iocounters;
     LARGE_INTEGER  time;
@@ -541,6 +541,8 @@ BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCoun
         wsprintfW(lpText, L"%lu", PerfDataGetProcessId(Index));
     if (ColumnDataHints[ColumnIndex] == COLUMN_USERNAME)
         PerfDataGetUserName(Index, lpText, nMaxCount);
+    if (ColumnDataHints[ColumnIndex] == COLUMN_COMMANDLINE)
+        PerfDataGetCommandLine(Index, lpText, nMaxCount);
     if (ColumnDataHints[ColumnIndex] == COLUMN_SESSIONID)
         wsprintfW(lpText, L"%lu", PerfDataGetSessionId(Index));
     if (ColumnDataHints[ColumnIndex] == COLUMN_CPUUSAGE)
@@ -753,6 +755,12 @@ int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lPara
         PerfDataGetUserName(IndexParam2, text2, sizeof (text2) / sizeof (*text2));
         ret = _wcsicmp(text1, text2);
     }
+    else if (TaskManagerSettings.SortColumn == COLUMN_COMMANDLINE)
+    {
+        PerfDataGetCommandLine(IndexParam1, text1, sizeof (text1) / sizeof (*text1));
+        PerfDataGetCommandLine(IndexParam2, text2, sizeof (text2) / sizeof (*text2));
+        ret = _wcsicmp(text1, text2);
+    }
     else if (TaskManagerSettings.SortColumn == COLUMN_SESSIONID)
     {
         l1 = PerfDataGetSessionId(IndexParam1);
index 785193b..8aca1bd 100644 (file)
 #define IDC_IOOTHERBYTES                 1047
 #define IDC_CPU_USAGE_GRAPH              1047
 #define IDC_CPU29                        1048
+#define IDC_COMMANDLINE                  1048
 #define IDC_MEM_USAGE_GRAPH2             1048
 #define IDC_MEM_USAGE_GRAPH              1048
 #define IDC_CPU30                        1049
 #define IDS_TAB_IOREADBYTES   337
 #define IDS_TAB_IOWRITESBYTES 338
 #define IDS_TAB_IOOTHERBYTES  339
+#define IDS_TAB_COMMANDLINE   368
 
 #define IDS_MENU_SELECTCOLUMNS   340
 #define IDS_MENU_16BITTASK       341
index 2eb384b..1b8a4b0 100644 (file)
@@ -480,6 +480,8 @@ TaskManagerWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
             TaskManagerSettings.Maximized = TRUE;
         else
             TaskManagerSettings.Maximized = FALSE;
+        /* Get rid of the allocated command line cache, if any */
+        PerfDataDeallocCommandLineCache();
         return DefWindowProcW(hDlg, message, wParam, lParam);
 
     case WM_TIMER:
@@ -1140,7 +1142,7 @@ LPWSTR GetLastErrorText(LPWSTR lpszBuf, DWORD dwSize)
     DWORD  dwRet;
     LPWSTR lpszTemp = NULL;
 
-    dwRet = FormatMessageW( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
+    dwRet = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY,
                            NULL,
                            GetLastError(),
                            LANG_NEUTRAL,