📄 pviewer.c
字号:
//********************************************************
//
// PviewDlgRefreshProcess --
//
// Refresh the process list and data in pview dialog.
//
void PviewDlgRefreshProcess (HWND hWnd)
{
TCHAR szProcessString[256];
INT nProcess;
INT nIndex;
HWND hProcessList;
DWORD dwProcessIndex;
// refresh process list
//
hProcessList = GetDlgItem (hWnd, PVIEW_PROCESS_LIST);
nProcess = GetCurSelText (hProcessList, szProcessString);
SendMessage (hProcessList, WM_SETREDRAW, FALSE, 0);
SendMessage (hProcessList, LB_RESETCONTENT, 0, 0);
SendMessage (hProcessList, LB_SETITEMDATA, 0, 0);
RefreshProcessList (hProcessList, gpProcessObject);
// refresh process data
//
if (nProcess != LB_ERR)
nIndex = ReSelectText (hProcessList, nProcess, szProcessString);
else
nIndex = 0;
dwProcessIndex = SendMessage (hProcessList, LB_GETITEMDATA, nIndex, 0);
RefreshProcessData (hWnd, gpProcessObject, dwProcessIndex);
SendMessage (hProcessList, WM_SETREDRAW, TRUE, 0);
}
//********************************************************
//
// PviewDlgRefreshThread --
//
// Refresh the thread list and data in pview dialog.
//
void PviewDlgRefreshThread (HWND hWnd)
{
TCHAR szThreadString[256];
INT nThread;
INT nIndex;
HWND hThreadList;
DWORD dwThreadIndex;
PPERF_INSTANCE pProcessInstance;
DWORD dwProcessIndex;
// get process info
//
dwProcessIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
pProcessInstance = FindInstanceN (gpProcessObject, dwProcessIndex);
// refresh thread list
//
hThreadList = GetDlgItem (hWnd, PVIEW_THREAD_LIST);
nThread = GetCurSelText (hThreadList, szThreadString);
SendMessage (hThreadList, WM_SETREDRAW, FALSE, 0);
SendMessage (hThreadList, LB_RESETCONTENT, 0, 0);
SendMessage (hThreadList, LB_SETITEMDATA, 0, 0);
RefreshThreadList (hThreadList, gpThreadObject, dwProcessIndex);
// refresh thread data
//
if (nThread != LB_ERR)
nIndex = ReSelectText (hThreadList, nThread, szThreadString);
else
nIndex = 0;
dwThreadIndex = SendMessage (hThreadList, LB_GETITEMDATA, nIndex, 0);
RefreshThreadData (hWnd,
gpThreadObject,
dwThreadIndex,
gpProcessObject,
pProcessInstance);
SendMessage (hThreadList, WM_SETREDRAW, TRUE, 0);
}
//********************************************************
//
// PviewDlgGetCurSelPriority --
//
// Get the process priority of currently selected process.
//
WORD PviewDlgGetCurSelPriority (HWND hWnd)
{
DWORD dwIndex;
PPERF_INSTANCE pInst;
dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
pInst = FindInstanceN (gpProcessObject, dwIndex);
return ProcessPriority (gpProcessObject, pInst);
}
//********************************************************
//
// PviewDlgRefreshCurSelProcess --
//
// Refresh the data of currently selected process.
//
void PviewDlgRefreshCurSelProcess (HWND hWnd)
{
DWORD dwIndex;
dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
RefreshProcessData (hWnd, gpProcessObject, dwIndex);
PviewDlgRefreshThread (hWnd);
}
//********************************************************
//
// PviewDlgRefreshCurSelThread --
//
// Refresh the data of currently selected thread.
//
void PviewDlgRefreshCurSelThread (HWND hWnd)
{
PPERF_INSTANCE pProcessInstance;
DWORD dwIndex;
dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
pProcessInstance = FindInstanceN (gpProcessObject, dwIndex);
dwIndex = GetCurSelData (hWnd, PVIEW_THREAD_LIST);
RefreshThreadData (hWnd,
gpThreadObject,
dwIndex,
gpProcessObject,
pProcessInstance);
}
//********************************************************
//
// PviewDlgChangePriority --
//
// Change process priority.
//
BOOL PviewDlgChangePriority (HWND hWnd, DWORD wParam, WORD wItem)
{
DWORD dwIndex;
PPERF_INSTANCE pInst;
PPERF_COUNTER pCountID;
DWORD *pProcessID;
DWORD ProcessID;
HANDLE hProcess;
BOOL bStat;
dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
pInst = FindInstanceN (gpProcessObject, dwIndex);
if (pCountID = FindCounter (gpProcessObject, PX_PROCESS_ID))
{
pProcessID = (DWORD *) CounterData (pInst, pCountID);
ProcessID = *pProcessID;
}
else
{
SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
SetFocus (GetDlgItem (hWnd, wItem));
MessageBox (hWnd,
TEXT("Cannot find ID for this process"),
TEXT("Set priority"),
MB_ICONEXCLAMATION|MB_OK);
return FALSE;
}
hProcess = OpenProcess (PROCESS_SET_INFORMATION, FALSE, ProcessID);
if (!hProcess)
{
SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
SetFocus (GetDlgItem (hWnd, wItem));
MessageBox (hWnd,
TEXT("Unable to open the process; Priority not changed"),
TEXT("Set priority"),
MB_ICONEXCLAMATION|MB_OK);
return FALSE;
}
switch (wParam)
{
case PVIEW_PRIORITY_HIGH:
bStat = SetPriorityClass (hProcess, HIGH_PRIORITY_CLASS);
break;
case PVIEW_PRIORITY_NORMAL:
bStat = SetPriorityClass (hProcess, NORMAL_PRIORITY_CLASS);
break;
case PVIEW_PRIORITY_IDL:
bStat = SetPriorityClass (hProcess, IDLE_PRIORITY_CLASS);
break;
default:
break;
}
CloseHandle (hProcess);
if (!bStat)
{
SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
SetFocus (GetDlgItem (hWnd, wItem));
MessageBox (hWnd,
TEXT("Unable to change priority"),
TEXT("Set priority"),
MB_ICONEXCLAMATION|MB_OK);
return FALSE;
}
return TRUE;
}
//********************************************************
//
// PviewDlgTerminateProcess --
//
// Terminate the current selected process.
//
BOOL PviewDlgTerminateProcess (HWND hPviewDlg)
{
DWORD dwIndex;
PPERF_INSTANCE pInst;
PPERF_COUNTER pCountID;
DWORD *pProcessID;
DWORD ProcessID;
HANDLE hProcess;
TCHAR szTemp[50];
dwIndex = GetCurSelData (hPviewDlg, PVIEW_PROCESS_LIST);
pInst = FindInstanceN (gpProcessObject, dwIndex);
if (pCountID = FindCounter (gpProcessObject, PX_PROCESS_ID))
{
pProcessID = (DWORD *) CounterData (pInst, pCountID);
ProcessID = *pProcessID;
}
else
{
MessageBox (hPviewDlg,
TEXT("Cannot find ID for this process"),
TEXT("Terminate Process"),
MB_ICONEXCLAMATION|MB_OK);
return FALSE;
}
wsprintf (szTemp, TEXT("Terminate process %s (ID %#x)?"),
InstanceName (pInst), ProcessID);
if (MessageBox (hPviewDlg, szTemp, TEXT("Terminate Process"), MB_ICONSTOP|MB_OKCANCEL) != IDOK)
return FALSE;
hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, ProcessID);
if (!hProcess)
{
MessageBox (hPviewDlg,
TEXT("Unable to open the process; Process not terminated"),
TEXT("Terminate Process"),
MB_ICONEXCLAMATION|MB_OK);
return FALSE;
}
if (!TerminateProcess (hProcess, 99))
{
MessageBox (hPviewDlg,
TEXT("Unable to terminate the process."),
TEXT("Terminate Process"),
MB_ICONEXCLAMATION|MB_OK);
CloseHandle (hProcess);
return FALSE;
}
CloseHandle (hProcess);
return TRUE;
}
/***************
MemDlg functions
***************/
//********************************************************
//
// MemDlgProc --
//
// MemoryDlg procedure
//
BOOL CALLBACK MemDlgProc (HWND hWnd,
UINT wMsg,
WPARAM wParam,
LPARAM lParam)
{
static HWND hPviewDlg;
switch (wMsg)
{
case WM_INITDIALOG:
hPviewDlg = (HWND)lParam;
PostMessage (hWnd, WM_COMMAND, MEMORY_REFRESH, 0);
break;
case WM_QUIT:
case WM_CLOSE:
EndDialog (hWnd, TRUE);
break;
case WM_COMMAND:
switch (LOWORD (wParam))
{
// get the memory statistics for the currently selected
// process/thread
//
case MEMORY_IMAGE:
if (HIWORD(wParam) == CBN_DBLCLK || HIWORD(wParam) == CBN_SELCHANGE)
{
if (WaitForSingleObject (ghMemUpdateMutex, 0))
return FALSE;
MemDlgRefreshCurSelImage (hWnd, hPviewDlg);
ReleaseMutex (ghMemUpdateMutex);
}
else
return FALSE;
break;
// refresh the current memory statistics,
// retry if we can't get the mutex
//
case MEMORY_REFRESH:
if (WaitForSingleObject (ghMemUpdateMutex, 1000))
{
// can't get the mutex, retry...
//
PostMessage (hWnd, WM_COMMAND, MEMORY_REFRESH, 0);
return FALSE;
}
MemDlgRefresh (hWnd, hPviewDlg);
ReleaseMutex (ghMemUpdateMutex);
break;
case IDCANCEL:
case IDOK:
EndDialog (hWnd, TRUE);
break;
default:
return FALSE;
}
default:
return FALSE;
}
return TRUE;
}
//********************************************************
//
// MemDlgUpdateThread --
//
// This function runs in a separate thread to collect memory data.
//
void MemDlgUpdateThread (HWND hPviewDlg)
{
ghMemUpdateMutex = CreateMutex (NULL, TRUE, NULL);
ghMemUpdateEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
while (TRUE)
{
EnableWindow (GetDlgItem (hPviewDlg, PVIEW_MEMORY_DETAIL), FALSE);
gpCostlyData = RefreshPerfData (ghPerfKey,
INDEX_COSTLY_OBJ,
gpCostlyData,
&gCostlyDataSize);
gpAddressSpaceObject = FindObject (gpCostlyData, PX_PROCESS_ADDRESS_SPACE);
gpThreadDetailsObject = FindObject (gpCostlyData, PX_THREAD_DETAILS);
gpImageObject = FindObject (gpCostlyData, PX_IMAGE);
EnableWindow (GetDlgItem (hPviewDlg, PVIEW_MEMORY_DETAIL), TRUE);
ReleaseMutex (ghMemUpdateMutex);
PostMessage (hPviewDlg, WM_COMMAND, PVIEW_REFRESH_COSTLY_DATA, 0);
WaitForSingleObject (ghMemUpdateEvent, INFINITE);
WaitForSingleObject (ghMemUpdateMutex, INFINITE);
}
}
//********************************************************
//
// MemDlgRefresh --
//
// Refresh the memory dialog.
//
void MemDlgRefresh (HWND hMemDlg, HWND hPviewDlg)
{
HWND hImageList;
DWORD dwIndex;
BOOL bStat;
PPERF_INSTANCE pInstance;
hImageList = GetDlgItem (hMemDlg, MEMORY_IMAGE);
SendMessage (hImageList, WM_SETREDRAW, FALSE, 0);
SendMessage (hImageList, CB_RESETCONTENT, 0, 0);
SendMessage (hImageList, CB_SETITEMDATA, 0, 0);
dwIndex = GetCurSelData (hPviewDlg, PVIEW_PROCESS_LIST);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -