📄 pviewer.c
字号:
pInstance = FindInstanceN (gpProcessObject, dwIndex);
bStat = RefreshMemoryDlg (hMemDlg,
pInstance,
gpProcessObject,
gpAddressSpaceObject,
gpImageObject);
SendMessage (hImageList, WM_SETREDRAW, TRUE, 0);
SendMessage (hImageList, CB_SETCURSEL, 0, 0);
if (!bStat)
{
MessageBox (hMemDlg,
TEXT("Unable to retrieve memory detail"),
TEXT("Memory detail"),
MB_ICONSTOP|MB_OK);
PostMessage (hMemDlg, WM_CLOSE, 0, 0);
}
}
//********************************************************
//
// MemDlgRefreshCurSelImage --
//
// Refresh the current selected image for memory dialog.
//
void MemDlgRefreshCurSelImage (HWND hMemDlg, HWND hPviewDlg)
{
HWND hList;
INT nIndex;
DWORD dwIndex;
hList = GetDlgItem (hMemDlg, MEMORY_IMAGE);
nIndex = SendMessage (hList, CB_GETCURSEL, 0, 0);
if (nIndex == CB_ERR)
nIndex = 0;
dwIndex = SendMessage (hList, CB_GETITEMDATA, nIndex, 0);
if (dwIndex == 0xFFFFFFFF)
MemDlgRefresh (hMemDlg, hPviewDlg);
else
RefreshMemoryDlgImage (hMemDlg, dwIndex, gpImageObject);
}
/****************
utility functions
****************/
//********************************************************
//
// GetCurSelText --
//
// Get the text of current selection. Used for later ReSelectText().
//
INT GetCurSelText (HWND hList, LPTSTR str)
{
INT Index;
INT Length;
Index = SendMessage (hList, LB_GETCURSEL, 0, 0);
Length = SendMessage (hList, LB_GETTEXT, Index, (DWORD)str);
return Index;
}
//********************************************************
//
// GetCurSelData --
//
// Get the data associated with the current selection.
//
DWORD GetCurSelData (HWND hWnd, DWORD dwList)
{
HWND hList;
INT nIndex;
DWORD dwIndex;
hList = GetDlgItem (hWnd, dwList);
nIndex = SendMessage (hList, LB_GETCURSEL, 0, 0);
if (nIndex == LB_ERR)
nIndex = 0;
dwIndex = SendMessage (hList, LB_GETITEMDATA, nIndex, 0);
return dwIndex;
}
//********************************************************
//
// ReSelectText --
//
// Reselect the line specified by str. Returns the new index. If cannot
// find the line or any error, then 0 is returned.
//
INT ReSelectText (HWND hList, INT StartIndex, LPTSTR str)
{
INT Index;
INT Length;
TCHAR SaveChar = TEXT('\0');
Index = SendMessage (hList, LB_FINDSTRING, StartIndex, (DWORD)str);
if (Index == LB_ERR)
{
Length = lstrlen (str);
while (Index == LB_ERR && Length)
{
SaveChar = str[Length-1];
str[Length-1] = TEXT('\0');
Index = SendMessage (hList, LB_FINDSTRING, StartIndex, (DWORD)str);
str[Length-1] = SaveChar;
Length--;
}
}
if (Index == LB_ERR)
return 0;
else
{
SendMessage (hList, LB_SETCURSEL, Index, 0);
return Index;
}
}
//********************************************************
//
// SetPerfIndexes
//
// Setup the perf data indexes.
//
void SetPerfIndexes (HWND hWnd)
{
LPTSTR TitleBuffer;
LPTSTR *Title;
DWORD Last;
TCHAR szTemp[50];
DWORD dwR;
dwR = GetPerfTitleSz (ghMachineKey, ghPerfKey, &TitleBuffer, &Title, &Last);
if (dwR != ERROR_SUCCESS)
{
wsprintf (szTemp, TEXT("Unable to retrieve counter indexes, ERROR -> %#x"), dwR);
MessageBox (hWnd, szTemp, TEXT("Pviewer"), MB_OK|MB_ICONEXCLAMATION);
return;
}
PX_PROCESS = GetTitleIdx (hWnd, Title, Last, PN_PROCESS);
PX_PROCESS_CPU = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_CPU);
PX_PROCESS_PRIV = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PRIV);
PX_PROCESS_USER = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_USER);
PX_PROCESS_WORKING_SET = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_WORKING_SET);
PX_PROCESS_PEAK_WS = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PEAK_WS);
PX_PROCESS_PRIO = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PRIO);
PX_PROCESS_ELAPSE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_ELAPSE);
PX_PROCESS_ID = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_ID);
PX_PROCESS_PRIVATE_PAGE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PRIVATE_PAGE);
PX_PROCESS_VIRTUAL_SIZE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_VIRTUAL_SIZE);
PX_PROCESS_PEAK_VS = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PEAK_VS);
PX_PROCESS_FAULT_COUNT = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_FAULT_COUNT);
PX_THREAD = GetTitleIdx (hWnd, Title, Last, PN_THREAD);
PX_THREAD_CPU = GetTitleIdx (hWnd, Title, Last, PN_THREAD_CPU);
PX_THREAD_PRIV = GetTitleIdx (hWnd, Title, Last, PN_THREAD_PRIV);
PX_THREAD_USER = GetTitleIdx (hWnd, Title, Last, PN_THREAD_USER);
PX_THREAD_START = GetTitleIdx (hWnd, Title, Last, PN_THREAD_START);
PX_THREAD_SWITCHES = GetTitleIdx (hWnd, Title, Last, PN_THREAD_SWITCHES);
PX_THREAD_PRIO = GetTitleIdx (hWnd, Title, Last, PN_THREAD_PRIO);
PX_THREAD_BASE_PRIO = GetTitleIdx (hWnd, Title, Last, PN_THREAD_BASE_PRIO);
PX_THREAD_ELAPSE = GetTitleIdx (hWnd, Title, Last, PN_THREAD_ELAPSE);
PX_THREAD_DETAILS = GetTitleIdx (hWnd, Title, Last, PN_THREAD_DETAILS);
PX_THREAD_PC = GetTitleIdx (hWnd, Title, Last, PN_THREAD_PC);
PX_IMAGE = GetTitleIdx (hWnd, Title, Last, PN_IMAGE);
PX_IMAGE_NOACCESS = GetTitleIdx (hWnd, Title, Last, PN_IMAGE_NOACCESS);
PX_IMAGE_READONLY = GetTitleIdx (hWnd, Title, Last, PN_IMAGE_READONLY);
PX_IMAGE_READWRITE = GetTitleIdx (hWnd, Title, Last, PN_IMAGE_READWRITE);
PX_IMAGE_WRITECOPY = GetTitleIdx (hWnd, Title, Last, PN_IMAGE_WRITECOPY);
PX_IMAGE_EXECUTABLE = GetTitleIdx (hWnd, Title, Last, PN_IMAGE_EXECUTABLE);
PX_IMAGE_EXE_READONLY = GetTitleIdx (hWnd, Title, Last, PN_IMAGE_EXE_READONLY);
PX_IMAGE_EXE_READWRITE = GetTitleIdx (hWnd, Title, Last, PN_IMAGE_EXE_READWRITE);
PX_IMAGE_EXE_WRITECOPY = GetTitleIdx (hWnd, Title, Last, PN_IMAGE_EXE_WRITECOPY);
PX_PROCESS_ADDRESS_SPACE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_ADDRESS_SPACE);
PX_PROCESS_PRIVATE_NOACCESS = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PRIVATE_NOACCESS);
PX_PROCESS_PRIVATE_READONLY = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PRIVATE_READONLY);
PX_PROCESS_PRIVATE_READWRITE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PRIVATE_READWRITE);
PX_PROCESS_PRIVATE_WRITECOPY = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PRIVATE_WRITECOPY);
PX_PROCESS_PRIVATE_EXECUTABLE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PRIVATE_EXECUTABLE);
PX_PROCESS_PRIVATE_EXE_READONLY = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PRIVATE_EXE_READONLY);
PX_PROCESS_PRIVATE_EXE_READWRITE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PRIVATE_EXE_READWRITE);
PX_PROCESS_PRIVATE_EXE_WRITECOPY = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_PRIVATE_EXE_WRITECOPY);
PX_PROCESS_MAPPED_NOACCESS = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_MAPPED_NOACCESS);
PX_PROCESS_MAPPED_READONLY = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_MAPPED_READONLY);
PX_PROCESS_MAPPED_READWRITE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_MAPPED_READWRITE);
PX_PROCESS_MAPPED_WRITECOPY = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_MAPPED_WRITECOPY);
PX_PROCESS_MAPPED_EXECUTABLE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_MAPPED_EXECUTABLE);
PX_PROCESS_MAPPED_EXE_READONLY = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_MAPPED_EXE_READONLY);
PX_PROCESS_MAPPED_EXE_READWRITE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_MAPPED_EXE_READWRITE);
PX_PROCESS_MAPPED_EXE_WRITECOPY = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_MAPPED_EXE_WRITECOPY);
PX_PROCESS_IMAGE_NOACCESS = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_IMAGE_NOACCESS);
PX_PROCESS_IMAGE_READONLY = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_IMAGE_READONLY);
PX_PROCESS_IMAGE_READWRITE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_IMAGE_READWRITE);
PX_PROCESS_IMAGE_WRITECOPY = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_IMAGE_WRITECOPY);
PX_PROCESS_IMAGE_EXECUTABLE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_IMAGE_EXECUTABLE);
PX_PROCESS_IMAGE_EXE_READONLY = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_IMAGE_EXE_READONLY);
PX_PROCESS_IMAGE_EXE_READWRITE = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_IMAGE_EXE_READWRITE);
PX_PROCESS_IMAGE_EXE_WRITECOPY = GetTitleIdx (hWnd, Title, Last, PN_PROCESS_IMAGE_EXE_WRITECOPY);
wsprintf (INDEX_PROCTHRD_OBJ, TEXT("%ld %ld"), PX_PROCESS, PX_THREAD);
wsprintf (INDEX_COSTLY_OBJ, TEXT("%ld %ld %ld"),
PX_PROCESS_ADDRESS_SPACE, PX_IMAGE, PX_THREAD_DETAILS);
LocalFree (TitleBuffer);
LocalFree (Title);
}
//********************************************************
//
// GetTitleIdx
//
// Searches Titles[] for Name. Returns the index found.
//
DWORD GetTitleIdx (HWND hWnd, LPTSTR Title[], DWORD LastIndex, LPTSTR Name)
{
DWORD Index;
for (Index = 0; Index <= LastIndex; Index++)
if (Title[Index])
if (!lstrcmpi (Title[Index], Name))
return Index;
MessageBox (hWnd, Name, TEXT("Pviewer cannot find index"), MB_OK);
return 0;
}
//********************************************************
//
// SetListBoxTabStops --
//
// Set tab stops in the two list boxes.
//
void SetListBoxTabStops (HWND hWnd)
{
HWND hListBox;
INT Tabs[4] = {22*4, 36*4, 44*4};
hListBox = GetDlgItem (hWnd, PVIEW_PROCESS_LIST);
SendMessage (hListBox, LB_SETTABSTOPS, 3, (DWORD)Tabs);
hListBox = GetDlgItem (hWnd, PVIEW_THREAD_LIST);
SendMessage (hListBox, LB_SETTABSTOPS, 3, (DWORD)Tabs);
}
//********************************************************
//
// SetLocalMachine --
//
// Set local machine as performance data focus.
//
// Sets ghPerfKey
// ghMachineKey
// gszMachineName
// gszCurrentMachine
//
void SetLocalMachine (void)
{
TCHAR szName[MACHINE_NAME_SIZE];
DWORD dwSize = MACHINE_NAME_SIZE;
// close remote connections, if any
//
if (ghPerfKey != HKEY_PERFORMANCE_DATA)
RegCloseKey (ghPerfKey);
if (ghMachineKey != HKEY_LOCAL_MACHINE)
RegCloseKey (ghMachineKey);
// set to registry keys on local machine
//
ghPerfKey = HKEY_PERFORMANCE_DATA;
ghMachineKey = HKEY_LOCAL_MACHINE;
// get computer name
GetComputerName (szName, &dwSize);
if (szName[0] != '\\' || szName[1] != '\\') // must have two '\\'
{
wsprintf (gszMachineName, TEXT("\\\\%s"), szName);
lstrcpy (gszCurrentMachine, gszMachineName);
}
else
{
lstrcpy (gszMachineName, szName);
lstrcpy (gszCurrentMachine, gszMachineName);
}
}
//********************************************************
//
// ConnectComputer --
//
// Connect to a computer with name entered in PVIEW_COMPUTER.
// If a new connection is made, then return TRUE else return FALSE.
//
// Sets gszCurrentMachine
// ghPerfKey
// ghMachineKey
//
BOOL ConnectComputer (HWND hWnd)
{
DWORD dwR;
HKEY hKey;
TCHAR szTemp[MACHINE_NAME_SIZE];
TCHAR szTemp2[MACHINE_NAME_SIZE+100];
BOOL bResult = TRUE;
MSG Msg;
SetCursor (ghCursor[1]);
if (!GetDlgItemText (hWnd, PVIEW_COMPUTER, szTemp, sizeof (szTemp)))
{
SetLocalMachine ();
SetDlgItemText (hWnd, PVIEW_COMPUTER, gszCurrentMachine);
}
else if (!lstrcmpi (szTemp, gszCurrentMachine)) // didn't change name
bResult = FALSE;
else if (!lstrcmpi (szTemp, gszMachineName)) // local machine
{
SetLocalMachine ();
EnableControls (hWnd);
}
else
{
// a remote machine, connect to it
//
dwR = RegConnectRegistry (szTemp, HKEY_PERFORMANCE_DATA, &hKey);
if (dwR != ERROR_SUCCESS)
{
wsprintf (szTemp2, TEXT("Cannot connect to computer %s"), szTemp);
MessageBox (hWnd, szTemp2, TEXT(""), MB_ICONEXCLAMATION|MB_OK);
SetDlgItemText (hWnd, PVIEW_COMPUTER, gszCurrentMachine);
bResult = FALSE;
}
else
{
// connected
//
lstrcpy (gszCurrentMachine, szTemp);
if (ghPerfKey != HKEY_PERFORMANCE_DATA)
RegCloseKey (ghPerfKey);
ghPerfKey = hKey;
DisableControls (hWnd);
// we also need to get the remote machine's title indexes.
//
dwR = RegConnectRegistry (gszCurrentMachine, HKEY_LOCAL_MACHINE, &hKey);
if (ghMachineKey != HKEY_LOCAL_MACHINE)
RegCloseKey (ghMachineKey);
if (dwR == ERROR_SUCCESS)
ghMachineKey = hKey;
else
// unable to connect, so we'll use our own indexes.
//
ghMachineKey = HKEY_LOCAL_MACHINE;
}
}
// Remove all mouse and key messages. They are not accepted
// while the cursor is a hourglass.
//
while (PeekMessage (&Msg, hWnd, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE));
while (PeekMessage (&Msg, hWnd, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE));
SetCursor (ghCursor[0]);
EnableWindow (GetDlgItem (hWnd, PVIEW_CONNECT), FALSE);
return bResult;
}
//********************************************************
//
// DisableControls --
//
// Disable controls that don't make sense on remote machine
//
void DisableControls (HWND hPviewDlg)
{
EnableWindow (GetDlgItem (hPviewDlg, PVIEW_TERMINATE), FALSE);
EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_HIGH), FALSE);
EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_NORMAL), FALSE);
EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_IDL), FALSE);
}
//********************************************************
//
// EnableControls --
//
// Enable controls disabled by DisableControl().
//
void EnableControls (HWND hPviewDlg)
{
EnableWindow (GetDlgItem (hPviewDlg, PVIEW_TERMINATE), TRUE);
EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_HIGH), TRUE);
EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_NORMAL), TRUE);
EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_IDL), TRUE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -