ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

procpage.c
Go to the documentation of this file.
00001 /*
00002  *  ReactOS Task Manager
00003  *
00004  *  procpage.c
00005  *
00006  *  Copyright (C) 1999 - 2001  Brian Palmer  <brianp@reactos.org>
00007  *  Copyright (C) 2009         Maxime Vernier <maxime.vernier@gmail.com>
00008  *
00009  * This library is free software; you can redistribute it and/or
00010  * modify it under the terms of the GNU Lesser General Public
00011  * License as published by the Free Software Foundation; either
00012  * version 2.1 of the License, or (at your option) any later version.
00013  *
00014  * This library is distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017  * Lesser General Public License for more details.
00018  *
00019  * You should have received a copy of the GNU Lesser General Public
00020  * License along with this library; if not, write to the Free Software
00021  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00022  */
00023 
00024 #include <precomp.h>
00025 
00026 #define CMP(x1, x2)\
00027     (x1 < x2 ? -1 : (x1 > x2 ? 1 : 0))
00028 
00029 typedef struct
00030 {
00031     ULONG ProcessId;
00032 } PROCESS_PAGE_LIST_ITEM, *LPPROCESS_PAGE_LIST_ITEM;
00033 
00034 HWND hProcessPage;                        /* Process List Property Page */
00035 
00036 HWND hProcessPageListCtrl;                /* Process ListCtrl Window */
00037 HWND hProcessPageHeaderCtrl;            /* Process Header Control */
00038 HWND hProcessPageEndProcessButton;        /* Process End Process button */
00039 HWND hProcessPageShowAllProcessesButton;/* Process Show All Processes checkbox */
00040 
00041 static int  nProcessPageWidth;
00042 static int  nProcessPageHeight;
00043 #ifdef RUN_PROC_PAGE
00044 static HANDLE   hProcessThread = NULL;
00045 static DWORD    dwProcessThread;
00046 #endif
00047 
00048 int CALLBACK    ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
00049 void AddProcess(ULONG Index);
00050 void UpdateProcesses();
00051 void gethmsfromlargeint(LARGE_INTEGER largeint, DWORD *dwHours, DWORD *dwMinutes, DWORD *dwSeconds);
00052 void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam);
00053 void CommaSeparateNumberString(LPWSTR strNumber, int nMaxCount);
00054 void ProcessPageShowContextMenu(DWORD dwProcessId);
00055 BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCount);
00056 DWORD WINAPI ProcessPageRefreshThread(void *lpParameter);
00057 int ProcessRunning(ULONG ProcessId);
00058 
00059 int ProcGetIndexByProcessId(DWORD dwProcessId)
00060 {
00061     int     i;
00062     LVITEM  item;
00063     LPPROCESS_PAGE_LIST_ITEM pData;
00064 
00065     for (i=0; i<ListView_GetItemCount(hProcessPageListCtrl); i++)
00066     {
00067         memset(&item, 0, sizeof(LV_ITEM));
00068         item.mask = LVIF_PARAM;
00069         item.iItem = i;
00070         (void)ListView_GetItem(hProcessPageListCtrl, &item);
00071         pData = (LPPROCESS_PAGE_LIST_ITEM)item.lParam;
00072         if (pData->ProcessId == dwProcessId)
00073         {
00074             return i;
00075         }
00076     }
00077     return 0;
00078 }
00079 
00080 DWORD GetSelectedProcessId(void)
00081 {
00082     int     Index;
00083     LVITEM  lvitem;
00084 
00085     if(ListView_GetSelectedCount(hProcessPageListCtrl) == 1)
00086     {
00087         Index = ListView_GetSelectionMark(hProcessPageListCtrl);
00088 
00089         memset(&lvitem, 0, sizeof(LVITEM));
00090 
00091         lvitem.mask = LVIF_PARAM;
00092         lvitem.iItem = Index;
00093 
00094         (void)ListView_GetItem(hProcessPageListCtrl, &lvitem);
00095 
00096         if (lvitem.lParam)
00097             return ((LPPROCESS_PAGE_LIST_ITEM)lvitem.lParam)->ProcessId;
00098     }
00099 
00100     return 0;
00101 }
00102 
00103 INT_PTR CALLBACK
00104 ProcessPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
00105 {
00106     RECT    rc;
00107     int     nXDifference;
00108     int     nYDifference;
00109     int     cx, cy;
00110 
00111     switch (message) {
00112     case WM_INITDIALOG:
00113         /*
00114          * Save the width and height
00115          */
00116         GetClientRect(hDlg, &rc);
00117         nProcessPageWidth = rc.right;
00118         nProcessPageHeight = rc.bottom;
00119 
00120         /* Update window position */
00121         SetWindowPos(hDlg, NULL, 15, 30, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
00122 
00123         /*
00124          * Get handles to the controls
00125          */
00126         hProcessPageListCtrl = GetDlgItem(hDlg, IDC_PROCESSLIST);
00127         hProcessPageHeaderCtrl = ListView_GetHeader(hProcessPageListCtrl);
00128         hProcessPageEndProcessButton = GetDlgItem(hDlg, IDC_ENDPROCESS);
00129         hProcessPageShowAllProcessesButton = GetDlgItem(hDlg, IDC_SHOWALLPROCESSES);
00130 
00131         /*
00132          * Set the title, and extended window styles for the list control
00133          */
00134         SetWindowTextW(hProcessPageListCtrl, L"Processes");
00135         (void)ListView_SetExtendedListViewStyle(hProcessPageListCtrl, ListView_GetExtendedListViewStyle(hProcessPageListCtrl) | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);
00136 
00137         AddColumns();
00138 
00139         /*
00140          * Subclass the process list control so we can intercept WM_ERASEBKGND
00141          */
00142         OldProcessListWndProc = (WNDPROC)(LONG_PTR) SetWindowLongPtrW(hProcessPageListCtrl, GWL_WNDPROC, (LONG_PTR)ProcessListWndProc);
00143 
00144 #ifdef RUN_PROC_PAGE
00145         /* Start our refresh thread */
00146         hProcessThread = CreateThread(NULL, 0, ProcessPageRefreshThread, NULL, 0, &dwProcessThread);
00147 #endif
00148         return TRUE;
00149 
00150     case WM_DESTROY:
00151         /* Close the event handle, this will make the */
00152         /* refresh thread exit when the wait fails */
00153 #ifdef RUN_PROC_PAGE
00154         EndLocalThread(&hProcessThread, dwProcessThread);
00155 #endif
00156         SaveColumnSettings();
00157         break;
00158 
00159     case WM_COMMAND:
00160         /* Handle the button clicks */
00161         switch (LOWORD(wParam))
00162         {
00163                 case IDC_ENDPROCESS:
00164                         ProcessPage_OnEndProcess();
00165         }
00166         break;
00167 
00168     case WM_SIZE:
00169         if (wParam == SIZE_MINIMIZED)
00170             return 0;
00171 
00172         cx = LOWORD(lParam);
00173         cy = HIWORD(lParam);
00174         nXDifference = cx - nProcessPageWidth;
00175         nYDifference = cy - nProcessPageHeight;
00176         nProcessPageWidth = cx;
00177         nProcessPageHeight = cy;
00178 
00179         /* Reposition the application page's controls */
00180         GetWindowRect(hProcessPageListCtrl, &rc);
00181         cx = (rc.right - rc.left) + nXDifference;
00182         cy = (rc.bottom - rc.top) + nYDifference;
00183         SetWindowPos(hProcessPageListCtrl, NULL, 0, 0, cx, cy, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOMOVE|SWP_NOZORDER);
00184         InvalidateRect(hProcessPageListCtrl, NULL, TRUE);
00185 
00186         GetClientRect(hProcessPageEndProcessButton, &rc);
00187         MapWindowPoints(hProcessPageEndProcessButton, hDlg, (LPPOINT)(PRECT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
00188            cx = rc.left + nXDifference;
00189         cy = rc.top + nYDifference;
00190         SetWindowPos(hProcessPageEndProcessButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
00191         InvalidateRect(hProcessPageEndProcessButton, NULL, TRUE);
00192 
00193         GetClientRect(hProcessPageShowAllProcessesButton, &rc);
00194         MapWindowPoints(hProcessPageShowAllProcessesButton, hDlg, (LPPOINT)(PRECT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
00195            cx = rc.left;
00196         cy = rc.top + nYDifference;
00197         SetWindowPos(hProcessPageShowAllProcessesButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
00198         InvalidateRect(hProcessPageShowAllProcessesButton, NULL, TRUE);
00199         break;
00200 
00201     case WM_NOTIFY:
00202         ProcessPageOnNotify(wParam, lParam);
00203         break;
00204 
00205     case WM_KEYDOWN:
00206         if (wParam == VK_DELETE)
00207             ProcessPage_OnEndProcess();
00208         break;
00209     }
00210 
00211     return 0;
00212 }
00213 
00214 void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam)
00215 {
00216     LPNMHDR        pnmh;
00217     NMLVDISPINFO*  pnmdi;
00218     LPNMHEADER     pnmhdr;
00219     ULONG          Index;
00220     ULONG          ColumnIndex;
00221     LPPROCESS_PAGE_LIST_ITEM  pData;
00222 
00223     pnmh = (LPNMHDR) lParam;
00224     pnmdi = (NMLVDISPINFO*) lParam;
00225     pnmhdr = (LPNMHEADER) lParam;
00226 
00227     if (pnmh->hwndFrom == hProcessPageListCtrl)
00228     {
00229         switch (pnmh->code)
00230         {
00231         #if 0
00232         case LVN_ITEMCHANGED:
00233             ProcessPageUpdate();
00234             break;
00235         #endif
00236 
00237         case LVN_GETDISPINFO:
00238 
00239             if (!(pnmdi->item.mask & LVIF_TEXT))
00240                 break;
00241 
00242             pData = (LPPROCESS_PAGE_LIST_ITEM)pnmdi->item.lParam;
00243             Index = PerfDataGetProcessIndex(pData->ProcessId);
00244             ColumnIndex = pnmdi->item.iSubItem;
00245 
00246             PerfDataGetText(Index, ColumnIndex, pnmdi->item.pszText, pnmdi->item.cchTextMax);
00247 
00248             break;
00249 
00250         case NM_RCLICK:
00251 
00252             ProcessPageShowContextMenu(GetSelectedProcessId());
00253             break;
00254 
00255         case LVN_KEYDOWN:
00256 
00257             if (((LPNMLVKEYDOWN)lParam)->wVKey == VK_DELETE)
00258                 ProcessPage_OnEndProcess();
00259             break;
00260 
00261         }
00262     }
00263     else if (pnmh->hwndFrom == hProcessPageHeaderCtrl)
00264     {
00265         switch (pnmh->code)
00266         {
00267         case HDN_ITEMCLICK:
00268 
00269             TaskManagerSettings.SortColumn = ColumnDataHints[pnmhdr->iItem];
00270             TaskManagerSettings.SortAscending = !TaskManagerSettings.SortAscending;
00271             (void)ListView_SortItems(hProcessPageListCtrl, ProcessPageCompareFunc, NULL);
00272 
00273             break;
00274 
00275         case HDN_ITEMCHANGED:
00276 
00277             UpdateColumnDataHints();
00278 
00279             break;
00280 
00281         case HDN_ENDDRAG:
00282 
00283             UpdateColumnDataHints();
00284 
00285             break;
00286 
00287         }
00288     }
00289 }
00290 
00291 void CommaSeparateNumberString(LPWSTR strNumber, int nMaxCount)
00292 {
00293     WCHAR  temp[260];
00294     UINT   i, j, k;
00295 
00296     for (i=0,j=0; i<(wcslen(strNumber) % 3); i++, j++)
00297         temp[j] = strNumber[i];
00298     for (k=0; i<wcslen(strNumber); i++,j++,k++) {
00299         if ((k % 3 == 0) && (j > 0))
00300             temp[j++] = L',';
00301         temp[j] = strNumber[i];
00302     }
00303     temp[j] = L'\0';
00304     wcsncpy(strNumber, temp, nMaxCount);
00305 }
00306 
00307 void ProcessPageShowContextMenu(DWORD dwProcessId)
00308 {
00309     HMENU        hMenu;
00310     HMENU        hSubMenu;
00311     HMENU        hPriorityMenu;
00312     POINT        pt;
00313     SYSTEM_INFO  si;
00314     HANDLE       hProcess;
00315     DWORD        dwProcessPriorityClass;
00316     WCHAR        strDebugger[260];
00317     DWORD        dwDebuggerSize;
00318     HKEY         hKey;
00319 
00320     memset(&si, 0, sizeof(SYSTEM_INFO));
00321 
00322     GetCursorPos(&pt);
00323     GetSystemInfo(&si);
00324 
00325     hMenu = LoadMenuW(hInst, MAKEINTRESOURCEW(IDR_PROCESS_PAGE_CONTEXT));
00326     hSubMenu = GetSubMenu(hMenu, 0);
00327     hPriorityMenu = GetSubMenu(hSubMenu, 4);
00328 
00329     hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessId);
00330     dwProcessPriorityClass = GetPriorityClass(hProcess);
00331     CloseHandle(hProcess);
00332 
00333     if (si.dwNumberOfProcessors < 2)
00334         RemoveMenu(hSubMenu, ID_PROCESS_PAGE_SETAFFINITY, MF_BYCOMMAND);
00335 
00336     if (!DebugChannelsAreSupported())
00337         RemoveMenu(hSubMenu, ID_PROCESS_PAGE_DEBUGCHANNELS, MF_BYCOMMAND);
00338 
00339     switch (dwProcessPriorityClass)    {
00340     case REALTIME_PRIORITY_CLASS:
00341         CheckMenuRadioItem(hPriorityMenu, ID_PROCESS_PAGE_SETPRIORITY_REALTIME, ID_PROCESS_PAGE_SETPRIORITY_LOW, ID_PROCESS_PAGE_SETPRIORITY_REALTIME, MF_BYCOMMAND);
00342         break;
00343     case HIGH_PRIORITY_CLASS:
00344         CheckMenuRadioItem(hPriorityMenu, ID_PROCESS_PAGE_SETPRIORITY_REALTIME, ID_PROCESS_PAGE_SETPRIORITY_LOW, ID_PROCESS_PAGE_SETPRIORITY_HIGH, MF_BYCOMMAND);
00345         break;
00346     case ABOVE_NORMAL_PRIORITY_CLASS:
00347         CheckMenuRadioItem(hPriorityMenu, ID_PROCESS_PAGE_SETPRIORITY_REALTIME, ID_PROCESS_PAGE_SETPRIORITY_LOW, ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL, MF_BYCOMMAND);
00348         break;
00349     case NORMAL_PRIORITY_CLASS:
00350         CheckMenuRadioItem(hPriorityMenu, ID_PROCESS_PAGE_SETPRIORITY_REALTIME, ID_PROCESS_PAGE_SETPRIORITY_LOW, ID_PROCESS_PAGE_SETPRIORITY_NORMAL, MF_BYCOMMAND);
00351         break;
00352     case BELOW_NORMAL_PRIORITY_CLASS:
00353         CheckMenuRadioItem(hPriorityMenu, ID_PROCESS_PAGE_SETPRIORITY_REALTIME, ID_PROCESS_PAGE_SETPRIORITY_LOW, ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL, MF_BYCOMMAND);
00354         break;
00355     case IDLE_PRIORITY_CLASS:
00356         CheckMenuRadioItem(hPriorityMenu, ID_PROCESS_PAGE_SETPRIORITY_REALTIME, ID_PROCESS_PAGE_SETPRIORITY_LOW, ID_PROCESS_PAGE_SETPRIORITY_LOW, MF_BYCOMMAND);
00357         break;
00358     }
00359 
00360     if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
00361     {
00362         dwDebuggerSize = 260;
00363         if (RegQueryValueExW(hKey, L"Debugger", NULL, NULL, (LPBYTE)strDebugger, &dwDebuggerSize) == ERROR_SUCCESS)
00364         {
00365             CharUpper(strDebugger);
00366             if (wcsstr(strDebugger, L"DRWTSN32"))
00367                 EnableMenuItem(hSubMenu, ID_PROCESS_PAGE_DEBUG, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00368         }
00369         else
00370             EnableMenuItem(hSubMenu, ID_PROCESS_PAGE_DEBUG, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00371 
00372         RegCloseKey(hKey);
00373     } else {
00374         EnableMenuItem(hSubMenu, ID_PROCESS_PAGE_DEBUG, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00375     }
00376     TrackPopupMenu(hSubMenu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hMainWnd, NULL);
00377     DestroyMenu(hMenu);
00378 }
00379 
00380 void RefreshProcessPage(void)
00381 {
00382 #ifdef RUN_PROC_PAGE
00383     /* Signal the event so that our refresh thread */
00384     /* will wake up and refresh the process page */
00385     PostThreadMessage(dwProcessThread, WM_TIMER, 0, 0);
00386 #endif
00387 }
00388 
00389 DWORD WINAPI ProcessPageRefreshThread(void *lpParameter)
00390 {
00391     ULONG    OldProcessorUsage = 0;
00392     ULONG    OldProcessCount = 0;
00393     WCHAR    szCpuUsage[256], szProcesses[256];
00394     MSG      msg;
00395 
00396     LoadStringW(hInst, IDS_STATUS_CPUUSAGE, szCpuUsage, 256);
00397     LoadStringW(hInst, IDS_STATUS_PROCESSES, szProcesses, 256);
00398 
00399     while (1) {
00400         /*  Wait for an the event or application close */
00401         if (GetMessage(&msg, NULL, 0, 0) <= 0)
00402             return 0;
00403 
00404         if (msg.message == WM_TIMER) {
00405             WCHAR    text[260];
00406 
00407             UpdateProcesses();
00408 
00409             if (IsWindowVisible(hProcessPage))
00410                 InvalidateRect(hProcessPageListCtrl, NULL, FALSE);
00411 
00412             if (OldProcessorUsage != PerfDataGetProcessorUsage()) {
00413                 OldProcessorUsage = PerfDataGetProcessorUsage();
00414                 wsprintfW(text, szCpuUsage, OldProcessorUsage);
00415                 SendMessageW(hStatusWnd, SB_SETTEXT, 1, (LPARAM)text);
00416             }
00417             if (OldProcessCount != PerfDataGetProcessCount()) {
00418                 OldProcessCount = PerfDataGetProcessCount();
00419                 wsprintfW(text, szProcesses, OldProcessCount);
00420                 SendMessageW(hStatusWnd, SB_SETTEXT, 0, (LPARAM)text);
00421             }
00422         }
00423     }
00424     return 0;
00425 }
00426 
00427 void UpdateProcesses()
00428 {
00429     int i;
00430     ULONG l;
00431     LV_ITEM item;
00432     LPPROCESS_PAGE_LIST_ITEM pData;
00433 
00434     SendMessage(hProcessPageListCtrl, WM_SETREDRAW, FALSE, 0);
00435 
00436     /* Remove old processes */
00437     for (i = 0; i < ListView_GetItemCount(hProcessPageListCtrl); i++)
00438     {
00439         memset(&item, 0, sizeof (LV_ITEM));
00440         item.mask = LVIF_PARAM;
00441         item.iItem = i;
00442         (void)ListView_GetItem(hProcessPageListCtrl, &item);
00443         pData = (LPPROCESS_PAGE_LIST_ITEM)item.lParam;
00444         if (!ProcessRunning(pData->ProcessId))
00445         {
00446             (void)ListView_DeleteItem(hProcessPageListCtrl, i);
00447             HeapFree(GetProcessHeap(), 0, pData);
00448         }
00449     }
00450 
00451     /* Check for difference in listview process and performance process counts */
00452     if (ListView_GetItemCount(hProcessPageListCtrl) != PerfDataGetProcessCount())
00453     {
00454         /* Add new processes by checking against the current items */
00455         for (l = 0; l < PerfDataGetProcessCount(); l++)
00456         {
00457             AddProcess(l);
00458         }
00459     }
00460 
00461     if (TaskManagerSettings.SortColumn != -1)
00462     {
00463         (void)ListView_SortItems(hProcessPageListCtrl, ProcessPageCompareFunc, NULL);
00464     }
00465 
00466     SendMessage(hProcessPageListCtrl, WM_SETREDRAW, TRUE, 0);
00467 }
00468 
00469 BOOL ProcessRunning(ULONG ProcessId) 
00470 {
00471     HANDLE hProcess;
00472     DWORD exitCode;
00473 
00474     if (ProcessId == 0) {
00475         return TRUE;
00476     }
00477     
00478     hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
00479     if (hProcess == NULL) {
00480         return FALSE;
00481     }
00482 
00483     if (GetExitCodeProcess(hProcess, &exitCode)) {
00484         CloseHandle(hProcess);
00485         return (exitCode == STILL_ACTIVE);
00486     }
00487 
00488     CloseHandle(hProcess);
00489     return FALSE;
00490 }
00491 
00492 void AddProcess(ULONG Index)
00493 {
00494     LPPROCESS_PAGE_LIST_ITEM pData;
00495     int         i;
00496     LV_ITEM     item;
00497     BOOL    bAlreadyInList = FALSE;
00498     ULONG pid;
00499 
00500     pid = PerfDataGetProcessId(Index);
00501 
00502     /* Check to see if it's already in our list */
00503     for (i=0; i<ListView_GetItemCount(hProcessPageListCtrl); i++)
00504     {
00505         memset(&item, 0, sizeof(LV_ITEM));
00506         item.mask = LVIF_PARAM;
00507         item.iItem = i;
00508         (void)ListView_GetItem(hProcessPageListCtrl, &item);
00509         pData = (LPPROCESS_PAGE_LIST_ITEM)item.lParam;
00510         if (pData->ProcessId == pid)
00511         {
00512             bAlreadyInList = TRUE;
00513             break;
00514         }
00515     }
00516     if (!bAlreadyInList)  /* Add */
00517     {
00518         pData = (LPPROCESS_PAGE_LIST_ITEM)HeapAlloc(GetProcessHeap(), 0, sizeof(PROCESS_PAGE_LIST_ITEM));
00519         pData->ProcessId = pid;
00520 
00521         /* Add the item to the list */
00522         memset(&item, 0, sizeof(LV_ITEM));
00523         item.mask = LVIF_TEXT|LVIF_PARAM;
00524         item.pszText = LPSTR_TEXTCALLBACK;
00525         item.iItem = ListView_GetItemCount(hProcessPageListCtrl);
00526         item.lParam = (LPARAM)pData;
00527         (void)ListView_InsertItem(hProcessPageListCtrl, &item);
00528     }
00529 }
00530 
00531 BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCount)
00532 {
00533     IO_COUNTERS    iocounters;
00534     LARGE_INTEGER  time;
00535 
00536     if (ColumnDataHints[ColumnIndex] == COLUMN_IMAGENAME)
00537         PerfDataGetImageName(Index, lpText, nMaxCount);
00538     if (ColumnDataHints[ColumnIndex] == COLUMN_PID)
00539         wsprintfW(lpText, L"%d", PerfDataGetProcessId(Index));
00540     if (ColumnDataHints[ColumnIndex] == COLUMN_USERNAME)
00541         PerfDataGetUserName(Index, lpText, nMaxCount);
00542     if (ColumnDataHints[ColumnIndex] == COLUMN_SESSIONID)
00543         wsprintfW(lpText, L"%d", PerfDataGetSessionId(Index));
00544     if (ColumnDataHints[ColumnIndex] == COLUMN_CPUUSAGE)
00545         wsprintfW(lpText, L"%02d", PerfDataGetCPUUsage(Index));
00546     if (ColumnDataHints[ColumnIndex] == COLUMN_CPUTIME)
00547     {
00548         DWORD dwHours;
00549         DWORD dwMinutes;
00550         DWORD dwSeconds;
00551 
00552         time = PerfDataGetCPUTime(Index);
00553         gethmsfromlargeint(time, &dwHours, &dwMinutes, &dwSeconds);
00554         wsprintfW(lpText, L"%d:%02d:%02d", dwHours, dwMinutes, dwSeconds);
00555     }
00556     if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGE)
00557     {
00558         wsprintfW(lpText, L"%d", PerfDataGetWorkingSetSizeBytes(Index) / 1024);
00559         CommaSeparateNumberString(lpText, nMaxCount);
00560         wcscat(lpText, L" K");
00561     }
00562     if (ColumnDataHints[ColumnIndex] == COLUMN_PEAKMEMORYUSAGE)
00563     {
00564         wsprintfW(lpText, L"%d", PerfDataGetPeakWorkingSetSizeBytes(Index) / 1024);
00565         CommaSeparateNumberString(lpText, nMaxCount);
00566         wcscat(lpText, L" K");
00567     }
00568     if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGEDELTA)
00569     {
00570         wsprintfW(lpText, L"%d", PerfDataGetWorkingSetSizeDelta(Index) / 1024);
00571         CommaSeparateNumberString(lpText, nMaxCount);
00572         wcscat(lpText, L" K");
00573     }
00574     if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTS)
00575     {
00576         wsprintfW(lpText, L"%d", PerfDataGetPageFaultCount(Index));
00577         CommaSeparateNumberString(lpText, nMaxCount);
00578     }
00579     if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTSDELTA)
00580     {
00581         wsprintfW(lpText, L"%d", PerfDataGetPageFaultCountDelta(Index));
00582         CommaSeparateNumberString(lpText, nMaxCount);
00583     }
00584     if (ColumnDataHints[ColumnIndex] == COLUMN_VIRTUALMEMORYSIZE)
00585     {
00586         wsprintfW(lpText, L"%d", PerfDataGetVirtualMemorySizeBytes(Index) / 1024);
00587         CommaSeparateNumberString(lpText, nMaxCount);
00588         wcscat(lpText, L" K");
00589     }
00590     if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEDPOOL)
00591     {
00592         wsprintfW(lpText, L"%d", PerfDataGetPagedPoolUsagePages(Index) / 1024);
00593         CommaSeparateNumberString(lpText, nMaxCount);
00594         wcscat(lpText, L" K");
00595     }
00596     if (ColumnDataHints[ColumnIndex] == COLUMN_NONPAGEDPOOL)
00597     {
00598         wsprintfW(lpText, L"%d", PerfDataGetNonPagedPoolUsagePages(Index) / 1024);
00599         CommaSeparateNumberString(lpText, nMaxCount);
00600         wcscat(lpText, L" K");
00601     }
00602     if (ColumnDataHints[ColumnIndex] == COLUMN_BASEPRIORITY)
00603         wsprintfW(lpText, L"%d", PerfDataGetBasePriority(Index));
00604     if (ColumnDataHints[ColumnIndex] == COLUMN_HANDLECOUNT)
00605     {
00606         wsprintfW(lpText, L"%d", PerfDataGetHandleCount(Index));
00607         CommaSeparateNumberString(lpText, nMaxCount);
00608     }
00609     if (ColumnDataHints[ColumnIndex] == COLUMN_THREADCOUNT)
00610     {
00611         wsprintfW(lpText, L"%d", PerfDataGetThreadCount(Index));
00612         CommaSeparateNumberString(lpText, nMaxCount);
00613     }
00614     if (ColumnDataHints[ColumnIndex] == COLUMN_USEROBJECTS)
00615     {
00616         wsprintfW(lpText, L"%d", PerfDataGetUSERObjectCount(Index));
00617         CommaSeparateNumberString(lpText, nMaxCount);
00618     }
00619     if (ColumnDataHints[ColumnIndex] == COLUMN_GDIOBJECTS)
00620     {
00621         wsprintfW(lpText, L"%d", PerfDataGetGDIObjectCount(Index));
00622         CommaSeparateNumberString(lpText, nMaxCount);
00623     }
00624     if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADS)
00625     {
00626         PerfDataGetIOCounters(Index, &iocounters);
00627         /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.ReadOperationCount); */
00628         _ui64tow(iocounters.ReadOperationCount, lpText, 10);
00629         CommaSeparateNumberString(lpText, nMaxCount);
00630     }
00631     if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITES)
00632     {
00633         PerfDataGetIOCounters(Index, &iocounters);
00634         /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.WriteOperationCount); */
00635         _ui64tow(iocounters.WriteOperationCount, lpText, 10);
00636         CommaSeparateNumberString(lpText, nMaxCount);
00637     }
00638     if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHER)
00639     {
00640         PerfDataGetIOCounters(Index, &iocounters);
00641         /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.OtherOperationCount); */
00642         _ui64tow(iocounters.OtherOperationCount, lpText, 10);
00643         CommaSeparateNumberString(lpText, nMaxCount);
00644     }
00645     if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADBYTES)
00646     {
00647         PerfDataGetIOCounters(Index, &iocounters);
00648         /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.ReadTransferCount); */
00649         _ui64tow(iocounters.ReadTransferCount, lpText, 10);
00650         CommaSeparateNumberString(lpText, nMaxCount);
00651     }
00652     if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITEBYTES)
00653     {
00654         PerfDataGetIOCounters(Index, &iocounters);
00655         /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.WriteTransferCount); */
00656         _ui64tow(iocounters.WriteTransferCount, lpText, 10);
00657         CommaSeparateNumberString(lpText, nMaxCount);
00658     }
00659     if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHERBYTES)
00660     {
00661         PerfDataGetIOCounters(Index, &iocounters);
00662         /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.OtherTransferCount); */
00663         _ui64tow(iocounters.OtherTransferCount, lpText, 10);
00664         CommaSeparateNumberString(lpText, nMaxCount);
00665     }
00666 
00667     return FALSE;
00668 }
00669 
00670 
00671 void gethmsfromlargeint(LARGE_INTEGER largeint, DWORD *dwHours, DWORD *dwMinutes, DWORD *dwSeconds)
00672 {
00673 #ifdef _MSC_VER
00674     *dwHours = (DWORD)(largeint.QuadPart / 36000000000L);
00675     *dwMinutes = (DWORD)((largeint.QuadPart % 36000000000L) / 600000000L);
00676     *dwSeconds = (DWORD)(((largeint.QuadPart % 36000000000L) % 600000000L) / 10000000L);
00677 #else
00678     *dwHours = (DWORD)(largeint.QuadPart / 36000000000LL);
00679     *dwMinutes = (DWORD)((largeint.QuadPart % 36000000000LL) / 600000000LL);
00680     *dwSeconds = (DWORD)(((largeint.QuadPart % 36000000000LL) % 600000000LL) / 10000000LL);
00681 #endif
00682 }
00683 
00684 int largeintcmp(LARGE_INTEGER l1, LARGE_INTEGER l2)
00685 {
00686     int ret = 0;
00687     DWORD dwHours1;
00688     DWORD dwMinutes1;
00689     DWORD dwSeconds1;
00690     DWORD dwHours2;
00691     DWORD dwMinutes2;
00692     DWORD dwSeconds2;
00693 
00694     gethmsfromlargeint(l1, &dwHours1, &dwMinutes1, &dwSeconds1);
00695     gethmsfromlargeint(l2, &dwHours2, &dwMinutes2, &dwSeconds2);
00696     ret = CMP(dwHours1, dwHours2);
00697     if (ret == 0)
00698     {
00699         ret = CMP(dwMinutes1, dwMinutes2);
00700         if (ret == 0)
00701         {
00702             ret = CMP(dwSeconds1, dwSeconds2);
00703         }
00704     }
00705     return ret;
00706 }
00707 
00708 int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
00709 {
00710     int ret = 0;
00711     LPPROCESS_PAGE_LIST_ITEM Param1;
00712     LPPROCESS_PAGE_LIST_ITEM Param2;
00713     ULONG IndexParam1;
00714     ULONG IndexParam2;
00715     WCHAR text1[260];
00716     WCHAR text2[260];
00717     ULONG l1;
00718     ULONG l2;
00719     LARGE_INTEGER  time1;
00720     LARGE_INTEGER  time2;
00721     IO_COUNTERS    iocounters1;
00722     IO_COUNTERS    iocounters2;
00723     ULONGLONG      ull1;
00724     ULONGLONG      ull2;
00725 
00726     if (TaskManagerSettings.SortAscending) {
00727         Param1 = (LPPROCESS_PAGE_LIST_ITEM)lParam1;
00728         Param2 = (LPPROCESS_PAGE_LIST_ITEM)lParam2;
00729     } else {
00730         Param1 = (LPPROCESS_PAGE_LIST_ITEM)lParam2;
00731         Param2 = (LPPROCESS_PAGE_LIST_ITEM)lParam1;
00732     }
00733     IndexParam1 = PerfDataGetProcessIndex(Param1->ProcessId);
00734     IndexParam2 = PerfDataGetProcessIndex(Param2->ProcessId);
00735 
00736     if (TaskManagerSettings.SortColumn == COLUMN_IMAGENAME)
00737     {
00738         PerfDataGetImageName(IndexParam1, text1, sizeof (text1) / sizeof (*text1));
00739         PerfDataGetImageName(IndexParam2, text2, sizeof (text2) / sizeof (*text2));
00740         ret = _wcsicmp(text1, text2);
00741     }
00742     else if (TaskManagerSettings.SortColumn == COLUMN_PID)
00743     {
00744         l1 = Param1->ProcessId;
00745         l2 = Param2->ProcessId;
00746         ret = CMP(l1, l2);
00747     }
00748     else if (TaskManagerSettings.SortColumn == COLUMN_USERNAME)
00749     {
00750         PerfDataGetUserName(IndexParam1, text1, sizeof (text1) / sizeof (*text1));
00751         PerfDataGetUserName(IndexParam2, text2, sizeof (text2) / sizeof (*text2));
00752         ret = _wcsicmp(text1, text2);
00753     }
00754     else if (TaskManagerSettings.SortColumn == COLUMN_SESSIONID)
00755     {
00756         l1 = PerfDataGetSessionId(IndexParam1);
00757         l2 = PerfDataGetSessionId(IndexParam2);
00758         ret = CMP(l1, l2);
00759     }
00760     else if (TaskManagerSettings.SortColumn == COLUMN_CPUUSAGE)
00761     {
00762         l1 = PerfDataGetCPUUsage(IndexParam1);
00763         l2 = PerfDataGetCPUUsage(IndexParam2);
00764         ret = CMP(l1, l2);
00765     }
00766     else if (TaskManagerSettings.SortColumn == COLUMN_CPUTIME)
00767     {
00768         time1 = PerfDataGetCPUTime(IndexParam1);
00769         time2 = PerfDataGetCPUTime(IndexParam2);
00770         ret = largeintcmp(time1, time2);
00771     }
00772     else if (TaskManagerSettings.SortColumn == COLUMN_MEMORYUSAGE)
00773     {
00774         l1 = PerfDataGetWorkingSetSizeBytes(IndexParam1);
00775         l2 = PerfDataGetWorkingSetSizeBytes(IndexParam2);
00776         ret = CMP(l1, l2);
00777     }
00778     else if (TaskManagerSettings.SortColumn == COLUMN_PEAKMEMORYUSAGE)
00779     {
00780         l1 = PerfDataGetPeakWorkingSetSizeBytes(IndexParam1);
00781         l2 = PerfDataGetPeakWorkingSetSizeBytes(IndexParam2);
00782         ret = CMP(l1, l2);
00783     }
00784     else if (TaskManagerSettings.SortColumn == COLUMN_MEMORYUSAGEDELTA)
00785     {
00786         l1 = PerfDataGetWorkingSetSizeDelta(IndexParam1);
00787         l2 = PerfDataGetWorkingSetSizeDelta(IndexParam2);
00788         ret = CMP(l1, l2);
00789     }
00790     else if (TaskManagerSettings.SortColumn == COLUMN_PAGEFAULTS)
00791     {
00792         l1 = PerfDataGetPageFaultCount(IndexParam1);
00793         l2 = PerfDataGetPageFaultCount(IndexParam2);
00794         ret = CMP(l1, l2);
00795     }
00796     else if (TaskManagerSettings.SortColumn == COLUMN_PAGEFAULTSDELTA)
00797     {
00798         l1 = PerfDataGetPageFaultCountDelta(IndexParam1);
00799         l2 = PerfDataGetPageFaultCountDelta(IndexParam2);
00800         ret = CMP(l1, l2);
00801     }
00802     else if (TaskManagerSettings.SortColumn == COLUMN_VIRTUALMEMORYSIZE)
00803     {
00804         l1 = PerfDataGetVirtualMemorySizeBytes(IndexParam1);
00805         l2 = PerfDataGetVirtualMemorySizeBytes(IndexParam2);
00806         ret = CMP(l1, l2);
00807     }
00808     else if (TaskManagerSettings.SortColumn == COLUMN_PAGEDPOOL)
00809     {
00810         l1 = PerfDataGetPagedPoolUsagePages(IndexParam1);
00811         l2 = PerfDataGetPagedPoolUsagePages(IndexParam2);
00812         ret = CMP(l1, l2);
00813     }
00814     else if (TaskManagerSettings.SortColumn == COLUMN_NONPAGEDPOOL)
00815     {
00816         l1 = PerfDataGetNonPagedPoolUsagePages(IndexParam1);
00817         l2 = PerfDataGetNonPagedPoolUsagePages(IndexParam2);
00818         ret = CMP(l1, l2);
00819     }
00820     else if (TaskManagerSettings.SortColumn == COLUMN_BASEPRIORITY)
00821     {
00822         l1 = PerfDataGetBasePriority(IndexParam1);
00823         l2 = PerfDataGetBasePriority(IndexParam2);
00824         ret = CMP(l1, l2);
00825     }
00826     else if (TaskManagerSettings.SortColumn == COLUMN_HANDLECOUNT)
00827     {
00828         l1 = PerfDataGetHandleCount(IndexParam1);
00829         l2 = PerfDataGetHandleCount(IndexParam2);
00830         ret = CMP(l1, l2);
00831     }
00832     else if (TaskManagerSettings.SortColumn == COLUMN_THREADCOUNT)
00833     {
00834         l1 = PerfDataGetThreadCount(IndexParam1);
00835         l2 = PerfDataGetThreadCount(IndexParam2);
00836         ret = CMP(l1, l2);
00837     }
00838     else if (TaskManagerSettings.SortColumn == COLUMN_USEROBJECTS)
00839     {
00840         l1 = PerfDataGetUSERObjectCount(IndexParam1);
00841         l2 = PerfDataGetUSERObjectCount(IndexParam2);
00842         ret = CMP(l1, l2);
00843     }
00844     else if (TaskManagerSettings.SortColumn == COLUMN_GDIOBJECTS)
00845     {
00846         l1 = PerfDataGetGDIObjectCount(IndexParam1);
00847         l2 = PerfDataGetGDIObjectCount(IndexParam2);
00848         ret = CMP(l1, l2);
00849     }
00850     else if (TaskManagerSettings.SortColumn == COLUMN_IOREADS)
00851     {
00852         PerfDataGetIOCounters(IndexParam1, &iocounters1);
00853         PerfDataGetIOCounters(IndexParam2, &iocounters2);
00854         ull1 = iocounters1.ReadOperationCount;
00855         ull2 = iocounters2.ReadOperationCount;
00856         ret = CMP(ull1, ull2);
00857     }
00858     else if (TaskManagerSettings.SortColumn == COLUMN_IOWRITES)
00859     {
00860         PerfDataGetIOCounters(IndexParam1, &iocounters1);
00861         PerfDataGetIOCounters(IndexParam2, &iocounters2);
00862         ull1 = iocounters1.WriteOperationCount;
00863         ull2 = iocounters2.WriteOperationCount;
00864         ret = CMP(ull1, ull2);
00865     }
00866     else if (TaskManagerSettings.SortColumn == COLUMN_IOOTHER)
00867     {
00868         PerfDataGetIOCounters(IndexParam1, &iocounters1);
00869         PerfDataGetIOCounters(IndexParam2, &iocounters2);
00870         ull1 = iocounters1.OtherOperationCount;
00871         ull2 = iocounters2.OtherOperationCount;
00872         ret = CMP(ull1, ull2);
00873     }
00874     else if (TaskManagerSettings.SortColumn == COLUMN_IOREADBYTES)
00875     {
00876         PerfDataGetIOCounters(IndexParam1, &iocounters1);
00877         PerfDataGetIOCounters(IndexParam2, &iocounters2);
00878         ull1 = iocounters1.ReadTransferCount;
00879         ull2 = iocounters2.ReadTransferCount;
00880         ret = CMP(ull1, ull2);
00881     }
00882     else if (TaskManagerSettings.SortColumn == COLUMN_IOWRITEBYTES)
00883     {
00884         PerfDataGetIOCounters(IndexParam1, &iocounters1);
00885         PerfDataGetIOCounters(IndexParam2, &iocounters2);
00886         ull1 = iocounters1.WriteTransferCount;
00887         ull2 = iocounters2.WriteTransferCount;
00888         ret = CMP(ull1, ull2);
00889     }
00890     else if (TaskManagerSettings.SortColumn == COLUMN_IOOTHERBYTES)
00891     {
00892         PerfDataGetIOCounters(IndexParam1, &iocounters1);
00893         PerfDataGetIOCounters(IndexParam2, &iocounters2);
00894         ull1 = iocounters1.OtherTransferCount;
00895         ull2 = iocounters2.OtherTransferCount;
00896         ret = CMP(ull1, ull2);
00897     }
00898     return ret;
00899 }

Generated on Sat May 26 2012 04:16:29 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.