You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
911 lines
30 KiB
911 lines
30 KiB
/*++
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
maindlg.c
|
|
|
|
Abstract:
|
|
Main Dialog procedure for ShowPerf app
|
|
|
|
Author:
|
|
Bob Watson (a-robw)
|
|
|
|
Revision History:
|
|
23 Nov 94
|
|
--*/
|
|
#include <windows.h>
|
|
#include <winperf.h>
|
|
#include <strsafe.h>
|
|
#include "showperf.h"
|
|
#include "perfdata.h"
|
|
#include "resource.h"
|
|
|
|
PPERF_DATA_BLOCK pMainPerfData = NULL; // pointer to perfdata block
|
|
LPWSTR * szNameTable = NULL; // pointer to perf name table
|
|
DWORD dwLastName = 0;
|
|
WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 3];
|
|
WCHAR szThisComputerName[MAX_COMPUTERNAME_LENGTH + 3];
|
|
HKEY hKeyMachine = NULL;
|
|
HKEY hKeyPerformance = NULL;
|
|
|
|
#define NUM_TAB_STOPS 3
|
|
INT nDataListTabs[NUM_TAB_STOPS] = { 26, 160, 235 };
|
|
|
|
LPCWSTR cszEmptyString = L"";
|
|
|
|
BOOL
|
|
LoadObjectList(
|
|
HWND hDlg,
|
|
LPCWSTR szMatchItem
|
|
)
|
|
{
|
|
PPERF_OBJECT_TYPE pObject;
|
|
HWND hWndObjectCB;
|
|
UINT nInitial = 0;
|
|
UINT nIndex;
|
|
WCHAR szNameBuffer[MAX_PATH];
|
|
DWORD dwThisObject = 0;
|
|
DWORD dwCounterType;
|
|
BOOL bReturn = TRUE;
|
|
HRESULT hError;
|
|
|
|
hWndObjectCB = GetDlgItem(hDlg, IDC_OBJECT);
|
|
dwCounterType = (IsDlgButtonChecked(hDlg, IDC_INCLUDE_COSTLY) == CHECKED) ? (1) : (0);
|
|
|
|
// get current data block
|
|
if (GetSystemPerfData(hKeyPerformance, & pMainPerfData, dwCounterType) == ERROR_SUCCESS) {
|
|
// data acquired so clear combo and display
|
|
SendMessageW(hWndObjectCB, CB_RESETCONTENT, 0, 0);
|
|
__try {
|
|
pObject = FirstObject(pMainPerfData);
|
|
for (dwThisObject = 0; dwThisObject < pMainPerfData->NumObjectTypes; dwThisObject ++) {
|
|
// get counter object name here...
|
|
hError = StringCchPrintfW(szNameBuffer, RTL_NUMBER_OF(szNameBuffer), L"(%d) %ws",
|
|
pObject->ObjectNameTitleIndex,
|
|
pObject->ObjectNameTitleIndex <= dwLastName ?
|
|
szNameTable[pObject->ObjectNameTitleIndex] : L"Name not loaded");
|
|
if (SUCCEEDED(hError)) {
|
|
nIndex = (UINT) SendMessageW(hWndObjectCB, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) szNameBuffer);
|
|
if (nIndex != CB_ERR) {
|
|
// save object pointer
|
|
SendMessageW(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) {
|
|
hError = StringCchPrintfW(szNameBuffer, RTL_NUMBER_OF(szNameBuffer),
|
|
L"An exception (0x%8.8x) occured in object block # %d returned by the system.",
|
|
GetExceptionCode (), dwThisObject + 1);
|
|
if (SUCCEEDED(hError)) {
|
|
MessageBoxW(hDlg, szNameBuffer, L"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) {
|
|
SendMessageW(hWndObjectCB, CB_SETCURSEL, (WPARAM) nInitial, 0);
|
|
}
|
|
else {
|
|
// match to arg string as best as possible
|
|
if (SendMessageW(hWndObjectCB, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) szMatchItem) == CB_ERR) {
|
|
// no match found so use default
|
|
SendMessageW(hWndObjectCB, CB_SETCURSEL, (WPARAM) nInitial, 0);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
DisplayMessageBox(hDlg, IDS_UNABLE_GET_DATA, IDS_APP_ERROR, MB_OK);
|
|
bReturn = FALSE;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
BOOL
|
|
LoadInstanceList(
|
|
HWND hDlg,
|
|
LPCWSTR 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;
|
|
WCHAR szNameBuffer[SMALL_BUFFER_SIZE];
|
|
WCHAR szParentName[SMALL_BUFFER_SIZE];
|
|
UINT nIndex;
|
|
HRESULT hError;
|
|
|
|
nCbSel = (UINT) SendDlgItemMessageW(hDlg, IDC_OBJECT, CB_GETCURSEL, 0, 0);
|
|
if (nCbSel != CB_ERR) {
|
|
pObject = (PPERF_OBJECT_TYPE) SendDlgItemMessageW(hDlg, IDC_OBJECT, CB_GETITEMDATA, (WPARAM) nCbSel, 0);
|
|
if (pObject->NumInstances == PERF_NO_INSTANCES) {
|
|
// no instances so...
|
|
// clear old contents
|
|
SendDlgItemMessageW(hDlg, IDC_INSTANCE, CB_RESETCONTENT, 0, 0);
|
|
// add display text
|
|
SendDlgItemMessageW(hDlg, IDC_INSTANCE, CB_INSERTSTRING, (WPARAM)-1, (LPARAM) L"<No Instances>");
|
|
// select this (and only) string
|
|
SendDlgItemMessageW(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
|
|
SendDlgItemMessageW(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);
|
|
SendDlgItemMessageW(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
|
|
hError = StringCchPrintfW(szParentName, RTL_NUMBER_OF(szParentName), L"%ws==>",
|
|
(LPWSTR) ((LPBYTE) pParentInstance+pParentInstance->NameOffset));
|
|
}
|
|
else {
|
|
// use the instance number
|
|
hError = StringCchPrintfW(szParentName, RTL_NUMBER_OF(szParentName), L"[%d]==>",
|
|
pParentInstance->UniqueID);
|
|
}
|
|
}
|
|
else {
|
|
// unknown parent
|
|
* szParentName = L'\0';
|
|
}
|
|
ZeroMemory(szNameBuffer, sizeof(szNameBuffer));
|
|
if (pInstance->UniqueID < 0) {
|
|
// use the instance name
|
|
hError = StringCchCopyW(szNameBuffer,
|
|
RTL_NUMBER_OF(szNameBuffer),
|
|
(LPWSTR) ((LPBYTE)pInstance+pInstance->NameOffset));
|
|
}
|
|
else {
|
|
// use the instance number
|
|
hError = StringCchPrintfW(szNameBuffer, RTL_NUMBER_OF(szNameBuffer), L"(%d)", pInstance->UniqueID);
|
|
}
|
|
hError = StringCchCatW(szParentName, RTL_NUMBER_OF(szNameBuffer), szNameBuffer);
|
|
nIndex = (UINT) SendDlgItemMessageW(
|
|
hDlg, IDC_INSTANCE, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) szParentName);
|
|
if (nIndex != CB_ERR) {
|
|
// save pointer to counter block
|
|
pCounterBlock = (PPERF_COUNTER_BLOCK) ((LPBYTE) pInstance + pInstance->ByteLength);
|
|
SendDlgItemMessageW(hDlg, IDC_INSTANCE, CB_SETITEMDATA, (WPARAM) nIndex, (LPARAM) pCounterBlock);
|
|
}
|
|
pInstance = NextInstance(pInstance);
|
|
}
|
|
if (szMatchItem == NULL) {
|
|
SendDlgItemMessageW(hDlg, IDC_INSTANCE, CB_SETCURSEL, 0, 0);
|
|
}
|
|
else {
|
|
if (SendDlgItemMessageW(hDlg, IDC_INSTANCE, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) szMatchItem)
|
|
== CB_ERR) {
|
|
SendDlgItemMessageW(hDlg, IDC_INSTANCE, CB_SETCURSEL, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// no object selected
|
|
// clear old contents
|
|
SendDlgItemMessageW(hDlg, IDC_INSTANCE, CB_RESETCONTENT, 0, 0);
|
|
// add display text
|
|
SendDlgItemMessageW(hDlg, IDC_INSTANCE, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) L"<No object selected>");
|
|
// select this (and only) string
|
|
SendDlgItemMessageW(hDlg, IDC_INSTANCE, CB_SETCURSEL, 0, 0);
|
|
// and save null pointer as item data
|
|
SendDlgItemMessageW(hDlg, IDC_INSTANCE, CB_SETITEMDATA, 0, (LPARAM) 0);
|
|
// finally grey the window to prevent selections
|
|
EnableWindow(GetDlgItem(hDlg, IDC_INSTANCE), FALSE);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
LPCWSTR
|
|
GetCounterTypeName(
|
|
DWORD dwCounterType
|
|
)
|
|
{
|
|
UINT nTypeString = 0;
|
|
LPCWSTR szReturn = NULL;
|
|
|
|
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) {
|
|
szReturn = GetStringResource(NULL, nTypeString);
|
|
}
|
|
if (szReturn == NULL) {
|
|
szReturn = cszEmptyString;
|
|
}
|
|
return szReturn;
|
|
}
|
|
|
|
BOOL
|
|
ShowCounterData(
|
|
HWND hDlg,
|
|
LONG lDisplayIndex
|
|
)
|
|
{
|
|
PPERF_OBJECT_TYPE pObject;
|
|
PPERF_COUNTER_DEFINITION pCounterDef;
|
|
PPERF_COUNTER_BLOCK pCounterBlock;
|
|
UINT nSelObject, nSelInstance;
|
|
WCHAR szTypeNameBuffer[MAX_PATH];
|
|
WCHAR szDisplayBuffer[SMALL_BUFFER_SIZE];
|
|
DWORD * pdwLoDword, * pdwHiDword;
|
|
DWORD dwThisCounter;
|
|
HRESULT hError;
|
|
|
|
SendDlgItemMessageW(hDlg, IDC_DATA_LIST, LB_RESETCONTENT, 0, 0);
|
|
nSelObject = (UINT) SendDlgItemMessageW(hDlg, IDC_OBJECT, CB_GETCURSEL, 0, 0);
|
|
nSelInstance = (UINT) SendDlgItemMessageW(hDlg, IDC_INSTANCE, CB_GETCURSEL, 0, 0);
|
|
if ((nSelObject != CB_ERR) && (nSelInstance != CB_ERR)) {
|
|
pObject = (PPERF_OBJECT_TYPE)
|
|
SendDlgItemMessageW(hDlg, IDC_OBJECT, CB_GETITEMDATA, (WPARAM) nSelObject, 0);
|
|
pCounterBlock = (PPERF_COUNTER_BLOCK)
|
|
SendDlgItemMessageW(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;
|
|
|
|
hError = StringCchCopyW(szTypeNameBuffer,
|
|
RTL_NUMBER_OF(szTypeNameBuffer),
|
|
GetCounterTypeName(pCounterDef->CounterType));
|
|
if (* szTypeNameBuffer == L'\0') {
|
|
// no string returned so format data as HEX DWORD
|
|
hError = StringCchPrintfW(szTypeNameBuffer, RTL_NUMBER_OF(szTypeNameBuffer), L"Undefined Type: 0x%8.8x",
|
|
pCounterDef->CounterType);
|
|
}
|
|
if (pCounterDef->CounterSize <= sizeof(DWORD)) {
|
|
hError = StringCchPrintfW(szDisplayBuffer, RTL_NUMBER_OF(szDisplayBuffer),
|
|
L"%d\t%ws\t%ws\t0x%8.8x (%d)",
|
|
pCounterDef->CounterNameTitleIndex,
|
|
pCounterDef->CounterNameTitleIndex <= dwLastName ?
|
|
szNameTable[pCounterDef->CounterNameTitleIndex] : L"Name not loaded",
|
|
szTypeNameBuffer,
|
|
* pdwLoDword, * pdwLoDword);
|
|
}
|
|
else {
|
|
hError = StringCchPrintfW(szDisplayBuffer, RTL_NUMBER_OF(szDisplayBuffer),
|
|
L"%d\t%ws\t%ws\t0x%8.8x%8.8x",
|
|
pCounterDef->CounterNameTitleIndex,
|
|
pCounterDef->CounterNameTitleIndex <= dwLastName ?
|
|
szNameTable[pCounterDef->CounterNameTitleIndex] : L"Name not loaded",
|
|
szTypeNameBuffer,
|
|
* pdwHiDword, * pdwLoDword);
|
|
}
|
|
SendDlgItemMessageW(hDlg, IDC_DATA_LIST, LB_INSERTSTRING, (WPARAM) -1, (LPARAM) szDisplayBuffer);
|
|
pCounterDef = NextCounter(pCounterDef);
|
|
}
|
|
if (lDisplayIndex < 0) {
|
|
if (pObject->DefaultCounter >= 0) {
|
|
SendDlgItemMessageW(hDlg, IDC_DATA_LIST, LB_SETCURSEL, (WPARAM) pObject->DefaultCounter, 0);
|
|
}
|
|
else {
|
|
SendDlgItemMessageW(hDlg, IDC_DATA_LIST, LB_SETCURSEL, (WPARAM) 0, 0);
|
|
}
|
|
}
|
|
else {
|
|
SendDlgItemMessageW(hDlg, IDC_DATA_LIST, LB_SETCURSEL, (WPARAM) lDisplayIndex, (LPARAM) 0);
|
|
}
|
|
}
|
|
else {
|
|
// no object and/or instsance selected so nothing else to do
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
OnComputerChange(
|
|
HWND hDlg
|
|
)
|
|
{
|
|
WCHAR szLocalComputerName[MAX_COMPUTERNAME_LENGTH + 3];
|
|
HKEY hLocalMachineKey = NULL;
|
|
HKEY hLocalPerfKey = NULL;
|
|
LPWSTR *szLocalNameTable = NULL;
|
|
BOOL bResult = FALSE;
|
|
HWND hWndComputerName;
|
|
HRESULT hError;
|
|
|
|
SET_WAIT_CURSOR;
|
|
|
|
// get name from edit control
|
|
hWndComputerName = GetDlgItem(hDlg, IDC_COMPUTERNAME);
|
|
|
|
GetWindowTextW(hWndComputerName, szLocalComputerName, MAX_COMPUTERNAME_LENGTH + 2);
|
|
if (lstrcmpiW(szComputerName, szLocalComputerName) != 0) {
|
|
// a new name has been entered so try to connect to it
|
|
if (lstrcmpiW(szLocalComputerName, szThisComputerName) == 0) {
|
|
// then this is the local machine which is a special case
|
|
hLocalMachineKey = HKEY_LOCAL_MACHINE;
|
|
hLocalPerfKey = HKEY_PERFORMANCE_DATA;
|
|
szLocalComputerName[0] = L'\0';
|
|
}
|
|
else {
|
|
// try to connect to remote computer
|
|
if (RegConnectRegistryW(szLocalComputerName, HKEY_LOCAL_MACHINE, & hLocalMachineKey)
|
|
== ERROR_SUCCESS) {
|
|
// connected to the new machine, so Try to connect to
|
|
// the performance data, too
|
|
if (RegConnectRegistryW(szLocalComputerName, HKEY_PERFORMANCE_DATA, & hLocalPerfKey)
|
|
!= ERROR_SUCCESS) {
|
|
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 == NULL ? NULL : szLocalComputerName), NULL, & dwLastName);
|
|
if (szLocalNameTable != NULL) {
|
|
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 && hKeyMachine != HKEY_LOCAL_MACHINE) {
|
|
RegCloseKey(hKeyMachine);
|
|
}
|
|
hKeyMachine = hLocalMachineKey;
|
|
|
|
if (hKeyPerformance != NULL && hKeyPerformance != HKEY_PERFORMANCE_DATA) {
|
|
RegCloseKey(hKeyPerformance);
|
|
}
|
|
hKeyPerformance = hLocalPerfKey;
|
|
|
|
MemoryFree(szNameTable);
|
|
szNameTable = szLocalNameTable;
|
|
|
|
if (szLocalComputerName[0] == L'\0') {
|
|
hError = StringCchCopyW(szComputerName, MAX_COMPUTERNAME_LENGTH + 3, 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 && hLocalPerfKey != HKEY_PERFORMANCE_DATA) RegCloseKey(hLocalPerfKey);
|
|
if (hLocalMachineKey != NULL && hLocalMachineKey != HKEY_LOCAL_MACHINE) RegCloseKey(hLocalMachineKey);
|
|
MemoryFree(szLocalNameTable);
|
|
// reset computer name to the one that works.
|
|
SetWindowTextW(hWndComputerName, szComputerName);
|
|
}
|
|
}
|
|
else {
|
|
// the name hasn't changed
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
MainDlg_WM_INITDIALOG(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
DWORD dwComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1;
|
|
HRESULT hError;
|
|
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
UNREFERENCED_PARAMETER(wParam);
|
|
|
|
SET_WAIT_CURSOR;
|
|
|
|
hError = StringCchCopyW(szThisComputerName, MAX_COMPUTERNAME_LENGTH + 3, L"\\\\");
|
|
GetComputerNameW(szThisComputerName + 2, & dwComputerNameLength);
|
|
szComputerName[0] = L'\0'; // reset the computer name
|
|
// load the local machine name into the edit box
|
|
SetWindowTextW(GetDlgItem(hDlg, IDC_COMPUTERNAME), szThisComputerName);
|
|
|
|
SendDlgItemMessageW(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;
|
|
}
|
|
|
|
BOOL
|
|
MainDlg_IDC_COMPUTERNAME(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
|
|
switch (wNotifyMsg) {
|
|
case EN_KILLFOCUS:
|
|
OnComputerChange(hDlg);
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
bReturn = FALSE;
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
BOOL
|
|
MainDlg_IDC_OBJECT(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
|
|
switch (wNotifyMsg) {
|
|
case CBN_SELCHANGE:
|
|
SET_WAIT_CURSOR;
|
|
if (pMainPerfData) {
|
|
LoadInstanceList(hDlg, NULL);
|
|
ShowCounterData(hDlg, -1);
|
|
}
|
|
SET_ARROW_CURSOR;
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
bReturn = FALSE;
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
BOOL
|
|
MainDlg_IDC_INSTANCE(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
|
|
switch (wNotifyMsg) {
|
|
case CBN_SELCHANGE:
|
|
SET_WAIT_CURSOR;
|
|
ShowCounterData(hDlg, -1);
|
|
SET_ARROW_CURSOR;
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
bReturn = FALSE;
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
BOOL
|
|
MainDlg_IDC_DATA_LIST(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(hDlg);
|
|
UNREFERENCED_PARAMETER(wNotifyMsg);
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
return (FALSE);
|
|
}
|
|
|
|
BOOL
|
|
MainDlg_IDC_REFRESH(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
{
|
|
WCHAR szSelObject[MAX_PATH + 1];
|
|
WCHAR szSelInstance[MAX_PATH + 1];
|
|
BOOL bResult;
|
|
LONG lCounterIdx;
|
|
BOOL bReturn = FALSE;
|
|
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
|
|
switch (wNotifyMsg) {
|
|
case BN_CLICKED:
|
|
SET_WAIT_CURSOR;
|
|
GetDlgItemTextW(hDlg, IDC_OBJECT, szSelObject, RTL_NUMBER_OF(szSelObject));
|
|
GetDlgItemTextW(hDlg, IDC_INSTANCE, szSelInstance, RTL_NUMBER_OF(szSelInstance));
|
|
lCounterIdx = (ULONG) SendDlgItemMessageW(hDlg, IDC_DATA_LIST, LB_GETCURSEL, 0, 0);
|
|
|
|
bResult = LoadObjectList(hDlg, szSelObject);
|
|
if (bResult) {
|
|
LoadInstanceList(hDlg, szSelInstance);
|
|
ShowCounterData(hDlg, lCounterIdx);
|
|
}
|
|
SET_ARROW_CURSOR;
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
bReturn = FALSE;
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
BOOL
|
|
MainDlg_IDC_ABOUT()
|
|
{
|
|
WCHAR buffer[SMALL_BUFFER_SIZE];
|
|
WCHAR strProgram[SMALL_BUFFER_SIZE];
|
|
DWORD dw;
|
|
LPBYTE pVersionInfo = NULL;
|
|
LPWSTR pVersion = NULL;
|
|
LPWSTR pProduct = NULL;
|
|
LPWSTR pCopyRight = NULL;
|
|
HRESULT hError;
|
|
|
|
ZeroMemory(buffer, sizeof(buffer));
|
|
ZeroMemory(strProgram, sizeof(strProgram));
|
|
dw = GetModuleFileNameW(NULL, strProgram, RTL_NUMBER_OF(strProgram) - 1);
|
|
if(dw > 0) {
|
|
dw = GetFileVersionInfoSizeW(strProgram, & dw);
|
|
if (dw > 0) {
|
|
pVersionInfo = (LPBYTE) MemoryAllocate(dw);
|
|
if(NULL != pVersionInfo) {
|
|
if (GetFileVersionInfoW(strProgram, 0, dw, pVersionInfo)) {
|
|
LPDWORD lptr = NULL;
|
|
VerQueryValueW(pVersionInfo, L"\\VarFileInfo\\Translation", (void **) & lptr, (UINT *) & dw);
|
|
if (lptr != NULL) {
|
|
hError = StringCchPrintfW(buffer, RTL_NUMBER_OF(buffer),
|
|
L"\\StringFileInfo\\%04x%04x\\ProductVersion",
|
|
LOWORD(* lptr), HIWORD(* lptr));
|
|
VerQueryValueW(pVersionInfo, buffer, (void **) & pVersion, (UINT *) & dw);
|
|
|
|
hError = StringCchPrintfW(buffer, RTL_NUMBER_OF(buffer),
|
|
L"\\StringFileInfo\\%04x%04x\\OriginalFilename",
|
|
LOWORD(* lptr), HIWORD(* lptr));
|
|
VerQueryValueW(pVersionInfo, buffer, (void **) & pProduct, (UINT *) & dw);
|
|
|
|
hError = StringCchPrintfW(buffer, RTL_NUMBER_OF(buffer),
|
|
L"\\StringFileInfo\\%04x%04x\\LegalCopyright",
|
|
LOWORD(* lptr), HIWORD(* lptr));
|
|
VerQueryValueW(pVersionInfo, buffer, (void **) & pCopyRight, (UINT *) & dw);
|
|
}
|
|
|
|
if(pProduct != NULL && pVersion != NULL && pCopyRight != NULL) {
|
|
hError = StringCchPrintfW(buffer, RTL_NUMBER_OF(buffer),
|
|
L"\nMicrosoft (R) %ws\nVersion: %ws\n%ws",
|
|
pProduct, pVersion, pCopyRight);
|
|
}
|
|
}
|
|
MemoryFree(pVersionInfo);
|
|
}
|
|
}
|
|
}
|
|
MessageBoxW(NULL, buffer, L"About ShowPerf", MB_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
MainDlg_WM_COMMAND(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
WORD wCtrlId = GET_CONTROL_ID(wParam);
|
|
WORD wNotifyMsg = GET_NOTIFY_MSG(wParam, lParam);
|
|
HWND hWndControl = GET_COMMAND_WND(lParam);
|
|
BOOL bReturn = FALSE;
|
|
|
|
|
|
switch (wCtrlId) {
|
|
case IDC_COMPUTERNAME:
|
|
bReturn = MainDlg_IDC_COMPUTERNAME(hDlg, wNotifyMsg, hWndControl);
|
|
break;
|
|
|
|
case IDC_OBJECT:
|
|
bReturn = MainDlg_IDC_OBJECT(hDlg, wNotifyMsg, hWndControl);
|
|
break;
|
|
|
|
case IDC_INSTANCE:
|
|
bReturn = MainDlg_IDC_INSTANCE(hDlg, wNotifyMsg, hWndControl);
|
|
break;
|
|
|
|
case IDC_DATA_LIST:
|
|
bReturn = MainDlg_IDC_DATA_LIST(hDlg, wNotifyMsg, hWndControl);
|
|
break;
|
|
|
|
case IDC_REFRESH:
|
|
bReturn = MainDlg_IDC_REFRESH(hDlg, wNotifyMsg, hWndControl);
|
|
break;
|
|
|
|
case IDC_ABOUT:
|
|
bReturn = MainDlg_IDC_ABOUT();
|
|
break;
|
|
|
|
case IDOK:
|
|
EndDialog(hDlg, IDOK);
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
bReturn = FALSE;
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
BOOL
|
|
MainDlg_WM_SYSCOMMAND(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
|
|
switch (wParam) {
|
|
case SC_CLOSE:
|
|
EndDialog(hDlg, IDOK);
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
bReturn = FALSE;
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
BOOL
|
|
MainDlg_WM_CLOSE(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
UNREFERENCED_PARAMETER(wParam);
|
|
UNREFERENCED_PARAMETER(hDlg);
|
|
|
|
MemoryFree(pMainPerfData);
|
|
pMainPerfData = NULL;
|
|
MemoryFree(szNameTable);
|
|
szNameTable = NULL;
|
|
return TRUE;
|
|
}
|
|
|
|
INT_PTR
|
|
MainDlgProc(
|
|
HWND hDlg,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
switch (message) {
|
|
case WM_INITDIALOG:
|
|
bReturn = MainDlg_WM_INITDIALOG(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
bReturn = MainDlg_WM_COMMAND(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_SYSCOMMAND:
|
|
bReturn = MainDlg_WM_SYSCOMMAND(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_CLOSE:
|
|
bReturn = MainDlg_WM_CLOSE(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
default:
|
|
bReturn = FALSE;
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|