Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenprocpage.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
1.7.6.1
|