915 lines
28 KiB
C
915 lines
28 KiB
C
#include <windows.h>
|
||
#include <winperf.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <stdio.h>
|
||
#include <tchar.h>
|
||
#include "showperf.h"
|
||
#include "perfdata.h"
|
||
#include "resource.h"
|
||
#include "maindlg.h"
|
||
|
||
static PPERF_DATA_BLOCK pMainPerfData = NULL; // pointer to perfdata block
|
||
static LPWSTR *szNameTable = NULL; // pointer to perf name table
|
||
static DWORD dwLastName = 0;
|
||
static TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH+3];
|
||
static TCHAR szThisComputerName[MAX_COMPUTERNAME_LENGTH+3];
|
||
static HKEY hKeyMachine = NULL;
|
||
static HKEY hKeyPerformance = NULL;
|
||
|
||
#define NUM_TAB_STOPS 3
|
||
static INT nDataListTabs[NUM_TAB_STOPS] = {
|
||
26
|
||
, 160
|
||
, 235
|
||
};
|
||
|
||
static
|
||
BOOL
|
||
LoadObjectList (
|
||
IN HWND hDlg,
|
||
IN LPCTSTR szMatchItem
|
||
)
|
||
{
|
||
PPERF_OBJECT_TYPE pObject;
|
||
HWND hWndObjectCB;
|
||
UINT nInitial = 0;
|
||
UINT nIndex;
|
||
TCHAR szNameBuffer[MAX_PATH];
|
||
DWORD dwThisObject = 0;
|
||
DWORD dwCounterType;
|
||
BOOL bReturn = TRUE;
|
||
|
||
hWndObjectCB = GetDlgItem (hDlg, IDC_OBJECT);
|
||
|
||
if (IsDlgButtonChecked (hDlg, IDC_INCLUDE_COSTLY) == CHECKED) {
|
||
dwCounterType = 1;
|
||
} else {
|
||
dwCounterType = 0;
|
||
}
|
||
|
||
// get current data block
|
||
if (GetSystemPerfData (hKeyPerformance, &pMainPerfData,
|
||
dwCounterType) == ERROR_SUCCESS) {
|
||
// data acquired so clear combo and display
|
||
SendMessage (hWndObjectCB, CB_RESETCONTENT, 0, 0);
|
||
pObject = FirstObject (pMainPerfData);
|
||
__try {
|
||
for (dwThisObject = 0; dwThisObject < pMainPerfData->NumObjectTypes; dwThisObject++) {
|
||
|
||
// get counter object name here...
|
||
|
||
_stprintf (szNameBuffer, (LPCTSTR)TEXT("(%d) %s"),
|
||
pObject->ObjectNameTitleIndex,
|
||
pObject->ObjectNameTitleIndex <= dwLastName ?
|
||
szNameTable[pObject->ObjectNameTitleIndex] : (LPCTSTR)TEXT("Name not loaded"));
|
||
|
||
nIndex = (UINT)SendMessage (hWndObjectCB, CB_INSERTSTRING, (WPARAM)-1,
|
||
(LPARAM)szNameBuffer);
|
||
|
||
if (nIndex != CB_ERR) {
|
||
// save object pointer
|
||
SendMessage (hWndObjectCB, CB_SETITEMDATA,
|
||
(WPARAM)nIndex, (LPARAM)pObject);
|
||
|
||
if (pObject->ObjectNameTitleIndex == (DWORD)pMainPerfData->DefaultObject) {
|
||
// remember this index to set the default object
|
||
nInitial = nIndex;
|
||
}
|
||
}
|
||
|
||
pObject = NextObject(pObject);
|
||
}
|
||
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
||
_stprintf (szNameBuffer,
|
||
(LPCTSTR)TEXT("An exception (0x%8.8x) occured in object block # %d returned by the system."),
|
||
GetExceptionCode (), dwThisObject+1);
|
||
MessageBox (hDlg, szNameBuffer, (LPCTSTR)TEXT("Data Error"), MB_OK);
|
||
// update the data buffer so that only the valid objects
|
||
// are accessed in the future.
|
||
pMainPerfData->NumObjectTypes = dwThisObject-1;
|
||
}
|
||
if (szMatchItem == NULL) {
|
||
SendMessage (hWndObjectCB, CB_SETCURSEL, (WPARAM)nInitial, 0);
|
||
} else {
|
||
// match to arg string as best as possible
|
||
if (SendMessage (hWndObjectCB, CB_SELECTSTRING, (WPARAM)-1,
|
||
(LPARAM)szMatchItem) == CB_ERR) {
|
||
// no match found so use default
|
||
SendMessage (hWndObjectCB, CB_SETCURSEL, (WPARAM)nInitial, 0);
|
||
}
|
||
}
|
||
} else {
|
||
DisplayMessageBox (hDlg,
|
||
IDS_UNABLE_GET_DATA,
|
||
IDS_APP_ERROR, MB_OK);
|
||
bReturn = FALSE;
|
||
}
|
||
return bReturn;
|
||
}
|
||
|
||
static
|
||
LoadInstanceList (
|
||
IN HWND hDlg,
|
||
IN LPCTSTR szMatchItem
|
||
)
|
||
{
|
||
PPERF_OBJECT_TYPE pObject;
|
||
PPERF_OBJECT_TYPE pParentObject;
|
||
PPERF_COUNTER_BLOCK pCounterBlock;
|
||
PPERF_INSTANCE_DEFINITION pInstance;
|
||
PPERF_INSTANCE_DEFINITION pParentInstance;
|
||
UINT nCbSel;
|
||
LONG lThisInstance;
|
||
TCHAR szNameBuffer[MAX_PATH];
|
||
TCHAR szParentName[MAX_PATH];
|
||
UINT nIndex;
|
||
|
||
nCbSel = (UINT)SendDlgItemMessage (hDlg, IDC_OBJECT, CB_GETCURSEL, 0, 0);
|
||
|
||
if (nCbSel != CB_ERR) {
|
||
pObject = (PPERF_OBJECT_TYPE)SendDlgItemMessage (hDlg, IDC_OBJECT, CB_GETITEMDATA,
|
||
(WPARAM)nCbSel, 0);
|
||
|
||
if (pObject->NumInstances == PERF_NO_INSTANCES) {
|
||
// no instances so...
|
||
// clear old contents
|
||
SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_RESETCONTENT, 0, 0);
|
||
// add display text
|
||
SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_INSERTSTRING, (WPARAM)-1,
|
||
(LPARAM)TEXT("<No Instances>"));
|
||
// select this (and only) string
|
||
SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_SETCURSEL, 0, 0);
|
||
// get pointer to counter data
|
||
pCounterBlock = (PPERF_COUNTER_BLOCK)((LPBYTE)pObject + pObject->DefinitionLength);
|
||
// and save it as item data
|
||
SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_SETITEMDATA, 0,
|
||
(LPARAM)pCounterBlock);
|
||
// finally grey the window to prevent selections
|
||
EnableWindow (GetDlgItem (hDlg, IDC_INSTANCE), FALSE);
|
||
} else {
|
||
//enable window
|
||
EnableWindow (GetDlgItem (hDlg, IDC_INSTANCE), TRUE);
|
||
SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_RESETCONTENT, 0, 0);
|
||
pInstance = FirstInstance (pObject);
|
||
for (lThisInstance = 0; lThisInstance < pObject->NumInstances; lThisInstance++) {
|
||
pParentObject = GetObjectDefByTitleIndex (
|
||
pMainPerfData,
|
||
pInstance->ParentObjectTitleIndex);
|
||
if (pParentObject != NULL) {
|
||
pParentInstance = GetInstance (pParentObject,
|
||
pInstance->ParentObjectInstance);
|
||
} else {
|
||
pParentInstance = NULL;
|
||
}
|
||
if (pParentInstance != NULL) {
|
||
if (pParentInstance->UniqueID < 0) {
|
||
// use the instance name
|
||
wcsncpy (szParentName,
|
||
(LPWSTR)((LPBYTE)pParentInstance+pParentInstance->NameOffset),
|
||
pParentInstance->NameLength);
|
||
lstrcat (szParentName, (LPCTSTR)TEXT("==>"));
|
||
} else {
|
||
// use the instance number
|
||
_stprintf (szParentName, (LPCTSTR)TEXT("[%d]==>"),
|
||
pParentInstance->UniqueID);
|
||
}
|
||
} else {
|
||
// unknown parent
|
||
*szParentName = 0;
|
||
}
|
||
if (pInstance->UniqueID < 0) {
|
||
// use the instance name
|
||
wcsncpy (szNameBuffer,
|
||
(LPWSTR)((LPBYTE)pInstance+pInstance->NameOffset),
|
||
pInstance->NameLength);
|
||
} else {
|
||
// use the instance number
|
||
_stprintf (szNameBuffer, (LPCTSTR)TEXT("(%d)"),
|
||
pInstance->UniqueID);
|
||
}
|
||
lstrcat (szParentName, szNameBuffer);
|
||
nIndex = (UINT)SendDlgItemMessage (hDlg, IDC_INSTANCE,
|
||
CB_INSERTSTRING, (WPARAM)-1,
|
||
(LPARAM)szParentName);
|
||
if (nIndex != CB_ERR) {
|
||
// save pointer to counter block
|
||
pCounterBlock = (PERF_COUNTER_BLOCK *)
|
||
((PCHAR) pInstance + pInstance->ByteLength);
|
||
SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_SETITEMDATA,
|
||
(WPARAM)nIndex, (LPARAM)pCounterBlock);
|
||
}
|
||
pInstance = NextInstance (pInstance);
|
||
}
|
||
if (szMatchItem == NULL) {
|
||
SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_SETCURSEL, 0, 0);
|
||
} else {
|
||
if (SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_SELECTSTRING,
|
||
(WPARAM)-1, (LPARAM)szMatchItem) == CB_ERR) {
|
||
SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_SETCURSEL, 0, 0);
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
// no object selected
|
||
// clear old contents
|
||
SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_RESETCONTENT, 0, 0);
|
||
// add display text
|
||
SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_INSERTSTRING, (WPARAM)-1,
|
||
(LPARAM)TEXT("<No object selected>"));
|
||
// select this (and only) string
|
||
SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_SETCURSEL, 0, 0);
|
||
// and save null pointer as item data
|
||
SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_SETITEMDATA, 0,
|
||
(LPARAM)0);
|
||
// finally grey the window to prevent selections
|
||
EnableWindow (GetDlgItem (hDlg, IDC_INSTANCE), FALSE);
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
static
|
||
LPCTSTR
|
||
GetCounterTypeName (
|
||
IN DWORD dwCounterType
|
||
)
|
||
{
|
||
UINT nTypeString = 0;
|
||
|
||
switch (dwCounterType) {
|
||
case PERF_COUNTER_COUNTER:
|
||
nTypeString = IDS_TYPE_COUNTER_COUNTER ;
|
||
break;
|
||
|
||
case PERF_COUNTER_TIMER:
|
||
nTypeString = IDS_TYPE_COUNTER_TIMER ;
|
||
break;
|
||
|
||
case PERF_COUNTER_QUEUELEN_TYPE:
|
||
nTypeString = IDS_TYPE_COUNTER_QUEUELEN ;
|
||
break;
|
||
|
||
case PERF_COUNTER_LARGE_QUEUELEN_TYPE:
|
||
nTypeString = IDS_TYPE_COUNTER_LARGE_QUEUELEN ;
|
||
break;
|
||
|
||
case PERF_COUNTER_100NS_QUEUELEN_TYPE:
|
||
nTypeString = IDS_TYPE_COUNTER_100NS_QUEUELEN ;
|
||
break;
|
||
|
||
case PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPE:
|
||
nTypeString = IDS_TYPE_COUNTER_OBJ_TIME_QUEUELEN ;
|
||
break;
|
||
|
||
case PERF_COUNTER_BULK_COUNT:
|
||
nTypeString = IDS_TYPE_COUNTER_BULK_COUNT ;
|
||
break;
|
||
|
||
case PERF_COUNTER_TEXT:
|
||
nTypeString = IDS_TYPE_COUNTER_TEXT ;
|
||
break;
|
||
|
||
case PERF_COUNTER_RAWCOUNT:
|
||
nTypeString = IDS_TYPE_COUNTER_RAWCOUNT ;
|
||
break;
|
||
|
||
case PERF_COUNTER_LARGE_RAWCOUNT:
|
||
nTypeString = IDS_TYPE_COUNTER_LARGE_RAW ;
|
||
break;
|
||
|
||
case PERF_COUNTER_RAWCOUNT_HEX:
|
||
nTypeString = IDS_TYPE_COUNTER_RAW_HEX ;
|
||
break;
|
||
|
||
case PERF_COUNTER_LARGE_RAWCOUNT_HEX:
|
||
nTypeString = IDS_TYPE_COUNTER_LARGE_RAW_HEX ;
|
||
break;
|
||
|
||
case PERF_SAMPLE_FRACTION:
|
||
nTypeString = IDS_TYPE_SAMPLE_FRACTION ;
|
||
break;
|
||
|
||
case PERF_SAMPLE_COUNTER:
|
||
nTypeString = IDS_TYPE_SAMPLE_COUNTER ;
|
||
break;
|
||
|
||
case PERF_COUNTER_NODATA:
|
||
nTypeString = IDS_TYPE_COUNTER_NODATA ;
|
||
break;
|
||
|
||
case PERF_COUNTER_TIMER_INV:
|
||
nTypeString = IDS_TYPE_COUNTER_TIMER_INV ;
|
||
break;
|
||
|
||
case PERF_SAMPLE_BASE:
|
||
nTypeString = IDS_TYPE_SAMPLE_BASE ;
|
||
break;
|
||
|
||
case PERF_AVERAGE_TIMER:
|
||
nTypeString = IDS_TYPE_AVERAGE_TIMER ;
|
||
break;
|
||
|
||
case PERF_AVERAGE_BASE:
|
||
nTypeString = IDS_TYPE_AVERAGE_BASE ;
|
||
break;
|
||
|
||
case PERF_AVERAGE_BULK:
|
||
nTypeString = IDS_TYPE_AVERAGE_BULK ;
|
||
break;
|
||
|
||
case PERF_OBJ_TIME_TIMER:
|
||
nTypeString = IDS_TYPE_OBJ_TIME_TIMER ;
|
||
break;
|
||
|
||
case PERF_100NSEC_TIMER:
|
||
nTypeString = IDS_TYPE_100NS_TIMER ;
|
||
break;
|
||
|
||
case PERF_100NSEC_TIMER_INV:
|
||
nTypeString = IDS_TYPE_100NS_TIMER_INV ;
|
||
break;
|
||
|
||
case PERF_COUNTER_MULTI_TIMER:
|
||
nTypeString = IDS_TYPE_MULTI_TIMER ;
|
||
break;
|
||
|
||
case PERF_COUNTER_MULTI_TIMER_INV:
|
||
nTypeString = IDS_TYPE_MULTI_TIMER_INV ;
|
||
break;
|
||
|
||
case PERF_COUNTER_MULTI_BASE:
|
||
nTypeString = IDS_TYPE_MULTI_BASE ;
|
||
break;
|
||
|
||
case PERF_100NSEC_MULTI_TIMER:
|
||
nTypeString = IDS_TYPE_100NS_MULTI_TIMER ;
|
||
break;
|
||
|
||
case PERF_100NSEC_MULTI_TIMER_INV:
|
||
nTypeString = IDS_TYPE_100NS_MULTI_TIMER_INV ;
|
||
break;
|
||
|
||
case PERF_RAW_FRACTION:
|
||
nTypeString = IDS_TYPE_RAW_FRACTION ;
|
||
break;
|
||
|
||
case PERF_LARGE_RAW_FRACTION:
|
||
nTypeString = IDS_TYPE_LARGE_RAW_FRACTION ;
|
||
break;
|
||
|
||
case PERF_RAW_BASE:
|
||
nTypeString = IDS_TYPE_RAW_BASE ;
|
||
break;
|
||
|
||
case PERF_LARGE_RAW_BASE:
|
||
nTypeString = IDS_TYPE_LARGE_RAW_BASE ;
|
||
break;
|
||
|
||
case PERF_ELAPSED_TIME:
|
||
nTypeString = IDS_TYPE_ELAPSED_TIME ;
|
||
break;
|
||
|
||
case PERF_COUNTER_HISTOGRAM_TYPE:
|
||
nTypeString = IDS_TYPE_HISTOGRAM ;
|
||
break;
|
||
|
||
case PERF_COUNTER_DELTA:
|
||
nTypeString = IDS_TYPE_COUNTER_DELTA ;
|
||
break;
|
||
|
||
case PERF_COUNTER_LARGE_DELTA:
|
||
nTypeString = IDS_TYPE_COUNTER_LARGE_DELTA;
|
||
break;
|
||
|
||
case PERF_PRECISION_SYSTEM_TIMER:
|
||
nTypeString = IDS_TYPE_PRECISION_SYSTEM_TIMER;
|
||
break;
|
||
|
||
case PERF_PRECISION_100NS_TIMER:
|
||
nTypeString = IDS_TYPE_PRECISION_100NS_TIMER ;
|
||
break;
|
||
|
||
case PERF_PRECISION_OBJECT_TIMER:
|
||
nTypeString = IDS_TYPE_PRECISION_OBJECT_TIMER;
|
||
break;
|
||
|
||
default:
|
||
nTypeString = 0;
|
||
break;
|
||
}
|
||
|
||
if (nTypeString != 0) {
|
||
return GetStringResource (NULL, nTypeString);
|
||
} else {
|
||
return (LPCTSTR)TEXT("");
|
||
}
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
ShowCounterData (
|
||
IN HWND hDlg,
|
||
IN LONG lDisplayIndex
|
||
)
|
||
{
|
||
PPERF_OBJECT_TYPE pObject;
|
||
PPERF_COUNTER_DEFINITION pCounterDef;
|
||
PPERF_COUNTER_BLOCK pCounterBlock;
|
||
UINT nSelObject, nSelInstance;
|
||
TCHAR szTypeNameBuffer[MAX_PATH];
|
||
|
||
TCHAR szDisplayBuffer [SMALL_BUFFER_SIZE];
|
||
|
||
DWORD *pdwLoDword, *pdwHiDword;
|
||
|
||
DWORD dwThisCounter;
|
||
|
||
SendDlgItemMessage (hDlg, IDC_DATA_LIST, LB_RESETCONTENT, 0, 0);
|
||
|
||
nSelObject = (UINT)SendDlgItemMessage (hDlg, IDC_OBJECT, CB_GETCURSEL, 0, 0);
|
||
nSelInstance = (UINT)SendDlgItemMessage (hDlg, IDC_INSTANCE, CB_GETCURSEL, 0, 0);
|
||
|
||
if ((nSelObject != CB_ERR) && (nSelInstance != CB_ERR)) {
|
||
pObject = (PPERF_OBJECT_TYPE)SendDlgItemMessage (hDlg, IDC_OBJECT,
|
||
CB_GETITEMDATA, (WPARAM)nSelObject, 0);
|
||
|
||
pCounterBlock = (PPERF_COUNTER_BLOCK)SendDlgItemMessage (hDlg, IDC_INSTANCE,
|
||
CB_GETITEMDATA, (WPARAM)nSelInstance, 0);
|
||
|
||
pCounterDef = FirstCounter (pObject);
|
||
|
||
for (dwThisCounter = 0; dwThisCounter < pObject->NumCounters; dwThisCounter++) {
|
||
// get pointer to this counter's data (in this instance if applicable
|
||
pdwLoDword = (PDWORD)((LPBYTE)pCounterBlock + pCounterDef->CounterOffset);
|
||
pdwHiDword = pdwLoDword + 1;
|
||
|
||
lstrcpy (szTypeNameBuffer, GetCounterTypeName (pCounterDef->CounterType));
|
||
if (*szTypeNameBuffer == 0) {
|
||
// no string returned so format data as HEX DWORD
|
||
_stprintf (szTypeNameBuffer, (LPCTSTR)TEXT("Undefined Type: 0x%8.8x"),
|
||
pCounterDef->CounterType);
|
||
}
|
||
|
||
if (pCounterDef->CounterSize <= sizeof(DWORD)) {
|
||
_stprintf (szDisplayBuffer, (LPCTSTR)TEXT("%d\t%s\t%s\t0x%8.8x (%d)"),
|
||
pCounterDef->CounterNameTitleIndex,
|
||
(pCounterDef->CounterNameTitleIndex <= dwLastName ?
|
||
szNameTable[pCounterDef->CounterNameTitleIndex] : (LPCTSTR)TEXT("Name not loaded")),
|
||
szTypeNameBuffer,
|
||
*pdwLoDword, *pdwLoDword);
|
||
} else {
|
||
_stprintf (szDisplayBuffer, (LPCTSTR)TEXT("%d\t%s\t%s\t0x%8.8x%8.8x"),
|
||
pCounterDef->CounterNameTitleIndex,
|
||
(pCounterDef->CounterNameTitleIndex <= dwLastName ?
|
||
szNameTable[pCounterDef->CounterNameTitleIndex] : (LPCTSTR)TEXT("Name not loaded")),
|
||
szTypeNameBuffer,
|
||
*pdwHiDword, *pdwLoDword);
|
||
}
|
||
SendDlgItemMessage (hDlg, IDC_DATA_LIST, LB_INSERTSTRING,
|
||
(WPARAM)-1, (LPARAM)szDisplayBuffer);
|
||
pCounterDef = NextCounter(pCounterDef);
|
||
}
|
||
if (lDisplayIndex < 0) {
|
||
if (pObject->DefaultCounter >= 0) {
|
||
SendDlgItemMessage (hDlg, IDC_DATA_LIST, LB_SETCURSEL,
|
||
(WPARAM)pObject->DefaultCounter, 0);
|
||
} else {
|
||
SendDlgItemMessage (hDlg, IDC_DATA_LIST, LB_SETCURSEL,
|
||
(WPARAM)0, 0);
|
||
}
|
||
} else {
|
||
SendDlgItemMessage (hDlg, IDC_DATA_LIST, LB_SETCURSEL,
|
||
(WPARAM)lDisplayIndex, (LPARAM)0);
|
||
}
|
||
} else {
|
||
// no object and/or instsance selected so nothing else to do
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
OnComputerChange (
|
||
IN HWND hDlg
|
||
)
|
||
{
|
||
TCHAR szLocalComputerName [MAX_COMPUTERNAME_LENGTH+3];
|
||
HKEY hLocalMachineKey = NULL;
|
||
HKEY hLocalPerfKey = NULL;
|
||
LPWSTR *szLocalNameTable = NULL;
|
||
BOOL bResult = FALSE;
|
||
HWND hWndComputerName;
|
||
|
||
SET_WAIT_CURSOR;
|
||
|
||
// get name from edit control
|
||
hWndComputerName = GetDlgItem (hDlg, IDC_COMPUTERNAME);
|
||
|
||
GetWindowText (hWndComputerName,
|
||
szLocalComputerName,
|
||
MAX_COMPUTERNAME_LENGTH+2);
|
||
|
||
if (lstrcmpi(szComputerName, szLocalComputerName) != 0) {
|
||
// a new name has been entered so try to connect to it
|
||
if (lstrcmpi(szLocalComputerName, szThisComputerName) == 0) {
|
||
// then this is the local machine which is a special case
|
||
hLocalMachineKey = HKEY_LOCAL_MACHINE;
|
||
hLocalPerfKey = HKEY_PERFORMANCE_DATA;
|
||
szLocalComputerName[0] = 0;
|
||
} else {
|
||
// try to connect to remote computer
|
||
if (RegConnectRegistry (szLocalComputerName,
|
||
HKEY_LOCAL_MACHINE, &hLocalMachineKey) == ERROR_SUCCESS) {
|
||
// connected to the new machine, so Try to connect to
|
||
// the performance data, too
|
||
if (RegConnectRegistry (szLocalComputerName,
|
||
HKEY_PERFORMANCE_DATA, &hLocalPerfKey) == ERROR_SUCCESS) {
|
||
} else {
|
||
DisplayMessageBox (hDlg,
|
||
IDS_UNABLE_CONNECT_PERF,
|
||
IDS_APP_ERROR, MB_OK);
|
||
}
|
||
} else {
|
||
DisplayMessageBox (hDlg,
|
||
IDS_UNABLE_CONNECT_MACH,
|
||
IDS_APP_ERROR, MB_OK);
|
||
}
|
||
}
|
||
if ((hLocalMachineKey != NULL) && (hLocalPerfKey != NULL)) {
|
||
// try to get a new name table
|
||
szLocalNameTable = BuildNameTable (
|
||
(szLocalComputerName == 0 ? NULL : szLocalComputerName),
|
||
NULL,
|
||
&dwLastName);
|
||
|
||
if (szLocalNameTable) {
|
||
bResult = TRUE;
|
||
} else {
|
||
DisplayMessageBox (hDlg,
|
||
IDS_UNABLE_GET_NAMES,
|
||
IDS_APP_ERROR, MB_OK);
|
||
}
|
||
}
|
||
|
||
if (bResult) {
|
||
// made it so close the old connections
|
||
|
||
if (hKeyMachine != NULL) {
|
||
RegCloseKey (hKeyMachine);
|
||
}
|
||
hKeyMachine = hLocalMachineKey;
|
||
|
||
if (hKeyPerformance != NULL) {
|
||
RegCloseKey (hKeyPerformance);
|
||
}
|
||
hKeyPerformance = hLocalPerfKey;
|
||
|
||
if (szNameTable != NULL) {
|
||
MemoryFree (szNameTable);
|
||
}
|
||
szNameTable = szLocalNameTable;
|
||
|
||
if (szLocalComputerName[0] == 0) {
|
||
lstrcpy (szComputerName, szThisComputerName);
|
||
}
|
||
|
||
// then update the fields
|
||
bResult = LoadObjectList (hDlg, NULL);
|
||
if (bResult) {
|
||
LoadInstanceList (hDlg, NULL);
|
||
ShowCounterData (hDlg, -1);
|
||
}
|
||
} else {
|
||
// unable to get info from machine so clean up
|
||
if (hLocalPerfKey != NULL) RegCloseKey (hLocalPerfKey);
|
||
if (hLocalMachineKey != NULL) RegCloseKey (hLocalMachineKey);
|
||
if (szLocalNameTable != NULL) MemoryFree (szLocalNameTable);
|
||
// reset computer name to the one that works.
|
||
SetWindowText (hWndComputerName, szComputerName);
|
||
}
|
||
} else {
|
||
// the name hasn't changed
|
||
}
|
||
|
||
return TRUE;
|
||
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
MainDlg_WM_INITDIALOG (
|
||
IN HWND hDlg,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
{
|
||
DWORD dwComputerNameLength = MAX_COMPUTERNAME_LENGTH+1;
|
||
|
||
UNREFERENCED_PARAMETER (lParam);
|
||
UNREFERENCED_PARAMETER (wParam);
|
||
|
||
SET_WAIT_CURSOR;
|
||
|
||
lstrcpy (szThisComputerName, (LPCTSTR)TEXT("\\\\"));
|
||
GetComputerName (szThisComputerName+2, &dwComputerNameLength);
|
||
|
||
szComputerName[0] = 0; // reset the computer name
|
||
// load the local machine name into the edit box
|
||
SetWindowText (GetDlgItem (hDlg, IDC_COMPUTERNAME), szThisComputerName);
|
||
|
||
SendDlgItemMessage (hDlg, IDC_DATA_LIST, LB_SETTABSTOPS,
|
||
(WPARAM)NUM_TAB_STOPS, (LPARAM)&nDataListTabs);
|
||
CheckDlgButton (hDlg, IDC_INCLUDE_COSTLY, UNCHECKED);
|
||
|
||
OnComputerChange (hDlg);
|
||
|
||
SetFocus (GetDlgItem (hDlg, IDC_OBJECT));
|
||
|
||
SET_ARROW_CURSOR;
|
||
return FALSE;
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
MainDlg_IDC_COMPUTERNAME (
|
||
IN HWND hDlg,
|
||
IN WORD wNotifyMsg,
|
||
IN HWND hWndControl
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER (hWndControl);
|
||
|
||
switch (wNotifyMsg) {
|
||
case EN_KILLFOCUS:
|
||
OnComputerChange(hDlg);
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
MainDlg_IDC_OBJECT (
|
||
IN HWND hDlg,
|
||
IN WORD wNotifyMsg,
|
||
IN HWND hWndControl
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER (hWndControl);
|
||
|
||
switch (wNotifyMsg) {
|
||
case CBN_SELCHANGE:
|
||
SET_WAIT_CURSOR;
|
||
if (pMainPerfData) {
|
||
LoadInstanceList (hDlg, NULL);
|
||
ShowCounterData (hDlg, -1);
|
||
}
|
||
SET_ARROW_CURSOR;
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
MainDlg_IDC_INSTANCE (
|
||
IN HWND hDlg,
|
||
IN WORD wNotifyMsg,
|
||
IN HWND hWndControl
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER (hWndControl);
|
||
|
||
switch (wNotifyMsg) {
|
||
case CBN_SELCHANGE:
|
||
SET_WAIT_CURSOR;
|
||
ShowCounterData (hDlg, -1);
|
||
SET_ARROW_CURSOR;
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
MainDlg_IDC_DATA_LIST (
|
||
IN HWND hDlg,
|
||
IN WORD wNotifyMsg,
|
||
IN HWND hWndControl
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER (hWndControl);
|
||
UNREFERENCED_PARAMETER (hDlg);
|
||
|
||
switch (wNotifyMsg) {
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
MainDlg_IDC_REFRESH (
|
||
IN HWND hDlg,
|
||
IN WORD wNotifyMsg,
|
||
IN HWND hWndControl
|
||
)
|
||
{
|
||
TCHAR szSelObject[MAX_PATH];
|
||
TCHAR szSelInstance[MAX_PATH];
|
||
BOOL bResult;
|
||
LONG lCounterIdx;
|
||
|
||
UNREFERENCED_PARAMETER (hWndControl);
|
||
|
||
switch (wNotifyMsg) {
|
||
case BN_CLICKED:
|
||
SET_WAIT_CURSOR;
|
||
GetDlgItemText (hDlg, IDC_OBJECT,
|
||
szSelObject, MAX_PATH-1);
|
||
|
||
GetDlgItemText (hDlg, IDC_INSTANCE,
|
||
szSelInstance, MAX_PATH-1);
|
||
|
||
lCounterIdx = (ULONG)SendDlgItemMessage (hDlg, IDC_DATA_LIST,
|
||
LB_GETCURSEL, 0, 0);
|
||
|
||
bResult = LoadObjectList (hDlg, szSelObject);
|
||
if (bResult) {
|
||
LoadInstanceList (hDlg, szSelInstance);
|
||
ShowCounterData (hDlg, lCounterIdx);
|
||
}
|
||
SET_ARROW_CURSOR;
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
MainDlg_IDC_ABOUT ()
|
||
{
|
||
TCHAR buffer[1024];
|
||
TCHAR strProgram[1024];
|
||
DWORD dw;
|
||
BYTE* pVersionInfo;
|
||
LPTSTR pVersion = NULL;
|
||
LPTSTR pProduct = NULL;
|
||
LPTSTR pCopyRight = NULL;
|
||
|
||
dw = GetModuleFileName(NULL, strProgram, 1024 );
|
||
|
||
if( dw>0 ){
|
||
|
||
dw = GetFileVersionInfoSize( strProgram, &dw );
|
||
if( dw > 0 ){
|
||
|
||
pVersionInfo = (BYTE*)malloc(dw);
|
||
if( NULL != pVersionInfo ){
|
||
if(GetFileVersionInfo( strProgram, 0, dw, pVersionInfo )){
|
||
LPDWORD lptr = NULL;
|
||
VerQueryValue( pVersionInfo, _T("\\VarFileInfo\\Translation"), (void**)&lptr, (UINT*)&dw );
|
||
if( lptr != NULL ){
|
||
_stprintf( buffer, _T("\\StringFileInfo\\%04x%04x\\%s"), LOWORD(*lptr), HIWORD(*lptr), _T("ProductVersion") );
|
||
VerQueryValue( pVersionInfo, buffer, (void**)&pVersion, (UINT*)&dw );
|
||
_stprintf( buffer, _T("\\StringFileInfo\\%04x%04x\\%s"), LOWORD(*lptr), HIWORD(*lptr), _T("OriginalFilename") );
|
||
VerQueryValue( pVersionInfo, buffer, (void**)&pProduct, (UINT*)&dw );
|
||
_stprintf( buffer, _T("\\StringFileInfo\\%04x%04x\\%s"), LOWORD(*lptr), HIWORD(*lptr), _T("LegalCopyright") );
|
||
VerQueryValue( pVersionInfo, buffer, (void**)&pCopyRight, (UINT*)&dw );
|
||
}
|
||
|
||
if( pProduct != NULL && pVersion != NULL && pCopyRight != NULL ){
|
||
_stprintf( buffer, _T("\nMicrosoft (R) %s\nVersion: %s\n%s"), pProduct, pVersion, pCopyRight );
|
||
}
|
||
}
|
||
free( pVersionInfo );
|
||
}
|
||
}
|
||
}
|
||
|
||
MessageBox( NULL, buffer, _T("About ShowPerf"), MB_OK );
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
MainDlg_WM_COMMAND (
|
||
IN HWND hDlg,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
{
|
||
WORD wCtrlId, wNotifyMsg;
|
||
HWND hWndControl;
|
||
|
||
wCtrlId = GET_CONTROL_ID (wParam);
|
||
wNotifyMsg = GET_NOTIFY_MSG (wParam, lParam);
|
||
hWndControl = GET_COMMAND_WND (lParam);
|
||
|
||
switch (wCtrlId) {
|
||
case IDC_COMPUTERNAME:
|
||
return MainDlg_IDC_COMPUTERNAME (hDlg, wNotifyMsg, hWndControl);
|
||
|
||
case IDC_OBJECT:
|
||
return MainDlg_IDC_OBJECT (hDlg, wNotifyMsg, hWndControl);
|
||
|
||
case IDC_INSTANCE:
|
||
return MainDlg_IDC_INSTANCE (hDlg, wNotifyMsg, hWndControl);
|
||
|
||
case IDC_DATA_LIST:
|
||
return MainDlg_IDC_DATA_LIST (hDlg, wNotifyMsg, hWndControl);
|
||
|
||
case IDC_REFRESH:
|
||
return MainDlg_IDC_REFRESH (hDlg, wNotifyMsg, hWndControl);
|
||
|
||
case IDC_ABOUT:
|
||
return MainDlg_IDC_ABOUT ();
|
||
|
||
case IDOK:
|
||
EndDialog (hDlg, IDOK);
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
MainDlg_WM_SYSCOMMAND (
|
||
IN HWND hDlg,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER (lParam);
|
||
|
||
switch (wParam) {
|
||
case SC_CLOSE:
|
||
EndDialog (hDlg, IDOK);
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
MainDlg_WM_CLOSE (
|
||
IN HWND hDlg,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER (lParam);
|
||
UNREFERENCED_PARAMETER (wParam);
|
||
UNREFERENCED_PARAMETER (hDlg);
|
||
|
||
MemoryFree (pMainPerfData);
|
||
pMainPerfData = NULL;
|
||
|
||
MemoryFree (szNameTable);
|
||
szNameTable = NULL;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
INT_PTR
|
||
MainDlgProc (
|
||
IN HWND hDlg,
|
||
IN UINT message,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
{
|
||
switch (message) {
|
||
case WM_INITDIALOG:
|
||
return MainDlg_WM_INITDIALOG (hDlg, wParam, lParam);
|
||
|
||
case WM_COMMAND:
|
||
return MainDlg_WM_COMMAND (hDlg, wParam, lParam);
|
||
|
||
case WM_SYSCOMMAND:
|
||
return MainDlg_WM_SYSCOMMAND (hDlg, wParam, lParam);
|
||
|
||
case WM_CLOSE:
|
||
return MainDlg_WM_CLOSE (hDlg, wParam, lParam);
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|