taskmgr: Avoid forward declarations and make functions static (3/3)

Francois Gouget fgouget at free.fr
Tue Mar 21 11:35:41 CST 2006


Changelog:

  * programs/taskmgr/taskmgr.c

    Francois Gouget <fgouget at free.fr>
    Reorder functions to avoid forward declarations.
    Make functions static whenever possible.

-- 
Francois Gouget <fgouget at free.fr>              http://fgouget.free.fr/
                      Avoid the Gates of Hell - use Linux.
-------------- next part --------------
Index: programs/taskmgr/taskmgr.c
===================================================================
RCS file: /home/wine/wine/programs/taskmgr/taskmgr.c,v
retrieving revision 1.7
diff -u -p -r1.7 taskmgr.c
--- programs/taskmgr/taskmgr.c	17 Mar 2006 12:24:06 -0000	1.7
+++ programs/taskmgr/taskmgr.c	21 Mar 2006 14:29:13 -0000
@@ -55,421 +55,84 @@ BOOL bInMenuLoop = FALSE;        /* Tell
 TASKMANAGER_SETTINGS TaskManagerSettings;
 
 
-int APIENTRY WinMain(HINSTANCE hInstance,
-                     HINSTANCE hPrevInstance,
-                     LPSTR     lpCmdLine,
-                     int       nCmdShow)
+void FillSolidRect(HDC hDC, LPCRECT lpRect, COLORREF clr)
 {
-    HANDLE hProcess;
-    HANDLE hToken; 
-    TOKEN_PRIVILEGES tkp; 
-
-    /* Initialize global variables */
-    hInst = hInstance;
+    SetBkColor(hDC, clr);
+    ExtTextOut(hDC, 0, 0, ETO_OPAQUE, lpRect, NULL, 0, NULL);
+}
 
-    /* Change our priority class to HIGH */
-    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
-    SetPriorityClass(hProcess, HIGH_PRIORITY_CLASS);
-    CloseHandle(hProcess);
+void FillSolidRect2(HDC hDC, int x, int y, int cx, int cy, COLORREF clr)
+{
+    RECT rect;
 
-    /* Now let's get the SE_DEBUG_NAME privilege
-     * so that we can debug processes 
-     */
+    SetBkColor(hDC, clr);
+    rect.left = x;
+    rect.top = y;
+    rect.right = x + cx;
+    rect.bottom = y + cy;
+    ExtTextOut(hDC, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL);
+}
 
-    /* Get a token for this process.  */
-    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
-        /* Get the LUID for the debug privilege.  */
-        LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid); 
+void Draw3dRect(HDC hDC, int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight)
+{
+    FillSolidRect2(hDC, x, y, cx - 1, 1, clrTopLeft);
+    FillSolidRect2(hDC, x, y, 1, cy - 1, clrTopLeft);
+    FillSolidRect2(hDC, x + cx, y, -1, cy, clrBottomRight);
+    FillSolidRect2(hDC, x, y + cy, cx, -1, clrBottomRight);
+}
 
-        tkp.PrivilegeCount = 1;  /* one privilege to set */
-        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
+void Draw3dRect2(HDC hDC, LPRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight)
+{
+    Draw3dRect(hDC, lpRect->left, lpRect->top, lpRect->right - lpRect->left,
+        lpRect->bottom - lpRect->top, clrTopLeft, clrBottomRight);
+}
 
-        /* Get the debug privilege for this process. */
-        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); 
-    }
+void Font_DrawText(HDC hDC, LPCTSTR lpszText, int x, int y)
+{
+    HDC        hFontDC;
+    HBITMAP    hFontBitmap;
+    HBITMAP    hOldBitmap;
+    int        i;
 
-    /* Load our settings from the registry */
-    LoadSettings();
+    hFontDC = CreateCompatibleDC(hDC);
+    hFontBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FONT));
+    hOldBitmap = (HBITMAP)SelectObject(hFontDC, hFontBitmap);
 
-    /* Initialize perf data */
-    if (!PerfDataInitialize()) {
-        return -1;
+    for (i = 0; i < (int)_tcslen(lpszText); i++) {
+        if ((lpszText[i] >= '0') && (lpszText[i] <= '9')) {
+            BitBlt(hDC, x + (i * 8), y, 8, 11, hFontDC, (lpszText[i] - '0') * 8, 0, SRCCOPY);
+        }
+        else if (lpszText[i] == 'K')
+        {
+            BitBlt(hDC, x + (i * 8), y, 8, 11, hFontDC, 80, 0, SRCCOPY);
+        }
+        else if (lpszText[i] == '%')
+        {
+            BitBlt(hDC, x + (i * 8), y, 8, 11, hFontDC, 88, 0, SRCCOPY);
+        }
     }
-
-    DialogBox(hInst, (LPCTSTR)IDD_TASKMGR_DIALOG, NULL, TaskManagerWndProc);
- 
-    /* Save our settings to the registry */
-    SaveSettings();
-    PerfDataUninitialize();
-    return 0;
+    SelectObject(hFontDC, hOldBitmap);
+    DeleteObject(hFontBitmap);
+    DeleteDC(hFontDC);
 }
 
-/* Message handler for dialog box. */
-INT_PTR CALLBACK
-TaskManagerWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+static BOOL OnCreate(HWND hWnd)
 {
-    HDC             hdc;
-    PAINTSTRUCT     ps;
-    LPRECT          pRC;
-    RECT            rc;
-    int             idctrl;
-    LPNMHDR         pnmh;
-    WINDOWPLACEMENT wp;
+    HMENU   hMenu;
+    HMENU   hEditMenu;
+    HMENU   hViewMenu;
+    HMENU   hUpdateSpeedMenu;
+    HMENU   hCPUHistoryMenu;
+    int     nActivePage;
+    int     nParts[3];
+    RECT    rc;
+    TCHAR   szTemp[256];
+    TCITEM  item;
 
-    switch (message) {
-    case WM_INITDIALOG:
-        hMainWnd = hDlg;
-        return OnCreate(hDlg);
+    SendMessage(hMainWnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_TASKMANAGER)));
 
-    case WM_COMMAND:
-        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
-            EndDialog(hDlg, LOWORD(wParam));
-            return TRUE;
-        }
-        /* Process menu commands */
-        switch (LOWORD(wParam))
-        {
-        case ID_FILE_NEW:
-            TaskManager_OnFileNew();
-            break;
-        case ID_OPTIONS_ALWAYSONTOP:
-            TaskManager_OnOptionsAlwaysOnTop();
-            break;
-        case ID_OPTIONS_MINIMIZEONUSE:
-            TaskManager_OnOptionsMinimizeOnUse();
-            break;
-        case ID_OPTIONS_HIDEWHENMINIMIZED:
-            TaskManager_OnOptionsHideWhenMinimized();
-            break;
-        case ID_OPTIONS_SHOW16BITTASKS:
-            TaskManager_OnOptionsShow16BitTasks();
-            break;
-        case ID_RESTORE:
-            TaskManager_OnRestoreMainWindow();
-            break;
-        case ID_VIEW_LARGE:
-            ApplicationPage_OnViewLargeIcons();
-            break;
-        case ID_VIEW_SMALL:
-            ApplicationPage_OnViewSmallIcons();
-            break;
-        case ID_VIEW_DETAILS:
-            ApplicationPage_OnViewDetails();
-            break;
-        case ID_VIEW_SHOWKERNELTIMES:
-            PerformancePage_OnViewShowKernelTimes();
-            break;
-        case ID_VIEW_CPUHISTORY_ONEGRAPHALL:
-            PerformancePage_OnViewCPUHistoryOneGraphAll();
-            break;
-        case ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU:
-            PerformancePage_OnViewCPUHistoryOneGraphPerCPU();
-            break;
-        case ID_VIEW_UPDATESPEED_HIGH:
-            TaskManager_OnViewUpdateSpeedHigh();
-            break;
-        case ID_VIEW_UPDATESPEED_NORMAL:
-            TaskManager_OnViewUpdateSpeedNormal();
-            break;
-        case ID_VIEW_UPDATESPEED_LOW:
-            TaskManager_OnViewUpdateSpeedLow();
-            break;
-        case ID_VIEW_UPDATESPEED_PAUSED:
-            TaskManager_OnViewUpdateSpeedPaused();
-            break;
-        case ID_VIEW_SELECTCOLUMNS:
-            ProcessPage_OnViewSelectColumns();
-            break;
-        case ID_VIEW_REFRESH:
-            PostMessage(hDlg, WM_TIMER, 0, 0);
-            break;
-        case ID_WINDOWS_TILEHORIZONTALLY:
-            ApplicationPage_OnWindowsTileHorizontally();
-            break;
-        case ID_WINDOWS_TILEVERTICALLY:
-            ApplicationPage_OnWindowsTileVertically();
-            break;
-        case ID_WINDOWS_MINIMIZE:
-            ApplicationPage_OnWindowsMinimize();
-            break;
-        case ID_WINDOWS_MAXIMIZE:
-            ApplicationPage_OnWindowsMaximize();
-            break;
-        case ID_WINDOWS_CASCADE:
-            ApplicationPage_OnWindowsCascade();
-            break;
-        case ID_WINDOWS_BRINGTOFRONT:
-            ApplicationPage_OnWindowsBringToFront();
-            break;
-        case ID_APPLICATION_PAGE_SWITCHTO:
-            ApplicationPage_OnSwitchTo();
-            break;
-        case ID_APPLICATION_PAGE_ENDTASK:
-            ApplicationPage_OnEndTask();
-            break;
-        case ID_APPLICATION_PAGE_GOTOPROCESS:
-            ApplicationPage_OnGotoProcess();
-            break;
-        case ID_PROCESS_PAGE_ENDPROCESS:
-            ProcessPage_OnEndProcess();
-            break;
-        case ID_PROCESS_PAGE_ENDPROCESSTREE:
-            ProcessPage_OnEndProcessTree();
-            break;
-        case ID_PROCESS_PAGE_DEBUG:
-            ProcessPage_OnDebug();
-            break;
-        case ID_PROCESS_PAGE_SETAFFINITY:
-            ProcessPage_OnSetAffinity();
-            break;
-        case ID_PROCESS_PAGE_SETPRIORITY_REALTIME:
-            ProcessPage_OnSetPriorityRealTime();
-            break;
-        case ID_PROCESS_PAGE_SETPRIORITY_HIGH:
-            ProcessPage_OnSetPriorityHigh();
-            break;
-        case ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL:
-            ProcessPage_OnSetPriorityAboveNormal();
-            break;
-        case ID_PROCESS_PAGE_SETPRIORITY_NORMAL:
-            ProcessPage_OnSetPriorityNormal();
-            break;
-        case ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL:
-            ProcessPage_OnSetPriorityBelowNormal();
-            break;
-        case ID_PROCESS_PAGE_SETPRIORITY_LOW:
-            ProcessPage_OnSetPriorityLow();
-            break;
-        case ID_PROCESS_PAGE_DEBUGCHANNELS:
-            ProcessPage_OnDebugChannels();
-            break;
-        case ID_HELP_ABOUT:
-            OnAbout();
-            break;
-        case ID_FILE_EXIT:
-            EndDialog(hDlg, IDOK);
-            break;
-        }     
-        break;
-
-    case WM_ONTRAYICON:
-        switch(lParam)
-        {
-        case WM_RBUTTONDOWN:
-            {
-            POINT pt;
-            BOOL OnTop;
-            HMENU hMenu, hPopupMenu;
-            
-            GetCursorPos(&pt);
-            
-            OnTop = ((GetWindowLong(hMainWnd, GWL_EXSTYLE) & WS_EX_TOPMOST) != 0);
-            
-            hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_TRAY_POPUP));
-            hPopupMenu = GetSubMenu(hMenu, 0);
-            
-            if(IsWindowVisible(hMainWnd))
-            {
-              DeleteMenu(hPopupMenu, ID_RESTORE, MF_BYCOMMAND);
-            }
-            else
-            {
-              SetMenuDefaultItem(hPopupMenu, ID_RESTORE, FALSE);
-            }
-            
-            if(OnTop)
-            {
-              CheckMenuItem(hPopupMenu, ID_OPTIONS_ALWAYSONTOP, MF_BYCOMMAND | MF_CHECKED);
-            }
-            
-            SetForegroundWindow(hMainWnd);
-            TrackPopupMenuEx(hPopupMenu, 0, pt.x, pt.y, hMainWnd, NULL);
-            
-            DestroyMenu(hMenu);
-            break;
-            }
-        case WM_LBUTTONDBLCLK:
-            TaskManager_OnRestoreMainWindow();
-            break;
-        }
-        break;
-
-    case WM_NOTIFY:
-        idctrl = (int)wParam;
-        pnmh = (LPNMHDR)lParam;
-        if ((pnmh->hwndFrom == hTabWnd) &&
-            (pnmh->idFrom == IDC_TAB) &&
-            (pnmh->code == TCN_SELCHANGE))
-        {
-            TaskManager_OnTabWndSelChange();
-        }
-        break;
-
-    case WM_NCPAINT:
-        hdc = GetDC(hDlg);
-        GetClientRect(hDlg, &rc);
-        Draw3dRect(hdc, rc.left, rc.top, rc.right, rc.top + 2, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
-        ReleaseDC(hDlg, hdc);
-        break;
-
-    case WM_PAINT:
-        hdc = BeginPaint(hDlg, &ps);
-        GetClientRect(hDlg, &rc);
-        Draw3dRect(hdc, rc.left, rc.top, rc.right, rc.top + 2, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
-        EndPaint(hDlg, &ps);
-        break;
-
-    case WM_SIZING:
-        /* Make sure the user is sizing the dialog */
-        /* in an acceptable range */
-        pRC = (LPRECT)lParam;
-        if ((wParam == WMSZ_LEFT) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_BOTTOMLEFT)) {
-            /* If the width is too small enlarge it to the minimum */
-            if (nMinimumWidth > (pRC->right - pRC->left))
-                pRC->left = pRC->right - nMinimumWidth;
-        } else {
-            /* If the width is too small enlarge it to the minimum */
-            if (nMinimumWidth > (pRC->right - pRC->left))
-                pRC->right = pRC->left + nMinimumWidth;
-        }
-        if ((wParam == WMSZ_TOP) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_TOPRIGHT)) {
-            /* If the height is too small enlarge it to the minimum */
-            if (nMinimumHeight > (pRC->bottom - pRC->top))
-                pRC->top = pRC->bottom - nMinimumHeight;
-        } else {
-            /* If the height is too small enlarge it to the minimum */
-            if (nMinimumHeight > (pRC->bottom - pRC->top))
-                pRC->bottom = pRC->top + nMinimumHeight;
-        }
-        return TRUE;
-        break;
-
-    case WM_SIZE:
-        /* Handle the window sizing in it's own function */
-        OnSize(wParam, LOWORD(lParam), HIWORD(lParam));
-        break;
-
-    case WM_MOVE:
-        /* Handle the window moving in it's own function */
-        OnMove(wParam, LOWORD(lParam), HIWORD(lParam));
-        break;
-
-    case WM_DESTROY:
-        ShowWindow(hDlg, SW_HIDE);
-        TrayIcon_ShellRemoveTrayIcon();
-        wp.length = sizeof(WINDOWPLACEMENT);
-        GetWindowPlacement(hDlg, &wp);
-        TaskManagerSettings.Left = wp.rcNormalPosition.left;
-        TaskManagerSettings.Top = wp.rcNormalPosition.top;
-        TaskManagerSettings.Right = wp.rcNormalPosition.right;
-        TaskManagerSettings.Bottom = wp.rcNormalPosition.bottom;
-        if (IsZoomed(hDlg) || (wp.flags & WPF_RESTORETOMAXIMIZED))
-            TaskManagerSettings.Maximized = TRUE;
-        else
-            TaskManagerSettings.Maximized = FALSE;
-        return DefWindowProc(hDlg, message, wParam, lParam);
-        
-    case WM_TIMER:
-        /* Refresh the performance data */
-        PerfDataRefresh();
-        RefreshApplicationPage();
-        RefreshProcessPage();
-        RefreshPerformancePage();
-        TrayIcon_ShellUpdateTrayIcon();
-        break;
-
-    case WM_ENTERMENULOOP:
-        TaskManager_OnEnterMenuLoop(hDlg);
-        break;
-    case WM_EXITMENULOOP:
-        TaskManager_OnExitMenuLoop(hDlg);
-        break;
-    case WM_MENUSELECT:
-        TaskManager_OnMenuSelect(hDlg, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam);
-        break;
-    }
-
-    return 0;
-}
-
-void FillSolidRect(HDC hDC, LPCRECT lpRect, COLORREF clr)
-{
-    SetBkColor(hDC, clr);
-    ExtTextOut(hDC, 0, 0, ETO_OPAQUE, lpRect, NULL, 0, NULL);
-}
-
-void FillSolidRect2(HDC hDC, int x, int y, int cx, int cy, COLORREF clr)
-{
-    RECT rect;
-
-    SetBkColor(hDC, clr);
-    rect.left = x;
-    rect.top = y;
-    rect.right = x + cx;
-    rect.bottom = y + cy;
-    ExtTextOut(hDC, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL);
-}
-
-void Draw3dRect(HDC hDC, int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight)
-{
-    FillSolidRect2(hDC, x, y, cx - 1, 1, clrTopLeft);
-    FillSolidRect2(hDC, x, y, 1, cy - 1, clrTopLeft);
-    FillSolidRect2(hDC, x + cx, y, -1, cy, clrBottomRight);
-    FillSolidRect2(hDC, x, y + cy, cx, -1, clrBottomRight);
-}
-
-void Draw3dRect2(HDC hDC, LPRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight)
-{
-    Draw3dRect(hDC, lpRect->left, lpRect->top, lpRect->right - lpRect->left,
-        lpRect->bottom - lpRect->top, clrTopLeft, clrBottomRight);
-}
-
-void Font_DrawText(HDC hDC, LPCTSTR lpszText, int x, int y)
-{
-    HDC        hFontDC;
-    HBITMAP    hFontBitmap;
-    HBITMAP    hOldBitmap;
-    int        i;
-
-    hFontDC = CreateCompatibleDC(hDC);
-    hFontBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FONT));
-    hOldBitmap = (HBITMAP)SelectObject(hFontDC, hFontBitmap);
-
-    for (i = 0; i < (int)_tcslen(lpszText); i++) {
-        if ((lpszText[i] >= '0') && (lpszText[i] <= '9')) {
-            BitBlt(hDC, x + (i * 8), y, 8, 11, hFontDC, (lpszText[i] - '0') * 8, 0, SRCCOPY);
-        }
-        else if (lpszText[i] == 'K')
-        {
-            BitBlt(hDC, x + (i * 8), y, 8, 11, hFontDC, 80, 0, SRCCOPY);
-        }
-        else if (lpszText[i] == '%')
-        {
-            BitBlt(hDC, x + (i * 8), y, 8, 11, hFontDC, 88, 0, SRCCOPY);
-        }
-    }
-    SelectObject(hFontDC, hOldBitmap);
-    DeleteObject(hFontBitmap);
-    DeleteDC(hFontDC);
-}
-
-BOOL OnCreate(HWND hWnd)
-{
-    HMENU   hMenu;
-    HMENU   hEditMenu;
-    HMENU   hViewMenu;
-    HMENU   hUpdateSpeedMenu;
-    HMENU   hCPUHistoryMenu;
-    int     nActivePage;
-    int     nParts[3];
-    RECT    rc;
-    TCHAR   szTemp[256];
-    TCITEM  item;
-
-    SendMessage(hMainWnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_TASKMANAGER)));
-
-    /* Initialize the Windows Common Controls DLL */
-    InitCommonControls();
+    /* Initialize the Windows Common Controls DLL */
+    InitCommonControls();
 
     /* Get the minimum window sizes */
     GetWindowRect(hWnd, &rc);
@@ -637,7 +300,7 @@ BOOL OnCreate(HWND hWnd)
  * This function handles all the moving events for the application
  * It moves every child window that needs moving
  */
-void OnMove( UINT nType, int cx, int cy )
+static void OnMove( UINT nType, int cx, int cy )
 {
 #ifdef __GNUC__TEST__
     MoveWindow(hApplicationPage, TaskManagerSettings.Left + PAGE_OFFSET_LEFT, TaskManagerSettings.Top + PAGE_OFFSET_TOP, TaskManagerSettings.Right - TaskManagerSettings.Left - PAGE_OFFSET_WIDTH, TaskManagerSettings.Bottom - TaskManagerSettings.Top - PAGE_OFFSET_HEIGHT, FALSE);
@@ -650,7 +313,7 @@ void OnMove( UINT nType, int cx, int cy 
  * This function handles all the sizing events for the application
  * It re-sizes every window, and child window that needs re-sizing
  */
-void OnSize( UINT nType, int cx, int cy )
+static void OnSize( UINT nType, int cx, int cy )
 {
     int     nParts[3];
     int     nXDifference;
@@ -706,7 +369,7 @@ void OnSize( UINT nType, int cx, int cy 
     SetWindowPos(hPerformancePage, NULL, 0, 0, cx, cy, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOMOVE|SWP_NOZORDER);
 }
 
-void LoadSettings(void)
+static void LoadSettings(void)
 {
     HKEY    hKey;
     TCHAR   szSubKey[] = _T("Software\\Wine\\TaskManager");
@@ -813,7 +476,7 @@ void LoadSettings(void)
     RegCloseKey(hKey);
 }
 
-void SaveSettings(void)
+static void SaveSettings(void)
 {
     HKEY hKey;
     TCHAR szSubKey3[] = _T("Software\\Wine\\TaskManager");
@@ -829,7 +492,7 @@ void SaveSettings(void)
     RegCloseKey(hKey);
 }
 
-void TaskManager_OnRestoreMainWindow(void)
+static void TaskManager_OnRestoreMainWindow(void)
 {
   HMENU hMenu, hOptionsMenu;
   BOOL OnTop;
@@ -843,7 +506,7 @@ void TaskManager_OnRestoreMainWindow(voi
   SetWindowPos(hMainWnd, (OnTop ? HWND_TOPMOST : HWND_TOP), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
 }
 
-void TaskManager_OnEnterMenuLoop(HWND hWnd)
+static void TaskManager_OnEnterMenuLoop(HWND hWnd)
 {
     int nParts;
 
@@ -854,7 +517,7 @@ void TaskManager_OnEnterMenuLoop(HWND hW
     SendMessage(hStatusWnd, SB_SETTEXT, (WPARAM)0, (LPARAM)_T(""));
 }
 
-void TaskManager_OnExitMenuLoop(HWND hWnd)
+static void TaskManager_OnExitMenuLoop(HWND hWnd)
 {
     RECT  rc;
     int   nParts[3];
@@ -874,7 +537,7 @@ void TaskManager_OnExitMenuLoop(HWND hWn
     SendMessage(hStatusWnd, SB_SETTEXT, 0, (LPARAM)text);
 }
 
-void TaskManager_OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMenu)
+static void TaskManager_OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMenu)
 {
     TCHAR str[100];
 
@@ -890,7 +553,7 @@ void TaskManager_OnMenuSelect(HWND hWnd,
     SendMessage(hStatusWnd, SB_SETTEXT, 0, (LPARAM)str);
 }
 
-void TaskManager_OnViewUpdateSpeedHigh(void)
+static void TaskManager_OnViewUpdateSpeedHigh(void)
 {
     HMENU hMenu;
     HMENU hViewMenu;
@@ -907,177 +570,509 @@ void TaskManager_OnViewUpdateSpeedHigh(v
     SetTimer(hMainWnd, 1, 1000, NULL);
 }
 
-void TaskManager_OnViewUpdateSpeedNormal(void)
+static void TaskManager_OnViewUpdateSpeedNormal(void)
+{
+    HMENU hMenu;
+    HMENU hViewMenu;
+    HMENU hUpdateSpeedMenu;
+
+    hMenu = GetMenu(hMainWnd);
+    hViewMenu = GetSubMenu(hMenu, 2);
+    hUpdateSpeedMenu = GetSubMenu(hViewMenu, 1);
+
+    TaskManagerSettings.UpdateSpeed = 2;
+    CheckMenuRadioItem(hUpdateSpeedMenu, ID_VIEW_UPDATESPEED_HIGH, ID_VIEW_UPDATESPEED_PAUSED, ID_VIEW_UPDATESPEED_NORMAL, MF_BYCOMMAND);
+
+    KillTimer(hMainWnd, 1);
+    SetTimer(hMainWnd, 1, 2000, NULL);
+}
+
+static void TaskManager_OnViewUpdateSpeedLow(void)
+{
+    HMENU hMenu;
+    HMENU hViewMenu;
+    HMENU hUpdateSpeedMenu;
+
+    hMenu = GetMenu(hMainWnd);
+    hViewMenu = GetSubMenu(hMenu, 2);
+    hUpdateSpeedMenu = GetSubMenu(hViewMenu, 1);
+
+    TaskManagerSettings.UpdateSpeed = 4;
+    CheckMenuRadioItem(hUpdateSpeedMenu, ID_VIEW_UPDATESPEED_HIGH, ID_VIEW_UPDATESPEED_PAUSED, ID_VIEW_UPDATESPEED_LOW, MF_BYCOMMAND);
+
+    KillTimer(hMainWnd, 1);
+    SetTimer(hMainWnd, 1, 4000, NULL);
+}
+
+static void TaskManager_OnViewUpdateSpeedPaused(void)
 {
     HMENU hMenu;
     HMENU hViewMenu;
     HMENU hUpdateSpeedMenu;
 
-    hMenu = GetMenu(hMainWnd);
-    hViewMenu = GetSubMenu(hMenu, 2);
-    hUpdateSpeedMenu = GetSubMenu(hViewMenu, 1);
+    hMenu = GetMenu(hMainWnd);
+    hViewMenu = GetSubMenu(hMenu, 2);
+    hUpdateSpeedMenu = GetSubMenu(hViewMenu, 1);
+    TaskManagerSettings.UpdateSpeed = 0;
+    CheckMenuRadioItem(hUpdateSpeedMenu, ID_VIEW_UPDATESPEED_HIGH, ID_VIEW_UPDATESPEED_PAUSED, ID_VIEW_UPDATESPEED_PAUSED, MF_BYCOMMAND);
+    KillTimer(hMainWnd, 1);
+}
+
+static void TaskManager_OnTabWndSelChange(void)
+{
+    int   i;
+    HMENU hMenu;
+    HMENU hOptionsMenu;
+    HMENU hViewMenu;
+    HMENU hSubMenu;
+
+    hMenu = GetMenu(hMainWnd);
+    hViewMenu = GetSubMenu(hMenu, 2);
+    hOptionsMenu = GetSubMenu(hMenu, 1);
+    TaskManagerSettings.ActiveTabPage = TabCtrl_GetCurSel(hTabWnd);
+    for (i = GetMenuItemCount(hViewMenu) - 1; i > 2; i--) {
+        hSubMenu = GetSubMenu(hViewMenu, i);
+        if (hSubMenu)
+            DestroyMenu(hSubMenu);
+        RemoveMenu(hViewMenu, i, MF_BYPOSITION);
+    }
+    RemoveMenu(hOptionsMenu, 3, MF_BYPOSITION);
+    switch (TaskManagerSettings.ActiveTabPage) {
+    case 0:
+        ShowWindow(hApplicationPage, SW_SHOW);
+        ShowWindow(hProcessPage, SW_HIDE);
+        ShowWindow(hPerformancePage, SW_HIDE);
+        BringWindowToTop(hApplicationPage);
+        AppendMenu(hViewMenu, MF_STRING, ID_VIEW_LARGE, _T("Lar&ge Icons"));
+        AppendMenu(hViewMenu, MF_STRING, ID_VIEW_SMALL, _T("S&mall Icons"));
+        AppendMenu(hViewMenu, MF_STRING, ID_VIEW_DETAILS, _T("&Details"));
+
+        if (GetMenuItemCount(hMenu) <= 4) {
+            hSubMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_WINDOWSMENU));
+            InsertMenu(hMenu, 3, MF_BYPOSITION|MF_POPUP, (UINT)hSubMenu, _T("&Windows"));
+            DrawMenuBar(hMainWnd);
+        }
+        if (TaskManagerSettings.View_LargeIcons)
+            CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_LARGE, MF_BYCOMMAND);
+        else if (TaskManagerSettings.View_SmallIcons)
+            CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_SMALL, MF_BYCOMMAND);
+        else
+            CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_DETAILS, MF_BYCOMMAND);
+        /*
+         * Give the application list control focus
+         */
+        SetFocus(hApplicationPageListCtrl);
+        break;
+
+    case 1:
+        ShowWindow(hApplicationPage, SW_HIDE);
+        ShowWindow(hProcessPage, SW_SHOW);
+        ShowWindow(hPerformancePage, SW_HIDE);
+        BringWindowToTop(hProcessPage);
+        AppendMenu(hViewMenu, MF_STRING, ID_VIEW_SELECTCOLUMNS, _T("&Select Columns..."));
+        AppendMenu(hOptionsMenu, MF_STRING, ID_OPTIONS_SHOW16BITTASKS, _T("&Show 16-bit tasks"));
+        if (TaskManagerSettings.Show16BitTasks)
+            CheckMenuItem(hOptionsMenu, ID_OPTIONS_SHOW16BITTASKS, MF_BYCOMMAND|MF_CHECKED);
+        if (GetMenuItemCount(hMenu) > 4)
+        {
+            RemoveMenu(hMenu, 3, MF_BYPOSITION);
+            DrawMenuBar(hMainWnd);
+        }
+        /*
+         * Give the process list control focus
+         */
+        SetFocus(hProcessPageListCtrl);
+        break;
+
+    case 2:
+        ShowWindow(hApplicationPage, SW_HIDE);
+        ShowWindow(hProcessPage, SW_HIDE);
+        ShowWindow(hPerformancePage, SW_SHOW);
+        BringWindowToTop(hPerformancePage);
+        if (GetMenuItemCount(hMenu) > 4) {
+            RemoveMenu(hMenu, 3, MF_BYPOSITION);
+            DrawMenuBar(hMainWnd);
+        }
+        hSubMenu = CreatePopupMenu();
+        AppendMenu(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHALL, _T("&One Graph, All CPUs"));
+        AppendMenu(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, _T("One Graph &Per CPU"));
+        AppendMenu(hViewMenu, MF_STRING|MF_POPUP, (UINT)hSubMenu, _T("&CPU History"));
+        AppendMenu(hViewMenu, MF_STRING, ID_VIEW_SHOWKERNELTIMES, _T("&Show Kernel Times"));
+        if (TaskManagerSettings.ShowKernelTimes)
+            CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_CHECKED);
+        else
+            CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_UNCHECKED);
+        if (TaskManagerSettings.CPUHistory_OneGraphPerCPU)
+            CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, MF_BYCOMMAND);
+        else
+            CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHALL, MF_BYCOMMAND);
+        /*
+         * Give the tab control focus
+         */
+        SetFocus(hTabWnd);
+        break;
+    }
+}
+
+LPTSTR GetLastErrorText(LPTSTR lpszBuf, DWORD dwSize)
+{
+    DWORD  dwRet;
+    LPTSTR lpszTemp = NULL;
+
+    dwRet = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
+                           NULL,
+                           GetLastError(),
+                           LANG_NEUTRAL,
+                           (LPTSTR)&lpszTemp,
+                           0,
+                           NULL );
+
+    /* supplied buffer is not long enough */
+    if (!dwRet || ( (long)dwSize < (long)dwRet+14)) {
+        lpszBuf[0] = TEXT('\0');
+    } else {
+        lpszTemp[lstrlen(lpszTemp)-2] = TEXT('\0');  /*remove cr and newline character */
+        _stprintf(lpszBuf, TEXT("%s (0x%x)"), lpszTemp, (int)GetLastError());
+    }
+    if (lpszTemp) {
+        LocalFree((HLOCAL)lpszTemp);
+    }
+    return lpszBuf;
+}
+
+/* Message handler for dialog box. */
+static INT_PTR CALLBACK
+TaskManagerWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    HDC             hdc;
+    PAINTSTRUCT     ps;
+    LPRECT          pRC;
+    RECT            rc;
+    int             idctrl;
+    LPNMHDR         pnmh;
+    WINDOWPLACEMENT wp;
+
+    switch (message) {
+    case WM_INITDIALOG:
+        hMainWnd = hDlg;
+        return OnCreate(hDlg);
+
+    case WM_COMMAND:
+        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
+            EndDialog(hDlg, LOWORD(wParam));
+            return TRUE;
+        }
+        /* Process menu commands */
+        switch (LOWORD(wParam))
+        {
+        case ID_FILE_NEW:
+            TaskManager_OnFileNew();
+            break;
+        case ID_OPTIONS_ALWAYSONTOP:
+            TaskManager_OnOptionsAlwaysOnTop();
+            break;
+        case ID_OPTIONS_MINIMIZEONUSE:
+            TaskManager_OnOptionsMinimizeOnUse();
+            break;
+        case ID_OPTIONS_HIDEWHENMINIMIZED:
+            TaskManager_OnOptionsHideWhenMinimized();
+            break;
+        case ID_OPTIONS_SHOW16BITTASKS:
+            TaskManager_OnOptionsShow16BitTasks();
+            break;
+        case ID_RESTORE:
+            TaskManager_OnRestoreMainWindow();
+            break;
+        case ID_VIEW_LARGE:
+            ApplicationPage_OnViewLargeIcons();
+            break;
+        case ID_VIEW_SMALL:
+            ApplicationPage_OnViewSmallIcons();
+            break;
+        case ID_VIEW_DETAILS:
+            ApplicationPage_OnViewDetails();
+            break;
+        case ID_VIEW_SHOWKERNELTIMES:
+            PerformancePage_OnViewShowKernelTimes();
+            break;
+        case ID_VIEW_CPUHISTORY_ONEGRAPHALL:
+            PerformancePage_OnViewCPUHistoryOneGraphAll();
+            break;
+        case ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU:
+            PerformancePage_OnViewCPUHistoryOneGraphPerCPU();
+            break;
+        case ID_VIEW_UPDATESPEED_HIGH:
+            TaskManager_OnViewUpdateSpeedHigh();
+            break;
+        case ID_VIEW_UPDATESPEED_NORMAL:
+            TaskManager_OnViewUpdateSpeedNormal();
+            break;
+        case ID_VIEW_UPDATESPEED_LOW:
+            TaskManager_OnViewUpdateSpeedLow();
+            break;
+        case ID_VIEW_UPDATESPEED_PAUSED:
+            TaskManager_OnViewUpdateSpeedPaused();
+            break;
+        case ID_VIEW_SELECTCOLUMNS:
+            ProcessPage_OnViewSelectColumns();
+            break;
+        case ID_VIEW_REFRESH:
+            PostMessage(hDlg, WM_TIMER, 0, 0);
+            break;
+        case ID_WINDOWS_TILEHORIZONTALLY:
+            ApplicationPage_OnWindowsTileHorizontally();
+            break;
+        case ID_WINDOWS_TILEVERTICALLY:
+            ApplicationPage_OnWindowsTileVertically();
+            break;
+        case ID_WINDOWS_MINIMIZE:
+            ApplicationPage_OnWindowsMinimize();
+            break;
+        case ID_WINDOWS_MAXIMIZE:
+            ApplicationPage_OnWindowsMaximize();
+            break;
+        case ID_WINDOWS_CASCADE:
+            ApplicationPage_OnWindowsCascade();
+            break;
+        case ID_WINDOWS_BRINGTOFRONT:
+            ApplicationPage_OnWindowsBringToFront();
+            break;
+        case ID_APPLICATION_PAGE_SWITCHTO:
+            ApplicationPage_OnSwitchTo();
+            break;
+        case ID_APPLICATION_PAGE_ENDTASK:
+            ApplicationPage_OnEndTask();
+            break;
+        case ID_APPLICATION_PAGE_GOTOPROCESS:
+            ApplicationPage_OnGotoProcess();
+            break;
+        case ID_PROCESS_PAGE_ENDPROCESS:
+            ProcessPage_OnEndProcess();
+            break;
+        case ID_PROCESS_PAGE_ENDPROCESSTREE:
+            ProcessPage_OnEndProcessTree();
+            break;
+        case ID_PROCESS_PAGE_DEBUG:
+            ProcessPage_OnDebug();
+            break;
+        case ID_PROCESS_PAGE_SETAFFINITY:
+            ProcessPage_OnSetAffinity();
+            break;
+        case ID_PROCESS_PAGE_SETPRIORITY_REALTIME:
+            ProcessPage_OnSetPriorityRealTime();
+            break;
+        case ID_PROCESS_PAGE_SETPRIORITY_HIGH:
+            ProcessPage_OnSetPriorityHigh();
+            break;
+        case ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL:
+            ProcessPage_OnSetPriorityAboveNormal();
+            break;
+        case ID_PROCESS_PAGE_SETPRIORITY_NORMAL:
+            ProcessPage_OnSetPriorityNormal();
+            break;
+        case ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL:
+            ProcessPage_OnSetPriorityBelowNormal();
+            break;
+        case ID_PROCESS_PAGE_SETPRIORITY_LOW:
+            ProcessPage_OnSetPriorityLow();
+            break;
+        case ID_PROCESS_PAGE_DEBUGCHANNELS:
+            ProcessPage_OnDebugChannels();
+            break;
+        case ID_HELP_ABOUT:
+            OnAbout();
+            break;
+        case ID_FILE_EXIT:
+            EndDialog(hDlg, IDOK);
+            break;
+        }     
+        break;
+
+    case WM_ONTRAYICON:
+        switch(lParam)
+        {
+        case WM_RBUTTONDOWN:
+            {
+            POINT pt;
+            BOOL OnTop;
+            HMENU hMenu, hPopupMenu;
+            
+            GetCursorPos(&pt);
+            
+            OnTop = ((GetWindowLong(hMainWnd, GWL_EXSTYLE) & WS_EX_TOPMOST) != 0);
+            
+            hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_TRAY_POPUP));
+            hPopupMenu = GetSubMenu(hMenu, 0);
+            
+            if(IsWindowVisible(hMainWnd))
+            {
+              DeleteMenu(hPopupMenu, ID_RESTORE, MF_BYCOMMAND);
+            }
+            else
+            {
+              SetMenuDefaultItem(hPopupMenu, ID_RESTORE, FALSE);
+            }
+            
+            if(OnTop)
+            {
+              CheckMenuItem(hPopupMenu, ID_OPTIONS_ALWAYSONTOP, MF_BYCOMMAND | MF_CHECKED);
+            }
+            
+            SetForegroundWindow(hMainWnd);
+            TrackPopupMenuEx(hPopupMenu, 0, pt.x, pt.y, hMainWnd, NULL);
+            
+            DestroyMenu(hMenu);
+            break;
+            }
+        case WM_LBUTTONDBLCLK:
+            TaskManager_OnRestoreMainWindow();
+            break;
+        }
+        break;
+
+    case WM_NOTIFY:
+        idctrl = (int)wParam;
+        pnmh = (LPNMHDR)lParam;
+        if ((pnmh->hwndFrom == hTabWnd) &&
+            (pnmh->idFrom == IDC_TAB) &&
+            (pnmh->code == TCN_SELCHANGE))
+        {
+            TaskManager_OnTabWndSelChange();
+        }
+        break;
+
+    case WM_NCPAINT:
+        hdc = GetDC(hDlg);
+        GetClientRect(hDlg, &rc);
+        Draw3dRect(hdc, rc.left, rc.top, rc.right, rc.top + 2, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
+        ReleaseDC(hDlg, hdc);
+        break;
 
-    TaskManagerSettings.UpdateSpeed = 2;
-    CheckMenuRadioItem(hUpdateSpeedMenu, ID_VIEW_UPDATESPEED_HIGH, ID_VIEW_UPDATESPEED_PAUSED, ID_VIEW_UPDATESPEED_NORMAL, MF_BYCOMMAND);
+    case WM_PAINT:
+        hdc = BeginPaint(hDlg, &ps);
+        GetClientRect(hDlg, &rc);
+        Draw3dRect(hdc, rc.left, rc.top, rc.right, rc.top + 2, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
+        EndPaint(hDlg, &ps);
+        break;
 
-    KillTimer(hMainWnd, 1);
-    SetTimer(hMainWnd, 1, 2000, NULL);
-}
+    case WM_SIZING:
+        /* Make sure the user is sizing the dialog */
+        /* in an acceptable range */
+        pRC = (LPRECT)lParam;
+        if ((wParam == WMSZ_LEFT) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_BOTTOMLEFT)) {
+            /* If the width is too small enlarge it to the minimum */
+            if (nMinimumWidth > (pRC->right - pRC->left))
+                pRC->left = pRC->right - nMinimumWidth;
+        } else {
+            /* If the width is too small enlarge it to the minimum */
+            if (nMinimumWidth > (pRC->right - pRC->left))
+                pRC->right = pRC->left + nMinimumWidth;
+        }
+        if ((wParam == WMSZ_TOP) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_TOPRIGHT)) {
+            /* If the height is too small enlarge it to the minimum */
+            if (nMinimumHeight > (pRC->bottom - pRC->top))
+                pRC->top = pRC->bottom - nMinimumHeight;
+        } else {
+            /* If the height is too small enlarge it to the minimum */
+            if (nMinimumHeight > (pRC->bottom - pRC->top))
+                pRC->bottom = pRC->top + nMinimumHeight;
+        }
+        return TRUE;
+        break;
 
-void TaskManager_OnViewUpdateSpeedLow(void)
-{
-    HMENU hMenu;
-    HMENU hViewMenu;
-    HMENU hUpdateSpeedMenu;
+    case WM_SIZE:
+        /* Handle the window sizing in it's own function */
+        OnSize(wParam, LOWORD(lParam), HIWORD(lParam));
+        break;
 
-    hMenu = GetMenu(hMainWnd);
-    hViewMenu = GetSubMenu(hMenu, 2);
-    hUpdateSpeedMenu = GetSubMenu(hViewMenu, 1);
+    case WM_MOVE:
+        /* Handle the window moving in it's own function */
+        OnMove(wParam, LOWORD(lParam), HIWORD(lParam));
+        break;
 
-    TaskManagerSettings.UpdateSpeed = 4;
-    CheckMenuRadioItem(hUpdateSpeedMenu, ID_VIEW_UPDATESPEED_HIGH, ID_VIEW_UPDATESPEED_PAUSED, ID_VIEW_UPDATESPEED_LOW, MF_BYCOMMAND);
+    case WM_DESTROY:
+        ShowWindow(hDlg, SW_HIDE);
+        TrayIcon_ShellRemoveTrayIcon();
+        wp.length = sizeof(WINDOWPLACEMENT);
+        GetWindowPlacement(hDlg, &wp);
+        TaskManagerSettings.Left = wp.rcNormalPosition.left;
+        TaskManagerSettings.Top = wp.rcNormalPosition.top;
+        TaskManagerSettings.Right = wp.rcNormalPosition.right;
+        TaskManagerSettings.Bottom = wp.rcNormalPosition.bottom;
+        if (IsZoomed(hDlg) || (wp.flags & WPF_RESTORETOMAXIMIZED))
+            TaskManagerSettings.Maximized = TRUE;
+        else
+            TaskManagerSettings.Maximized = FALSE;
+        return DefWindowProc(hDlg, message, wParam, lParam);
+        
+    case WM_TIMER:
+        /* Refresh the performance data */
+        PerfDataRefresh();
+        RefreshApplicationPage();
+        RefreshProcessPage();
+        RefreshPerformancePage();
+        TrayIcon_ShellUpdateTrayIcon();
+        break;
 
-    KillTimer(hMainWnd, 1);
-    SetTimer(hMainWnd, 1, 4000, NULL);
-}
+    case WM_ENTERMENULOOP:
+        TaskManager_OnEnterMenuLoop(hDlg);
+        break;
+    case WM_EXITMENULOOP:
+        TaskManager_OnExitMenuLoop(hDlg);
+        break;
+    case WM_MENUSELECT:
+        TaskManager_OnMenuSelect(hDlg, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam);
+        break;
+    }
 
-void TaskManager_OnViewRefresh(void)
-{
-    PostMessage(hMainWnd, WM_TIMER, 0, 0);
+    return 0;
 }
 
-void TaskManager_OnViewUpdateSpeedPaused(void)
+int APIENTRY WinMain(HINSTANCE hInstance,
+                     HINSTANCE hPrevInstance,
+                     LPSTR     lpCmdLine,
+                     int       nCmdShow)
 {
-    HMENU hMenu;
-    HMENU hViewMenu;
-    HMENU hUpdateSpeedMenu;
+    HANDLE hProcess;
+    HANDLE hToken; 
+    TOKEN_PRIVILEGES tkp; 
 
-    hMenu = GetMenu(hMainWnd);
-    hViewMenu = GetSubMenu(hMenu, 2);
-    hUpdateSpeedMenu = GetSubMenu(hViewMenu, 1);
-    TaskManagerSettings.UpdateSpeed = 0;
-    CheckMenuRadioItem(hUpdateSpeedMenu, ID_VIEW_UPDATESPEED_HIGH, ID_VIEW_UPDATESPEED_PAUSED, ID_VIEW_UPDATESPEED_PAUSED, MF_BYCOMMAND);
-    KillTimer(hMainWnd, 1);
-}
+    /* Initialize global variables */
+    hInst = hInstance;
 
-void TaskManager_OnTabWndSelChange(void)
-{
-    int   i;
-    HMENU hMenu;
-    HMENU hOptionsMenu;
-    HMENU hViewMenu;
-    HMENU hSubMenu;
+    /* Change our priority class to HIGH */
+    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
+    SetPriorityClass(hProcess, HIGH_PRIORITY_CLASS);
+    CloseHandle(hProcess);
 
-    hMenu = GetMenu(hMainWnd);
-    hViewMenu = GetSubMenu(hMenu, 2);
-    hOptionsMenu = GetSubMenu(hMenu, 1);
-    TaskManagerSettings.ActiveTabPage = TabCtrl_GetCurSel(hTabWnd);
-    for (i = GetMenuItemCount(hViewMenu) - 1; i > 2; i--) {
-        hSubMenu = GetSubMenu(hViewMenu, i);
-        if (hSubMenu)
-            DestroyMenu(hSubMenu);
-        RemoveMenu(hViewMenu, i, MF_BYPOSITION);
-    }
-    RemoveMenu(hOptionsMenu, 3, MF_BYPOSITION);
-    switch (TaskManagerSettings.ActiveTabPage) {
-    case 0:
-        ShowWindow(hApplicationPage, SW_SHOW);
-        ShowWindow(hProcessPage, SW_HIDE);
-        ShowWindow(hPerformancePage, SW_HIDE);
-        BringWindowToTop(hApplicationPage);
-        AppendMenu(hViewMenu, MF_STRING, ID_VIEW_LARGE, _T("Lar&ge Icons"));
-        AppendMenu(hViewMenu, MF_STRING, ID_VIEW_SMALL, _T("S&mall Icons"));
-        AppendMenu(hViewMenu, MF_STRING, ID_VIEW_DETAILS, _T("&Details"));
+    /* Now let's get the SE_DEBUG_NAME privilege
+     * so that we can debug processes 
+     */
 
-        if (GetMenuItemCount(hMenu) <= 4) {
-            hSubMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_WINDOWSMENU));
-            InsertMenu(hMenu, 3, MF_BYPOSITION|MF_POPUP, (UINT)hSubMenu, _T("&Windows"));
-            DrawMenuBar(hMainWnd);
-        }
-        if (TaskManagerSettings.View_LargeIcons)
-            CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_LARGE, MF_BYCOMMAND);
-        else if (TaskManagerSettings.View_SmallIcons)
-            CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_SMALL, MF_BYCOMMAND);
-        else
-            CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_DETAILS, MF_BYCOMMAND);
-        /*
-         * Give the application list control focus
-         */
-        SetFocus(hApplicationPageListCtrl);
-        break;
+    /* Get a token for this process.  */
+    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
+        /* Get the LUID for the debug privilege.  */
+        LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid); 
 
