Patch by Michael Fritscher <michael(a)fritscher.net>
- support for more/less lines
- support page up/down and pos1/end keys
- added numeration
- added german translation
Added: trunk/rosapps/sysutils/ctm/De.rc
Modified: trunk/rosapps/sysutils/ctm/En.rc
Modified: trunk/rosapps/sysutils/ctm/Fr.rc
Modified: trunk/rosapps/sysutils/ctm/ctm.c
Modified: trunk/rosapps/sysutils/ctm/ctm.rc
Modified: trunk/rosapps/sysutils/ctm/resource.h
_____
Added: trunk/rosapps/sysutils/ctm/De.rc
--- trunk/rosapps/sysutils/ctm/De.rc 2005-11-21 11:20:11 UTC (rev
19406)
+++ trunk/rosapps/sysutils/ctm/De.rc 2005-11-21 13:46:20 UTC (rev
19407)
@@ -0,0 +1,32 @@
+// German (Germany) resources
+
+LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_TITLE "Console TaskManager v0.1 von Aleksey Bragin
<aleksey(a)studiocerebral.com>"
+
+ IDS_COLUMN_NUMBER "# "
+ IDS_COLUMN_IMAGENAME "Dateiname "
+ IDS_COLUMN_PID "PID "
+ IDS_COLUMN_CPU "CPU"
+ IDS_COLUMN_MEM "Speicher"
+ IDS_COLUMN_MEM_UNIT "KB"
+ IDS_COLUMN_PF "Seitenfehler"
+
+ IDS_IDLE_PROCESS "Leerlaufprozess"
+ IDS_YES "J"
+ IDS_NO "N"
+
+ IDS_MENU "Tasten: q - beenden, k - Prozess beenden"
+ IDS_MENU_QUIT "Q"
+ IDS_MENU_KILL_PROCESS "K"
+
+ IDS_KILL_PROCESS "Sind Sie sicher diesen prozess beendenzu
wollen (j/n)"
+ IDS_KILL_PROCESS_ERR1 "Fehler beim Beenden des Prozesses
aufgetreten..."
+ IDS_KILL_PROCESS_ERR2 "Fehler beim Beenden des Prozesses %d
aufgetreten (OpenProcess unm÷glich)"
+
+ IDS_CTM_GENERAL_ERR1 "ctm: Kann die Konsole nicht verwenden."
+ IDS_CTM_GENERAL_ERR2 "ctm: Kann GetConsoleMode() f³r die
Eingabekonsole nicht verwenden."
+ IDS_CTM_GENERAL_ERR3 "ctm: Kann GetConsoleMode() f³r die
Ausgabekonsole nicht verwenden."
+END
Property changes on: trunk/rosapps/sysutils/ctm/De.rc
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Modified: trunk/rosapps/sysutils/ctm/En.rc
--- trunk/rosapps/sysutils/ctm/En.rc 2005-11-21 11:20:11 UTC (rev
19406)
+++ trunk/rosapps/sysutils/ctm/En.rc 2005-11-21 13:46:20 UTC (rev
19407)
@@ -1,31 +1,32 @@
-// English (U.S.) resources
-
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-
-STRINGTABLE DISCARDABLE
-BEGIN
- IDS_APP_TITLE "Console TaskManager v0.1 by Aleksey Bragin
<aleksey(a)studiocerebral.com>"
-
- IDS_COLUMN_IMAGENAME "Image name "
- IDS_COLUMN_PID "PID "
- IDS_COLUMN_CPU "CPU"
- IDS_COLUMN_MEM "Mem Usage"
- IDS_COLUMN_MEM_UNIT "Kb"
- IDS_COLUMN_PF "Page Faults"
-
- IDS_IDLE_PROCESS "System Idle Process"
- IDS_YES "Y"
- IDS_NO "N"
-
- IDS_MENU "Press: q - quit, k - kill process"
- IDS_MENU_QUIT "Q"
- IDS_MENU_KILL_PROCESS "K"
-
- IDS_KILL_PROCESS "Are you sure you want to kill this process?
(y/n)"
- IDS_KILL_PROCESS_ERR1 "Unable to terminate this process..."
- IDS_KILL_PROCESS_ERR2 "Unable to terminate process %3d (unable to
OpenProcess)"
-
- IDS_CTM_GENERAL_ERR1 "ctm: can't use console."
- IDS_CTM_GENERAL_ERR2 "ctm: can't GetConsoleMode() for input
console."
- IDS_CTM_GENERAL_ERR3 "ctm: can't GetConsoleMode() for output
console."
-END
+// English (U.S.) resources
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_TITLE "Console TaskManager v0.1 by Aleksey Bragin
<aleksey(a)studiocerebral.com>"
+
+ IDS_COLUMN_NUMBER "# "
+ IDS_COLUMN_IMAGENAME "Image name "
+ IDS_COLUMN_PID "PID "
+ IDS_COLUMN_CPU "CPU"
+ IDS_COLUMN_MEM "Mem Usage"
+ IDS_COLUMN_MEM_UNIT "KB"
+ IDS_COLUMN_PF "Page Faults"
+
+ IDS_IDLE_PROCESS "System Idle Process"
+ IDS_YES "Y"
+ IDS_NO "N"
+
+ IDS_MENU "Press: q - quit, k - kill process"
+ IDS_MENU_QUIT "Q"
+ IDS_MENU_KILL_PROCESS "K"
+
+ IDS_KILL_PROCESS "Are you sure you want to kill this process?
(y/n)"
+ IDS_KILL_PROCESS_ERR1 "Unable to terminate this process..."
+ IDS_KILL_PROCESS_ERR2 "Unable to terminate process %d (unable to
OpenProcess)"
+
+ IDS_CTM_GENERAL_ERR1 "ctm: can't use console."
+ IDS_CTM_GENERAL_ERR2 "ctm: can't GetConsoleMode() for input
console."
+ IDS_CTM_GENERAL_ERR3 "ctm: can't GetConsoleMode() for output
console."
+END
Property changes on: trunk/rosapps/sysutils/ctm/En.rc
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Modified: trunk/rosapps/sysutils/ctm/Fr.rc
--- trunk/rosapps/sysutils/ctm/Fr.rc 2005-11-21 11:20:11 UTC (rev
19406)
+++ trunk/rosapps/sysutils/ctm/Fr.rc 2005-11-21 13:46:20 UTC (rev
19407)
@@ -1,31 +1,32 @@
-// French (France) resources
-
-LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
-
-STRINGTABLE DISCARDABLE
-BEGIN
- IDS_APP_TITLE "Console TaskManager v0.1 par Aleksey Bragin
<aleksey(a)studiocerebral.com>"
-
- IDS_COLUMN_IMAGENAME "Processus "
- IDS_COLUMN_PID "PID "
- IDS_COLUMN_CPU "CPU"
- IDS_COLUMN_MEM "Util. mÚm"
- IDS_COLUMN_MEM_UNIT "Ko"
- IDS_COLUMN_PF "DÚfauts de page"
-
- IDS_IDLE_PROCESS "Processus inactif du systÞme"
- IDS_YES "O"
- IDS_NO "N"
-
- IDS_MENU "Menu: Quitter (q), Tuer processus (t)"
- IDS_MENU_QUIT "Q"
- IDS_MENU_KILL_PROCESS "T"
-
- IDS_KILL_PROCESS "Etes-vous s¹r de vouloir tuer ce processus
(o/n) ?"
- IDS_KILL_PROCESS_ERR1 "Impossible de terminer ce processus..."
- IDS_KILL_PROCESS_ERR2 "Impossible de terminer le processus %3d
(erreur lors de OpenProcess)"
-
- IDS_CTM_GENERAL_ERR1 "ctm: impossible d'utiliser la console."
- IDS_CTM_GENERAL_ERR2 "ctm: impossible de rÚcupÚrer les paramÞtres
de la console d'entrÚe."
- IDS_CTM_GENERAL_ERR3 "ctm: impossible de rÚcupÚrer les paramÞtres
de la console de sortie."
-END
+// French (France) resources
+
+LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_TITLE "Console TaskManager v0.1 par Aleksey Bragin
<aleksey(a)studiocerebral.com>"
+
+ IDS_COLUMN_NUMBER "# "
+ IDS_COLUMN_IMAGENAME "Image name "
+ IDS_COLUMN_PID "PID "
+ IDS_COLUMN_CPU "CPU"
+ IDS_COLUMN_MEM "Util. mÚm"
+ IDS_COLUMN_MEM_UNIT "KO"
+ IDS_COLUMN_PF "DÚfauts de page"
+
+ IDS_IDLE_PROCESS "Processus inactif du systÞme"
+ IDS_YES "O"
+ IDS_NO "N"
+
+ IDS_MENU "Menu: Quitter (q), Tuer processus (t)"
+ IDS_MENU_QUIT "Q"
+ IDS_MENU_KILL_PROCESS "T"
+
+ IDS_KILL_PROCESS "Etes-vous s¹r de vouloir tuer ce processus
(o/n) ?"
+ IDS_KILL_PROCESS_ERR1 "Impossible de terminer ce processus..."
+ IDS_KILL_PROCESS_ERR2 "Impossible de terminer le processus %d
(erreur lors de OpenProcess)"
+
+ IDS_CTM_GENERAL_ERR1 "ctm: impossible d'utiliser la console."
+ IDS_CTM_GENERAL_ERR2 "ctm: impossible de rÚcupÚrer les paramÞtres
de la console d'entrÚe."
+ IDS_CTM_GENERAL_ERR3 "ctm: impossible de rÚcupÚrer les paramÞtres
de la console de sortie."
+END
Property changes on: trunk/rosapps/sysutils/ctm/Fr.rc
___________________________________________________________________
Name: svn:keywords
+ author date id revision
Name: svn:eol-style
+ native
_____
Modified: trunk/rosapps/sysutils/ctm/ctm.c
--- trunk/rosapps/sysutils/ctm/ctm.c 2005-11-21 11:20:11 UTC (rev
19406)
+++ trunk/rosapps/sysutils/ctm/ctm.c 2005-11-21 13:46:20 UTC (rev
19407)
@@ -10,7 +10,7 @@
Localization features added by HervÚ Poussineau
(hpoussin(a)reactos.org)
History:
- 24 October 2004 - added localization features
+ 24 October 2004 - added localization features
09 April 2003 - v0.1, fixed bugs, added features, ported to
mingw
20 March 2003 - v0.03, works good under ReactOS, and allows
process
killing
@@ -50,7 +50,6 @@
#include "ctm.h"
#include "resource.h"
-#define MAX_PROC 17
#define TIMES
HANDLE hStdin;
@@ -73,7 +72,8 @@
TCHAR KEY_QUIT, KEY_KILL;
TCHAR KEY_YES, KEY_NO;
-const int ProcPerScreen = 17; // 17 processess are
displayed on one page
+int ProcPerScreen = 17; // 17 processess are
displayed on one page
+int ScreenLines=25;
ULONG ProcessCountOld = 0;
ULONG ProcessCount = 0;
@@ -92,6 +92,7 @@
int first = 0; // first time in DisplayScreen
SYSTEM_BASIC_INFORMATION SystemBasicInfo;
+CONSOLE_SCREEN_BUFFER_INFO screenBufferInfo;
#define NEW_CONSOLE
// Functions that are needed by epsapi
@@ -138,32 +139,36 @@
void DisplayScreen()
{
COORD pos;
+ COORD size;
TCHAR lpStr[80];
DWORD numChars;
int lines;
int idx;
-
+ GetConsoleScreenBufferInfo(hStdout,&screenBufferInfo);
+ size=screenBufferInfo.dwSize;
+ ScreenLines=size.Y;
+ ProcPerScreen = ScreenLines-7;
if (first == 0)
{
// Header
- pos.X = 2; pos.Y = 2;
+ pos.X = 1; pos.Y = 1;
WriteConsoleOutputCharacter(hStdout, lpTitle,
_tcslen(lpTitle), pos, &numChars);
- pos.X = 2; pos.Y = 3;
+ pos.X = 1; pos.Y = 2;
WriteConsoleOutputCharacter(hStdout, lpSeparator,
_tcslen(lpSeparator), pos, &numChars);
- pos.X = 2; pos.Y = 4;
+ pos.X = 1; pos.Y = 3;
WriteConsoleOutputCharacter(hStdout, lpHeader,
_tcslen(lpHeader), pos, &numChars);
- pos.X = 2; pos.Y = 5;
+ pos.X = 1; pos.Y = 4;
WriteConsoleOutputCharacter(hStdout, lpSeparator,
_tcslen(lpSeparator), pos, &numChars);
// Footer
- pos.X = 2; pos.Y = ProcPerScreen+6;
+ pos.X = 1; pos.Y = ScreenLines-2;
WriteConsoleOutputCharacter(hStdout, lpSeparator,
_tcslen(lpSeparator), pos, &numChars);
// Menu
- pos.X = 2; pos.Y = ProcPerScreen+7;
+ pos.X = 1; pos.Y = ScreenLines-1;
WriteConsoleOutputCharacter(hStdout, lpEmpty,
_tcslen(lpEmpty), pos, &numChars);
WriteConsoleOutputCharacter(hStdout, lpMenu,
_tcslen(lpMenu), pos, &numChars);
@@ -172,11 +177,12 @@
// Processess
lines = ProcessCount;
- if (lines > MAX_PROC)
- lines = MAX_PROC;
- for (idx=0; idx<MAX_PROC; idx++)
+ if (lines > ProcPerScreen)
+ lines = ProcPerScreen;
+ for (idx=0; idx<ProcPerScreen; idx++)
{
int len, i;
+ TCHAR lpNumber[5];
TCHAR lpPid[8];
TCHAR lpCpu[6];
TCHAR lpMemUsg[12];
@@ -189,6 +195,11 @@
// data
if (idx < lines && scrolled + idx < ProcessCount)
{
+
+ // number
+ _stprintf(lpNumber, _T("%3d"), idx+scrolled);
+ _tcsncpy(&lpStr[2], lpNumber, 3);
+
// image name
#ifdef _UNICODE
len = wcslen(pPerfData[scrolled+idx].ImageName);
@@ -197,45 +208,45 @@
imgName, MAX_PATH, NULL, NULL);
len = strlen(imgName);
#endif
- if (len > columnRightPositions[0])
+ if (len > columnRightPositions[1])
{
- len = columnRightPositions[0];
+ len = columnRightPositions[1];
}
#ifdef _UNICODE
- wcsncpy(&lpStr[2], pPerfData[scrolled+idx].ImageName,
len);
+ wcsncpy(&lpStr[columnRightPositions[0]+3],
pPerfData[scrolled+idx].ImageName, len);
#else
- strncpy(&lpStr[2], imgName, len);
+ strncpy(&lpStr[columnRightPositions[0]+3], imgName,
len);
#endif
// PID
- _stprintf(lpPid, _T("%6ld"),
pPerfData[scrolled+idx].ProcessId);
- _tcsncpy(&lpStr[columnRightPositions[1] - 6],
lpPid, 6);
+ _stprintf(lpPid, _T("%6ld"),
pPerfData[scrolled+idx].ProcessId);
+ _tcsncpy(&lpStr[columnRightPositions[2] - 6],
lpPid, 6);
#ifdef TIMES
// CPU
_stprintf(lpCpu, _T("%3d%%"),
pPerfData[scrolled+idx].CPUUsage);
- _tcsncpy(&lpStr[columnRightPositions[2] - 4],
lpCpu, 4);
+ _tcsncpy(&lpStr[columnRightPositions[3] - 4],
lpCpu, 4);
#endif
// Mem usage
_stprintf(lpMemUsg, _T("%6ld %s"),
pPerfData[scrolled+idx].WorkingSetSizeBytes / 1024, lpMemUnit);
- _tcsncpy(&lpStr[columnRightPositions[3] - 9],
lpMemUsg, 9);
+ _tcsncpy(&lpStr[columnRightPositions[4] - 9],
lpMemUsg, 9);
// Page Fault
_stprintf(lpPageFaults, _T("%12ld"),
pPerfData[scrolled+idx].PageFaultCount);
- _tcsncpy(&lpStr[columnRightPositions[4] - 12],
lpPageFaults, 12);
+ _tcsncpy(&lpStr[columnRightPositions[5] - 12],
lpPageFaults, 12);
}
// columns
lpStr[0] = _T(' ');
lpStr[1] = _T('|');
- for (i = 0; i < 5; i++)
+ for (i = 0; i < 6; i++)
lpStr[columnRightPositions[i] + 1] = _T('|');
- pos.X = 1; pos.Y = 6+idx;
- WriteConsoleOutputCharacter(hStdout, lpStr, 74, pos,
&numChars);
+ pos.X = 0; pos.Y = 5+idx;
+ WriteConsoleOutputCharacter(hStdout, lpStr, 80, pos,
&numChars);
// Attributes now...
- pos.X = 3; pos.Y = 6+idx;
+ pos.X = columnRightPositions[0] + 1; pos.Y = 5+idx;
if (selection == idx)
{
wColor = BACKGROUND_GREEN |
@@ -254,7 +265,7 @@
FillConsoleOutputAttribute(
hStdout, // screen buffer handle
wColor, // color to fill with
- columnRightPositions[0] - 1, // number of
cells to fill
+ columnRightPositions[1] - 4, // number of
cells to fill
pos, // first cell to write to
&numChars); // actual number written
}
@@ -279,7 +290,7 @@
COORD pos;
TCHAR lpStr[100];
- pos.X = 2; pos.Y = 24;
+ pos.X = 1; pos.Y =ScreenLines-1;
if (LoadString(hInst, IDS_KILL_PROCESS, lpStr, 100))
WriteConsoleOutputCharacter(hStdout, lpStr,
_tcslen(lpStr), pos, &numChars);
@@ -331,12 +342,53 @@
}
else if (key == VK_DOWN)
{
- if ((selection < MAX_PROC-1) && (selection <
ProcessCount-1))
+ if ((selection < ProcPerScreen-1) && (selection <
ProcessCount-1))
selection++;
- else if ((selection == MAX_PROC-1) &&
(selection+scrolled < ProcessCount-1))
+ else if ((selection == ProcPerScreen-1) &&
(selection+scrolled < ProcessCount-1))
scrolled++;
}
+ else if (key == VK_PRIOR)
+ {
+ if (scrolled>ProcPerScreen-1)
+ scrolled-=ProcPerScreen-1;
+ else
+ {
+ scrolled=0; //First
+ selection=0;
+ }
+ //selection=0;
+ }
+ else if (key == VK_NEXT)
+ {
+ scrolled+=ProcPerScreen-1;
+ if (scrolled>ProcessCount-ProcPerScreen)
+ {
+ scrolled=ProcessCount-ProcPerScreen; //End
+ selection=ProcPerScreen-1;
+ }
+ //selection=ProcPerScreen-1;
+ if (ProcessCount<=ProcPerScreen) //If there are less
process than fits on the screen
+ {
+ scrolled=0;
+ selection=(ProcessCount%ProcPerScreen)-1;
+ }
+ }
+ else if (key == VK_HOME)
+ {
+ selection=0;
+ scrolled=0;
+ }
+ else if (key == VK_END)
+ {
+ selection=ProcPerScreen-1;
+ scrolled=ProcessCount-ProcPerScreen;
+ if (ProcessCount<=ProcPerScreen) //If there are less
process than fits on the screen
+ {
+ scrolled=0;
+ selection=(ProcessCount%ProcPerScreen)-1;
+ }
+ }
return FALSE;
}
@@ -561,43 +613,49 @@
/* Initialize global variables */
hInst = 0 /* FIXME: which value? [used with LoadString(hInst,
..., ..., ...)] */;
- if (LoadString(hInst, IDS_COLUMN_IMAGENAME, lpStr, 80))
+
+ if (LoadString(hInst, IDS_COLUMN_NUMBER, lpStr, 80))
{
- columnRightPositions[0] = _tcslen(lpStr);
+ columnRightPositions[0] = _tcslen(lpStr) + 3;
_tcsncpy(&lpHeader[2], lpStr, _tcslen(lpStr));
}
- if (LoadString(hInst, IDS_COLUMN_PID, lpStr, 80))
+ if (LoadString(hInst, IDS_COLUMN_IMAGENAME, lpStr, 80))
{
columnRightPositions[1] = columnRightPositions[0] +
_tcslen(lpStr) + 3;
_tcsncpy(&lpHeader[columnRightPositions[0] + 2], lpStr,
_tcslen(lpStr));
}
- if (LoadString(hInst, IDS_COLUMN_CPU, lpStr, 80))
+ if (LoadString(hInst, IDS_COLUMN_PID, lpStr, 80))
{
columnRightPositions[2] = columnRightPositions[1] +
_tcslen(lpStr) + 3;
_tcsncpy(&lpHeader[columnRightPositions[1] + 2], lpStr,
_tcslen(lpStr));
}
- if (LoadString(hInst, IDS_COLUMN_MEM, lpStr, 80))
+ if (LoadString(hInst, IDS_COLUMN_CPU, lpStr, 80))
{
columnRightPositions[3] = columnRightPositions[2] +
_tcslen(lpStr) + 3;
_tcsncpy(&lpHeader[columnRightPositions[2] + 2], lpStr,
_tcslen(lpStr));
}
- if (LoadString(hInst, IDS_COLUMN_PF, lpStr, 80))
+ if (LoadString(hInst, IDS_COLUMN_MEM, lpStr, 80))
{
columnRightPositions[4] = columnRightPositions[3] +
_tcslen(lpStr) + 3;
_tcsncpy(&lpHeader[columnRightPositions[3] + 2], lpStr,
_tcslen(lpStr));
}
+ if (LoadString(hInst, IDS_COLUMN_PF, lpStr, 80))
+ {
+ columnRightPositions[5] = columnRightPositions[4] +
_tcslen(lpStr) + 3;
+ _tcsncpy(&lpHeader[columnRightPositions[4] + 2], lpStr,
_tcslen(lpStr));
+ }
- for (i = 0; i < columnRightPositions[4]; i++)
+ for (i = 0; i < columnRightPositions[5]; i++)
lpSeparator[i] = _T('-');
lpHeader[0] = _T('|');
lpSeparator[0] = _T('+');
- for (i = 0; i < 5; i++)
+ for (i = 0; i < 6; i++)
{
lpHeader[columnRightPositions[i]] = _T('|');
lpSeparator[columnRightPositions[i]] = _T('+');
}
- lpSeparator[columnRightPositions[4] + 1] = _T('\0');
- lpHeader[columnRightPositions[4] + 1] = _T('\0');
+ lpSeparator[columnRightPositions[5] + 1] = _T('\0');
+ lpHeader[columnRightPositions[5] + 1] = _T('\0');
if (!LoadString(hInst, IDS_APP_TITLE, lpTitle, 80))
_____
Modified: trunk/rosapps/sysutils/ctm/ctm.rc
--- trunk/rosapps/sysutils/ctm/ctm.rc 2005-11-21 11:20:11 UTC (rev
19406)
+++ trunk/rosapps/sysutils/ctm/ctm.rc 2005-11-21 13:46:20 UTC (rev
19407)
@@ -11,3 +11,4 @@
#include "En.rc"
#include "Fr.rc"
+#include "De.rc"
_____
Modified: trunk/rosapps/sysutils/ctm/resource.h
--- trunk/rosapps/sysutils/ctm/resource.h 2005-11-21 11:20:11 UTC
(rev 19406)
+++ trunk/rosapps/sysutils/ctm/resource.h 2005-11-21 13:46:20 UTC
(rev 19407)
@@ -20,12 +20,13 @@
#define IDS_APP_TITLE 0
-#define IDS_COLUMN_IMAGENAME 10
-#define IDS_COLUMN_PID 11
-#define IDS_COLUMN_CPU 12
-#define IDS_COLUMN_MEM 13
-#define IDS_COLUMN_MEM_UNIT 14
-#define IDS_COLUMN_PF 15
+#define IDS_COLUMN_NUMBER 10
+#define IDS_COLUMN_IMAGENAME 11
+#define IDS_COLUMN_PID 12
+#define IDS_COLUMN_CPU 13
+#define IDS_COLUMN_MEM 14
+#define IDS_COLUMN_MEM_UNIT 15
+#define IDS_COLUMN_PF 16
#define IDS_IDLE_PROCESS 100
#define IDS_YES 101