-    case 1:
-        ShowWindow(hApplicationPage, SW_HIDE);
-        ShowWindow(hProcessPage, SW_SHOW);
-        ShowWindow(hPerformancePage, SW_HIDE);
-        BringWindowToTop(hProcessPage);
-        AppendMenu(hViewMenu, MF_STRING, ID_VIEW_SELECTCOLUMNS, _T("&Select Columns..."));
-        AppendMenu(hOptionsMenu, MF_STRING, ID_OPTIONS_SHOW16BITTASKS, _T("&Show 16-bit tasks"));
-        if (TaskManagerSettings.Show16BitTasks)
-            CheckMenuItem(hOptionsMenu, ID_OPTIONS_SHOW16BITTASKS, MF_BYCOMMAND|MF_CHECKED);
-        if (GetMenuItemCount(hMenu) > 4)
-        {
-            RemoveMenu(hMenu, 3, MF_BYPOSITION);
-            DrawMenuBar(hMainWnd);
-        }
-        /*
-         * Give the process list control focus
-         */
-        SetFocus(hProcessPageListCtrl);
-        break;
+        tkp.PrivilegeCount = 1;  /* one privilege to set */
+        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
 
-    case 2:
-        ShowWindow(hApplicationPage, SW_HIDE);
-        ShowWindow(hProcessPage, SW_HIDE);
-        ShowWindow(hPerformancePage, SW_SHOW);
-        BringWindowToTop(hPerformancePage);
-        if (GetMenuItemCount(hMenu) > 4) {
-            RemoveMenu(hMenu, 3, MF_BYPOSITION);
-            DrawMenuBar(hMainWnd);
-        }
-        hSubMenu = CreatePopupMenu();
-        AppendMenu(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHALL, _T("&One Graph, All CPUs"));
-        AppendMenu(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, _T("One Graph &Per CPU"));
-        AppendMenu(hViewMenu, MF_STRING|MF_POPUP, (UINT)hSubMenu, _T("&CPU History"));
-        AppendMenu(hViewMenu, MF_STRING, ID_VIEW_SHOWKERNELTIMES, _T("&Show Kernel Times"));
-        if (TaskManagerSettings.ShowKernelTimes)
-            CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_CHECKED);
-        else
-            CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_UNCHECKED);
-        if (TaskManagerSettings.CPUHistory_OneGraphPerCPU)
-            CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, MF_BYCOMMAND);
-        else
-            CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHALL, MF_BYCOMMAND);
-        /*
-         * Give the tab control focus
-         */
-        SetFocus(hTabWnd);
-        break;
+        /* Get the debug privilege for this process. */
+        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); 
     }
-}
-
-LPTSTR GetLastErrorText(LPTSTR lpszBuf, DWORD dwSize)
-{
-    DWORD  dwRet;
-    LPTSTR lpszTemp = NULL;
 
-    dwRet = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
-                           NULL,
-                           GetLastError(),
-                           LANG_NEUTRAL,
-                           (LPTSTR)&lpszTemp,
-                           0,
-                           NULL );
+    /* Load our settings from the registry */
+    LoadSettings();
 
-    /* supplied buffer is not long enough */
-    if (!dwRet || ( (long)dwSize < (long)dwRet+14)) {
-        lpszBuf[0] = TEXT('\0');
-    } else {
-        lpszTemp[lstrlen(lpszTemp)-2] = TEXT('\0');  /*remove cr and newline character */
-        _stprintf(lpszBuf, TEXT("%s (0x%x)"), lpszTemp, (int)GetLastError());
-    }
-    if (lpszTemp) {
-        LocalFree((HLOCAL)lpszTemp);
+    /* Initialize perf data */
+    if (!PerfDataInitialize()) {
+        return -1;
     }
-    return lpszBuf;
+
+    DialogBox(hInst, (LPCTSTR)IDD_TASKMGR_DIALOG, NULL, TaskManagerWndProc);
+ 
+    /* Save our settings to the registry */
+    SaveSettings();
+    PerfDataUninitialize();
+    return 0;
 }


More information about the wine-patches mailing list