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.
3639 lines
142 KiB
3639 lines
142 KiB
/*++
|
|
|
|
Copyright (C) 1995-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
browsdlg.c
|
|
|
|
Abstract:
|
|
|
|
counter name browsing dialog box functions
|
|
|
|
Revision History
|
|
|
|
Bob Watson (a-robw) Oct-95 Created
|
|
|
|
--*/
|
|
#include <windows.h>
|
|
#include <winperf.h>
|
|
#include "mbctype.h"
|
|
#include "strsafe.h"
|
|
#include "pdh.h"
|
|
#include "pdhidef.h"
|
|
#include "pdhdlgs.h"
|
|
#include "pdhmsg.h"
|
|
#include "perftype.h"
|
|
#include "strings.h"
|
|
#include "browsdlg.h"
|
|
#include "resource.h"
|
|
|
|
#pragma warning ( disable : 4213)
|
|
|
|
// global data strings to load into combo box to select counter filtering level
|
|
|
|
ULONG
|
|
PdhiBrowseraulControlIdToHelpIdMap[] =
|
|
{
|
|
IDC_USE_LOCAL_MACHINE, IDH_USE_LOCAL_MACHINE,
|
|
IDC_SELECT_MACHINE, IDH_SELECT_MACHINE,
|
|
IDC_MACHINE_COMBO, IDH_MACHINE_COMBO,
|
|
IDC_COUNTER_DETAIL_COMBO, IDH_COUNTER_DETAIL_COMBO,
|
|
IDC_OBJECT_COMBO, IDH_OBJECT_COMBO,
|
|
IDC_ALL_COUNTERS, IDH_ALL_COUNTERS,
|
|
IDC_USE_COUNTER_LIST, IDH_USE_COUNTER_LIST,
|
|
IDC_COUNTER_LIST, IDH_COUNTER_LIST,
|
|
IDC_ALL_INSTANCES, IDH_ALL_INSTANCES,
|
|
IDC_USE_INSTANCE_LIST, IDH_USE_INSTANCE_LIST,
|
|
IDC_INSTANCE_LIST, IDH_INSTANCE_LIST,
|
|
IDC_EXPLAIN_BTN, IDH_EXPLAIN_BTN,
|
|
IDC_OBJECT_LIST, IDH_OBJECT_LIST,
|
|
0,0
|
|
};
|
|
|
|
PDHI_DETAIL_INFO PdhiDetailInfo[] = {
|
|
{ PERF_DETAIL_NOVICE, IDS_DETAIL_NOVICE },
|
|
{ PERF_DETAIL_ADVANCED, IDS_DETAIL_ADVANCED },
|
|
{ PERF_DETAIL_EXPERT, IDS_DETAIL_EXPERT },
|
|
{ PERF_DETAIL_WIZARD, IDS_DETAIL_WIZARD },
|
|
{ 0,0 }
|
|
};
|
|
|
|
static HWND hExplainDlg = NULL;
|
|
|
|
//
|
|
// Function references
|
|
//
|
|
|
|
STATIC_BOOL
|
|
PdhiLoadMachineObjects(
|
|
HWND hDlg,
|
|
BOOL bRefresh
|
|
);
|
|
|
|
STATIC_BOOL
|
|
PdhiLoadCountersAndInstances(
|
|
HWND hDlg
|
|
);
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_MACHINE_BUTTON(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
);
|
|
|
|
__inline
|
|
PDH_STATUS
|
|
PdhiCopyString(
|
|
LPBYTE * pszNextString,
|
|
LPWSTR szWorkBuffer,
|
|
LPDWORD pdwRemaining,
|
|
BOOL bUnicode
|
|
)
|
|
{
|
|
PDH_STATUS pdhStatus = ERROR_SUCCESS;
|
|
DWORD dwSize = 0;
|
|
DWORD dwRemaining = * pdwRemaining;
|
|
LPBYTE szNextString = * pszNextString;
|
|
|
|
if (bUnicode) {
|
|
dwSize = lstrlenW(szWorkBuffer);
|
|
if (dwSize < dwRemaining) {
|
|
StringCchCopyW((LPWSTR) szNextString, dwRemaining, szWorkBuffer);
|
|
szNextString += dwSize * sizeof(WCHAR);
|
|
* ((LPWSTR) szNextString) = L'\0';
|
|
szNextString += sizeof(WCHAR);
|
|
}
|
|
else {
|
|
pdhStatus = PDH_MORE_DATA;
|
|
}
|
|
dwSize ++;
|
|
}
|
|
else {
|
|
dwSize = dwRemaining;
|
|
pdhStatus = PdhiConvertUnicodeToAnsi(_getmbcp(), szWorkBuffer, (LPSTR) szNextString, & dwSize);
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
szNextString = szNextString + sizeof(CHAR) * (lstrlenA((LPSTR) szNextString) + 1);
|
|
}
|
|
}
|
|
|
|
if (dwRemaining >= dwSize) {
|
|
dwRemaining -= dwSize;
|
|
}
|
|
else {
|
|
dwRemaining = 0;
|
|
pdhStatus = PDH_MORE_DATA;
|
|
}
|
|
|
|
* pdwRemaining = dwRemaining;
|
|
* pszNextString = szNextString;
|
|
return pdhStatus;
|
|
}
|
|
|
|
LPWSTR
|
|
PdhiGetDlgText(
|
|
HWND hDlg,
|
|
INT hDlgItem
|
|
)
|
|
{
|
|
LPWSTR szText = NULL;
|
|
DWORD dwLength = 0;
|
|
HWND hWndItem = GetDlgItem(hDlg, hDlgItem);
|
|
|
|
if (hWndItem != NULL) {
|
|
dwLength = GetWindowTextLength(hWndItem);
|
|
if (dwLength != 0) {
|
|
dwLength ++;
|
|
szText = G_ALLOC(dwLength * sizeof(WCHAR));
|
|
if (szText != NULL) {
|
|
GetWindowTextW(hWndItem, szText, dwLength);
|
|
}
|
|
}
|
|
}
|
|
return szText;
|
|
}
|
|
|
|
LRESULT
|
|
PdhiGetListText(
|
|
HWND hDlg,
|
|
INT iDlgItem,
|
|
INT iItem,
|
|
LPWSTR * lpszName,
|
|
PDWORD pdwLength
|
|
)
|
|
{
|
|
LPWSTR szText = * lpszName;
|
|
DWORD dwLength = * pdwLength;
|
|
HWND hWndItem = GetDlgItem(hDlg, iDlgItem);
|
|
LRESULT iTextLen = LB_ERR;
|
|
|
|
if (hWndItem != NULL) {
|
|
iTextLen = SendMessageW(hWndItem, LB_GETTEXTLEN, iItem, 0);
|
|
if (iTextLen != LB_ERR) {
|
|
if (((DWORD) (iTextLen + 1)) > dwLength) {
|
|
LPWSTR szTmp = szText;
|
|
dwLength = (DWORD) iTextLen + 1;
|
|
if (szTmp == NULL) {
|
|
szText = G_ALLOC(dwLength * sizeof(WCHAR));
|
|
}
|
|
else {
|
|
szText = G_REALLOC(szTmp, dwLength * sizeof(WCHAR));
|
|
}
|
|
if (szText == NULL) {
|
|
G_FREE(szTmp);
|
|
}
|
|
}
|
|
if (szText != NULL) {
|
|
ZeroMemory(szText, dwLength * sizeof(WCHAR));
|
|
iTextLen = SendMessageW(hWndItem, LB_GETTEXT, iItem, (LPARAM) szText);
|
|
}
|
|
}
|
|
}
|
|
* pdwLength = dwLength;
|
|
* lpszName = szText;
|
|
return iTextLen;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiLoadNewMachine(
|
|
HWND hDlg,
|
|
LPCWSTR szNewMachineName,
|
|
BOOL bAdd
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Connects to a new machine and loads the necessary performance data
|
|
from that machine.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Handle to dialog box containing the combo & list boxes to fill
|
|
IN LPCWSTR szNewMachineName
|
|
Machine name to open and obtain data from
|
|
|
|
Return Value:
|
|
TRUE new machine connected and data loaded
|
|
FALSE unable to connect to machine or obtain performance data from it.
|
|
--*/
|
|
{
|
|
HWND hWndMachineCombo;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
LONG lMatchIndex;
|
|
PDH_STATUS status;
|
|
int mbStatus;
|
|
BOOL bReturn = FALSE;
|
|
DWORD dwDataSourceType;
|
|
LPWSTR szMsg;
|
|
|
|
// acquire the data block associated with this dialog instance
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA) GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData != NULL) {
|
|
// get window handle of the dialog box
|
|
hWndMachineCombo = GetDlgItem(hDlg, IDC_MACHINE_COMBO);
|
|
|
|
// not in list so try to add it as long as the data source
|
|
// is "Current Activity" (ie. == NULL) For Log Files, only
|
|
// the machines listed may be selected.
|
|
|
|
dwDataSourceType = DataSourceTypeH(pData->pDlgData->hDataSource);
|
|
if (dwDataSourceType != DATA_SOURCE_LOGFILE) {
|
|
PPERF_MACHINE pMachine = GetMachine(
|
|
(LPWSTR) szNewMachineName, 0, PDH_GM_UPDATE_NAME | PDH_GM_UPDATE_PERFNAME_ONLY);
|
|
if (pMachine != NULL) {
|
|
pMachine->dwRefCount --;
|
|
RELEASE_MUTEX(pMachine->hMutex);
|
|
|
|
if (pMachine->dwStatus == ERROR_SUCCESS) {
|
|
if (bAdd) {
|
|
// if successful, add string to combo box
|
|
lMatchIndex = (LONG) SendMessageW(hWndMachineCombo, CB_ADDSTRING, 0, (LPARAM) szNewMachineName);
|
|
SendMessageW(hWndMachineCombo, CB_SETCURSEL, (WPARAM) lMatchIndex, 0);
|
|
}
|
|
// update other controls in this dialog
|
|
PdhiLoadMachineObjects(hDlg, FALSE); // no need to update since it was just connected
|
|
PdhiLoadCountersAndInstances(hDlg);
|
|
SendMessageW(hDlg, WM_COMMAND,
|
|
MAKEWPARAM(IDC_COUNTER_LIST, LBN_SELCHANGE),
|
|
(LPARAM) GetDlgItem(hDlg, IDC_COUNTER_LIST));
|
|
bReturn = TRUE;
|
|
}
|
|
else {
|
|
SetLastError(pMachine->dwStatus);
|
|
}
|
|
}
|
|
if (! bReturn) {
|
|
status = GetLastError();
|
|
if (status == PDH_QUERY_PERF_DATA_TIMEOUT) {
|
|
szMsg = GetStringResource(IDS_COLLECT_TIMEOUT);
|
|
}
|
|
else {
|
|
szMsg = GetStringResource(IDS_ERR_UNABLE_TO_CONNECT);
|
|
}
|
|
if (szMsg != NULL) {
|
|
mbStatus = MessageBoxW(hDlg, szMsg, NULL, MB_ICONEXCLAMATION | MB_TASKMODAL | MB_OK);
|
|
if (mbStatus == IDCANCEL) {
|
|
SetFocus(GetDlgItem(hDlg, IDC_MACHINE_COMBO));
|
|
}
|
|
else {
|
|
SendMessageW(hWndMachineCombo, CB_SETCURSEL, pData->wpLastMachineSel, 0);
|
|
}
|
|
G_FREE(szMsg);
|
|
}
|
|
else {
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
szMsg = GetStringResource(IDS_ERR_MACHINE_NOT_IN_LOGFILE);
|
|
if (szMsg != NULL) {
|
|
mbStatus = MessageBoxW(hDlg, szMsg, NULL, MB_ICONEXCLAMATION | MB_TASKMODAL | MB_OK);
|
|
G_FREE (szMsg);
|
|
}
|
|
else {
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
}
|
|
// re-select the last machine
|
|
|
|
lMatchIndex = (long) SendMessageW(hWndMachineCombo,
|
|
CB_FINDSTRINGEXACT,
|
|
(WPARAM) -1,
|
|
(LPARAM) pData->szLastMachineName);
|
|
SendMessageW(hWndMachineCombo, CB_SETCURSEL, (WPARAM) lMatchIndex, 0);
|
|
}
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiSelectItemsInPath(
|
|
HWND hDlg
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Selects the items in the list box based on the counter path
|
|
string in the shared buffer.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Handle to the dialog window containing the controls
|
|
|
|
Return Value:
|
|
TRUE if successful,
|
|
FALSE if not
|
|
--*/
|
|
{
|
|
// regular stack variables
|
|
PPDH_COUNTER_PATH_ELEMENTS_W pCounterPathElementsW = NULL;
|
|
PPDH_COUNTER_PATH_ELEMENTS_A pCounterPathElementsA = NULL;
|
|
LPWSTR wszMachineName = NULL;
|
|
PDH_STATUS status;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
BOOL bReturn = FALSE;
|
|
DWORD dwBufferSize;
|
|
HWND hWndMachineCombo;
|
|
HWND hWndObjectCombo;
|
|
HWND hWndCounterList;
|
|
HWND hWndInstanceList;
|
|
LONG lIndex;
|
|
|
|
// reset the last error value
|
|
SetLastError(ERROR_SUCCESS);
|
|
|
|
// get this dialog's user data
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA) GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData == NULL) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
hWndMachineCombo = GetDlgItem(hDlg, IDC_MACHINE_COMBO);
|
|
if (pData->bShowObjects) {
|
|
hWndObjectCombo = GetDlgItem(hDlg, IDC_OBJECT_LIST);
|
|
if (hWndMachineCombo == NULL || hWndObjectCombo == NULL) {
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
else {
|
|
hWndObjectCombo = GetDlgItem(hDlg, IDC_OBJECT_COMBO);
|
|
hWndCounterList = GetDlgItem(hDlg, IDC_COUNTER_LIST);
|
|
hWndInstanceList = GetDlgItem(hDlg, IDC_INSTANCE_LIST);
|
|
if (hWndMachineCombo == NULL || hWndObjectCombo == NULL
|
|
|| hWndCounterList == NULL || hWndInstanceList == NULL) {
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
|
|
// Call the right conversion function based on user's buffer
|
|
|
|
if (pData->pDlgData->pWideStruct != NULL) {
|
|
// UNICODE/ wide characters
|
|
dwBufferSize = sizeof(PDH_COUNTER_PATH_ELEMENTS_W) + (PDH_MAX_COUNTER_PATH + 5) * sizeof(WCHAR);
|
|
pCounterPathElementsW = (PPDH_COUNTER_PATH_ELEMENTS_W) G_ALLOC(dwBufferSize);
|
|
if (pCounterPathElementsW == NULL) {
|
|
status = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
status = PdhParseCounterPathW(pData->pDlgData->pWideStruct->szReturnPathBuffer,
|
|
pCounterPathElementsW,
|
|
& dwBufferSize,
|
|
0);
|
|
while (status == PDH_MORE_DATA) {
|
|
G_FREE(pCounterPathElementsW);
|
|
pCounterPathElementsW = (PPDH_COUNTER_PATH_ELEMENTS_W) G_ALLOC(dwBufferSize);
|
|
if (pCounterPathElementsW == NULL) {
|
|
status = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
status = PdhParseCounterPathW(pData->pDlgData->pWideStruct->szReturnPathBuffer,
|
|
pCounterPathElementsW,
|
|
& dwBufferSize,
|
|
0);
|
|
}
|
|
}
|
|
}
|
|
if (status == ERROR_SUCCESS) {
|
|
// select entry in each list box
|
|
// select machine entry. Load machine if necessary
|
|
lIndex = (LONG) SendMessageW(hWndMachineCombo,
|
|
CB_FINDSTRINGEXACT,
|
|
(WPARAM) -1,
|
|
(LPARAM) pCounterPathElementsW->szMachineName);
|
|
if (lIndex == CB_ERR) {
|
|
// try adding the machine
|
|
if (! PdhiLoadNewMachine(hDlg, pCounterPathElementsW->szMachineName, TRUE)) {
|
|
// give up
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
else {
|
|
// the machine has been found so select it
|
|
SendMessageW(hWndMachineCombo, CB_SETCURSEL, (WPARAM) lIndex, 0);
|
|
// update other fields
|
|
// no need to update since it was just connected
|
|
if (! PdhiLoadNewMachine(hDlg, pCounterPathElementsW->szMachineName, FALSE)) {
|
|
// give up
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
|
|
// select the current object
|
|
lIndex = (LONG) SendMessageW(hWndObjectCombo,
|
|
CB_FINDSTRING,
|
|
(WPARAM) -1,
|
|
(LPARAM) pCounterPathElementsW->szObjectName);
|
|
if (lIndex != CB_ERR) {
|
|
SendMessageW(hWndObjectCombo, CB_SETCURSEL, (WPARAM) lIndex, 0);
|
|
|
|
if (pData->bShowObjects) {
|
|
bReturn = TRUE;
|
|
}
|
|
else {
|
|
// update the counters for this object
|
|
PdhiLoadCountersAndInstances(hDlg);
|
|
// now select the counter
|
|
lIndex = (LONG)SendMessageW(hWndCounterList,
|
|
LB_FINDSTRING,
|
|
(WPARAM) -1,
|
|
(LPARAM) pCounterPathElementsW->szCounterName);
|
|
if (lIndex != LB_ERR) {
|
|
if (pData->bSelectMultipleCounters) {
|
|
SendMessageW(hWndCounterList, LB_SETSEL, FALSE, (LPARAM) -1);
|
|
SendMessageW(hWndCounterList, LB_SETSEL, TRUE, lIndex);
|
|
SendMessageW(hWndCounterList, LB_SETCARETINDEX, (WPARAM) lIndex, MAKELPARAM(FALSE, 0));
|
|
}
|
|
else {
|
|
SendMessageW(hWndCounterList, LB_SETCURSEL, lIndex, 0);
|
|
}
|
|
// display explain text if necessary
|
|
SendMessageW(hDlg,
|
|
WM_COMMAND,
|
|
MAKEWPARAM(IDC_COUNTER_LIST, LBN_SELCHANGE),
|
|
(LPARAM) GetDlgItem(hDlg, IDC_COUNTER_LIST));
|
|
bReturn = TRUE;
|
|
}
|
|
}
|
|
}
|
|
} // else unable to read path so exit
|
|
}
|
|
else {
|
|
// ANSI characters
|
|
dwBufferSize = sizeof(PDH_COUNTER_PATH_ELEMENTS_W) + (PDH_MAX_COUNTER_PATH + 5) * sizeof(CHAR);
|
|
pCounterPathElementsA = (PPDH_COUNTER_PATH_ELEMENTS_A) G_ALLOC(dwBufferSize);
|
|
if (pCounterPathElementsA == NULL) {
|
|
status = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
status = PdhParseCounterPathA(pData->pDlgData->pAnsiStruct->szReturnPathBuffer,
|
|
pCounterPathElementsA,
|
|
& dwBufferSize,
|
|
0);
|
|
while (status == PDH_MORE_DATA) {
|
|
G_FREE(pCounterPathElementsA);
|
|
pCounterPathElementsA = (PPDH_COUNTER_PATH_ELEMENTS_A) G_ALLOC(dwBufferSize);
|
|
if (pCounterPathElementsA == NULL) {
|
|
status = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
status = PdhParseCounterPathA(pData->pDlgData->pAnsiStruct->szReturnPathBuffer,
|
|
pCounterPathElementsA,
|
|
& dwBufferSize,
|
|
0);
|
|
}
|
|
}
|
|
}
|
|
if (status == ERROR_SUCCESS) {
|
|
// select entry in each list box
|
|
// select machine entry. Load machine if necessary
|
|
|
|
lIndex = (LONG) SendMessageA(hWndMachineCombo,
|
|
CB_FINDSTRINGEXACT,
|
|
(WPARAM) -1,
|
|
(LPARAM) pCounterPathElementsA->szMachineName);
|
|
if (lIndex == CB_ERR) {
|
|
// try adding the machine
|
|
// convert ansi buffer to wide char first
|
|
wszMachineName = PdhiMultiByteToWideChar(_getmbcp(), pCounterPathElementsA->szMachineName);
|
|
if (wszMachineName == NULL) {
|
|
goto Cleanup;
|
|
}
|
|
if (! PdhiLoadNewMachine(hDlg, wszMachineName, TRUE)) {
|
|
// give up
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
else {
|
|
// the machine has been found so select it
|
|
SendMessageA(hWndMachineCombo, CB_SETCURSEL, (WPARAM) lIndex, 0);
|
|
// update other fields
|
|
PdhiLoadMachineObjects(hDlg, FALSE); // no need to update since it was just connected
|
|
}
|
|
|
|
// select the current object
|
|
lIndex = (LONG) SendMessageA(hWndObjectCombo,
|
|
CB_FINDSTRING,
|
|
(WPARAM) -1,
|
|
(LPARAM) pCounterPathElementsA->szObjectName);
|
|
if (lIndex != CB_ERR) {
|
|
SendMessageA(hWndObjectCombo, CB_SETCURSEL, (WPARAM) lIndex, 0);
|
|
if (pData->bShowObjects) {
|
|
bReturn = TRUE;
|
|
}
|
|
else {
|
|
// update the counters for this object
|
|
PdhiLoadCountersAndInstances(hDlg);
|
|
// now select the counter
|
|
lIndex = (LONG)SendMessageA(hWndCounterList,
|
|
LB_FINDSTRING,
|
|
(WPARAM) -1,
|
|
(LPARAM) pCounterPathElementsA->szCounterName);
|
|
if (lIndex != LB_ERR) {
|
|
if (pData->bSelectMultipleCounters) {
|
|
SendMessageA(hWndCounterList, LB_SETSEL, FALSE, (LPARAM) -1);
|
|
SendMessageA(hWndCounterList, LB_SETSEL, TRUE, lIndex);
|
|
SendMessageA(hWndCounterList, LB_SETCARETINDEX, (WPARAM) lIndex, MAKELPARAM(FALSE, 0));
|
|
}
|
|
else {
|
|
SendMessageA(hWndCounterList, LB_SETCURSEL, lIndex, 0);
|
|
}
|
|
// display explain text if necessary
|
|
SendMessage(hDlg,
|
|
WM_COMMAND,
|
|
MAKEWPARAM(IDC_COUNTER_LIST, LBN_SELCHANGE),
|
|
(LPARAM) GetDlgItem(hDlg, IDC_COUNTER_LIST));
|
|
bReturn = TRUE;
|
|
}
|
|
}
|
|
}
|
|
} // else unable to read path so exit
|
|
}
|
|
|
|
Cleanup:
|
|
G_FREE(pCounterPathElementsW);
|
|
G_FREE(pCounterPathElementsA);
|
|
G_FREE(wszMachineName);
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_DWORD
|
|
PdhiLoadDetailLevelCombo(
|
|
HWND hDlg,
|
|
DWORD dwInitialLevel
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Loads the Detail Level Combo box with the strings and ID's
|
|
defined by the PdhiDetailInfo string array above.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Handle to the dialog box containing the combo box
|
|
IN DWORD dwInitialLevel
|
|
the intitial detail level to select in the combo box.
|
|
|
|
Return Value:
|
|
Returns the selected level or 0 if an error ocurred.
|
|
--*/
|
|
{
|
|
HWND hWndCombo;
|
|
DWORD dwIndex;
|
|
DWORD dwStringLength;
|
|
DWORD dwDefaultIndex = 0;
|
|
DWORD dwSelectedLevel = 0;
|
|
DWORD dwThisCbIndex;
|
|
WCHAR szTempBuffer[MAX_PATH + 1]; // for loading string resource
|
|
|
|
hWndCombo = GetDlgItem(hDlg, IDC_COUNTER_DETAIL_COMBO);
|
|
|
|
// load all combo box strings from static data array defined above
|
|
for (dwIndex = 0; PdhiDetailInfo[dwIndex].dwLevelValue > 0; dwIndex ++) {
|
|
// load the string resource for this string
|
|
ZeroMemory(szTempBuffer, (MAX_PATH + 1) * sizeof(WCHAR));
|
|
dwStringLength = LoadStringW(ThisDLLHandle,
|
|
PdhiDetailInfo[dwIndex].dwStringResourceId,
|
|
szTempBuffer,
|
|
MAX_PATH);
|
|
if (dwStringLength == 0) {
|
|
// unable to read the string in, so
|
|
// substitute the value for the string
|
|
_ltow(PdhiDetailInfo[dwIndex].dwLevelValue, szTempBuffer, 10);
|
|
}
|
|
// load the strings into the combo box in the same order they
|
|
// were described in the array above
|
|
dwThisCbIndex = (DWORD) SendMessageW(hWndCombo, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) szTempBuffer);
|
|
|
|
// set the initial CB entry to the highest item <= to the
|
|
// desired default level
|
|
if (dwThisCbIndex != CB_ERR) {
|
|
// set item data to be the corresponding detail level
|
|
SendMessageW(hWndCombo,
|
|
CB_SETITEMDATA,
|
|
(WPARAM) dwThisCbIndex,
|
|
(LPARAM) PdhiDetailInfo[dwIndex].dwLevelValue);
|
|
// save default selection if it matches.
|
|
if (PdhiDetailInfo[dwIndex].dwLevelValue <= dwInitialLevel) {
|
|
dwDefaultIndex = dwThisCbIndex;
|
|
dwSelectedLevel = PdhiDetailInfo[dwIndex].dwLevelValue;
|
|
}
|
|
}
|
|
}
|
|
// select desired default entry
|
|
SendMessageW(hWndCombo, CB_SETCURSEL, (WPARAM) dwDefaultIndex, 0);
|
|
|
|
return dwSelectedLevel;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiLoadKnownMachines(
|
|
HWND hDlg
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Get the list of machines that are currently connected and disply
|
|
them in the machine list box.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Handle to the dialog window containing the controls
|
|
|
|
Return Value:
|
|
TRUE if successful,
|
|
FALSE if not
|
|
--*/
|
|
{
|
|
LPWSTR mszMachineList = NULL;
|
|
LPWSTR szThisMachine;
|
|
DWORD dwLength;
|
|
PDH_STATUS status;
|
|
HWND hMachineListWnd;
|
|
HCURSOR hOldCursor;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
BOOL bReturn = FALSE;
|
|
|
|
// display wait cursor since this is potentially time consuming
|
|
hOldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
|
|
|
|
// get this dialog's user data
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA) GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData == NULL) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
|
|
// get window handle to Machine list combo box
|
|
hMachineListWnd = GetDlgItem(hDlg, IDC_MACHINE_COMBO);
|
|
|
|
// clear machine combo box
|
|
SendMessageW(hMachineListWnd, CB_RESETCONTENT, 0, 0);
|
|
|
|
// get list of connected machines from PDH library
|
|
dwLength = 0;
|
|
status = PdhEnumMachinesHW(pData->pDlgData->hDataSource, mszMachineList, & dwLength);
|
|
while (status == PDH_MORE_DATA) {
|
|
G_FREE(mszMachineList);
|
|
mszMachineList = G_ALLOC(dwLength * sizeof(WCHAR));
|
|
if (mszMachineList == NULL) {
|
|
status = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
status = PdhEnumMachinesHW(pData->pDlgData->hDataSource, mszMachineList, & dwLength);
|
|
}
|
|
}
|
|
|
|
if (status == ERROR_SUCCESS) {
|
|
long lMatchIndex;
|
|
|
|
// update the combo box
|
|
// go through MSZ and load each string into combo box
|
|
for (szThisMachine = mszMachineList; * szThisMachine != L'\0'; szThisMachine += lstrlenW(szThisMachine) + 1) {
|
|
// add to the list box and let the list box sort them
|
|
SendMessageW(hMachineListWnd, CB_ADDSTRING, 0, (LPARAM) szThisMachine);
|
|
}
|
|
lMatchIndex = (long) SendMessageW(hMachineListWnd,
|
|
CB_FINDSTRINGEXACT,
|
|
(WPARAM) -1,
|
|
(LPARAM) szStaticLocalMachineName);
|
|
if (lMatchIndex == CB_ERR) {
|
|
lMatchIndex = 0;
|
|
}
|
|
SendMessageW(hMachineListWnd, CB_SETCURSEL, (WPARAM) lMatchIndex, 0);
|
|
|
|
// the "current" machine has not been defined, then
|
|
// do it now
|
|
GetWindowTextW(hMachineListWnd, (LPWSTR) pData->szLastMachineName, MAX_PATH);
|
|
|
|
bReturn = TRUE;
|
|
}
|
|
else {
|
|
// no machines, so select local button and disable the edit window
|
|
CheckRadioButton(hDlg, IDC_USE_LOCAL_MACHINE, IDC_SELECT_MACHINE, IDC_USE_LOCAL_MACHINE);
|
|
PdhiBrowseCtrDlg_MACHINE_BUTTON(hDlg, BN_CLICKED, GetDlgItem(hDlg, IDC_USE_LOCAL_MACHINE));
|
|
bReturn = TRUE;
|
|
}
|
|
|
|
Cleanup:
|
|
// restore cursor
|
|
SetCursor(hOldCursor);
|
|
G_FREE(mszMachineList);
|
|
// return status of function
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiLoadMachineObjects(
|
|
HWND hDlg,
|
|
BOOL bRefresh
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
For the currently selected machine, load the object list box
|
|
with the objects supported by that machine. If the bRefresh
|
|
flag is TRUE, then query the system for the current perf data
|
|
before loading the list box.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window handle of parent dialog box
|
|
IN BOOL bRefresh
|
|
TRUE = Query performance data of system before updating
|
|
FALSE = Use the current system perf data to load the objects from
|
|
|
|
Return Value:
|
|
TRUE if successful,
|
|
FALSE if not
|
|
|
|
--*/
|
|
{
|
|
LPWSTR szMachineName = NULL;
|
|
LPWSTR szDefaultObject = NULL;
|
|
LPWSTR mszObjectList = NULL;
|
|
DWORD dwLength;
|
|
LPWSTR szThisObject;
|
|
HCURSOR hOldCursor;
|
|
HWND hObjectListWnd;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
PDH_STATUS pdhStatus;
|
|
DWORD dwReturn;
|
|
DWORD dwDetailLevel;
|
|
LPWSTR szMsg;
|
|
LRESULT nEntry;
|
|
DWORD dwFlags;
|
|
|
|
// save old cursor and display wait cursor
|
|
hOldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
|
|
|
|
// get the pointer to the dialog's user data
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA)GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData == NULL) {
|
|
pdhStatus = PDH_INVALID_HANDLE;
|
|
goto Cleanup;
|
|
}
|
|
|
|
hObjectListWnd = pData->bShowObjects ? GetDlgItem(hDlg, IDC_OBJECT_LIST) : GetDlgItem(hDlg, IDC_OBJECT_COMBO);
|
|
if (hObjectListWnd == NULL) {
|
|
pdhStatus = PDH_INVALID_HANDLE;
|
|
goto Cleanup;
|
|
}
|
|
|
|
szMachineName = PdhiGetDlgText(hDlg, IDC_MACHINE_COMBO);
|
|
if (szMachineName == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
goto Cleanup;
|
|
}
|
|
if (lstrcmpiW(szMachineName, pData->szLastMachineName) != 0) {
|
|
StringCchCopyW(pData->szLastMachineName, MAX_PATH, szMachineName);
|
|
}
|
|
|
|
if (! pData->bShowObjects) {
|
|
// first clear out any old contents
|
|
SendMessageW(hObjectListWnd, CB_RESETCONTENT, 0, 0);
|
|
}
|
|
else {
|
|
SendMessageW(hObjectListWnd, LB_RESETCONTENT, 0, 0);
|
|
}
|
|
|
|
// get object list from the PDH
|
|
dwDetailLevel = pData->dwCurrentDetailLevel;
|
|
dwDetailLevel |= pData->bIncludeCostlyObjects ? PERF_DETAIL_COSTLY : 0;
|
|
dwLength = 0;
|
|
pdhStatus = PdhEnumObjectsHW(pData->pDlgData->hDataSource,
|
|
szMachineName,
|
|
mszObjectList,
|
|
& dwLength,
|
|
dwDetailLevel,
|
|
bRefresh);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
// then realloc and try again, but only once
|
|
G_FREE(mszObjectList);
|
|
mszObjectList = G_ALLOC (dwLength * sizeof(WCHAR));
|
|
if (mszObjectList == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
// No need to call RegQueryValueEx(HKEY_PERFORMANCE_DATA, "Global", ...) again.
|
|
// The first one already does that.
|
|
//
|
|
pdhStatus = PdhEnumObjectsHW(pData->pDlgData->hDataSource,
|
|
szMachineName,
|
|
mszObjectList,
|
|
& dwLength,
|
|
dwDetailLevel,
|
|
FALSE);
|
|
}
|
|
}
|
|
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
EnableWindow(hObjectListWnd, TRUE);
|
|
// load object list to the list (combo) box
|
|
for (szThisObject = mszObjectList; *szThisObject != L'\0'; szThisObject += lstrlenW(szThisObject) + 1) {
|
|
if (pData->bShowObjects) {
|
|
DWORD dwCounterListLength = 0;
|
|
DWORD dwInstanceListLength = 0;
|
|
|
|
pdhStatus = PdhEnumObjectItemsHW(pData->pDlgData->hDataSource,
|
|
szMachineName,
|
|
szThisObject,
|
|
NULL,
|
|
& dwCounterListLength,
|
|
NULL,
|
|
& dwInstanceListLength,
|
|
PERF_DETAIL_WIZARD,
|
|
0);
|
|
if (pdhStatus != ERROR_SUCCESS && pdhStatus != PDH_MORE_DATA) {
|
|
dwInstanceListLength = 0;
|
|
}
|
|
if (dwInstanceListLength == 0 || dwInstanceListLength > 2) {
|
|
// send to list box control
|
|
nEntry = SendMessageW(hObjectListWnd, LB_ADDSTRING, 0, (LPARAM) szThisObject);
|
|
dwFlags = 0;
|
|
if (dwInstanceListLength > 2) {
|
|
dwFlags |= PDH_OBJECT_HAS_INSTANCES;
|
|
}
|
|
SendMessageW(hObjectListWnd, LB_SETITEMDATA, (WPARAM) nEntry, (LPARAM) dwFlags);
|
|
}
|
|
pdhStatus = ERROR_SUCCESS;
|
|
}
|
|
else {
|
|
// send to combo box
|
|
// add each string...
|
|
SendMessageW(hObjectListWnd, CB_ADDSTRING, 0, (LPARAM)szThisObject);
|
|
}
|
|
}
|
|
|
|
if (! pData->bShowObjects) {
|
|
// get default Object
|
|
dwLength = 0;
|
|
pdhStatus = PdhGetDefaultPerfObjectHW(pData->pDlgData->hDataSource,
|
|
szMachineName,
|
|
szDefaultObject,
|
|
& dwLength);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
G_FREE(szDefaultObject);
|
|
szDefaultObject = G_ALLOC(dwLength * sizeof(WCHAR));
|
|
if (szDefaultObject == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
pdhStatus = PdhGetDefaultPerfObjectHW(pData->pDlgData->hDataSource,
|
|
szMachineName,
|
|
szDefaultObject,
|
|
& dwLength);
|
|
}
|
|
}
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
// and select it if it's present (which it should be)
|
|
dwReturn = (DWORD) SendMessageW(hObjectListWnd, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) szDefaultObject);
|
|
if (dwReturn == CB_ERR) pdhStatus = PDH_CSTATUS_NO_OBJECT;
|
|
}
|
|
if (pdhStatus != ERROR_SUCCESS) {
|
|
// default object not found in list so select the first one
|
|
SendMessageW(hObjectListWnd, CB_SETCURSEL, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// unable to obtain object list so display message and disable list
|
|
szMsg = GetStringResource(IDS_BRWS_NO_OBJECTS);
|
|
if (szMsg != NULL) {
|
|
if (! pData->bShowObjects) {
|
|
SendMessageW(hObjectListWnd, CB_ADDSTRING, 0, (LPARAM) szMsg);
|
|
}
|
|
else {
|
|
SendMessageW(hObjectListWnd, LB_ADDSTRING, 0, (LPARAM) szMsg);
|
|
}
|
|
G_FREE(szMsg);
|
|
EnableWindow(hObjectListWnd, FALSE);
|
|
}
|
|
}
|
|
|
|
Cleanup:
|
|
// restore cursor
|
|
SetCursor(hOldCursor);
|
|
|
|
G_FREE(szMachineName);
|
|
G_FREE(szDefaultObject);
|
|
G_FREE(mszObjectList);
|
|
|
|
// return status
|
|
return (pdhStatus == ERROR_SUCCESS) ? (TRUE) : (FALSE);
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiLoadCountersAndInstances(
|
|
HWND hDlg
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Load the counters and instances of the selected object on the
|
|
current machine
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window handle of the dialog box containing these controls
|
|
|
|
Return Value:
|
|
TRUE if successful,
|
|
FALSE if not
|
|
--*/
|
|
{
|
|
LPWSTR szMachineName = NULL;
|
|
LPWSTR szObjectName = NULL;
|
|
DWORD dwLength;
|
|
LPWSTR szDefaultCounter = NULL;
|
|
LPWSTR szInstanceString = NULL;
|
|
LPWSTR szIndexStringPos;
|
|
DWORD dwDefaultIndex;
|
|
DWORD dwCounterListLength;
|
|
DWORD dwInstanceListLength;
|
|
DWORD dwInstanceMatch;
|
|
DWORD dwInstanceIndex;
|
|
DWORD dwInstanceCount;
|
|
LPWSTR szThisItem;
|
|
HWND hWndCounterListBox;
|
|
HWND hWndInstanceListBox;
|
|
HCURSOR hOldCursor;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
PDH_STATUS pdhStatus;
|
|
LPWSTR mszCounterList = NULL;
|
|
LPWSTR mszInstanceList = NULL;
|
|
LPWSTR mszTmpList;
|
|
LPWSTR szMsg;
|
|
HDC hDcListBox;
|
|
SIZE Size;
|
|
LONG dwHorizExtent;
|
|
BOOL bReturn = FALSE;
|
|
|
|
// save current cursor and display wait cursor
|
|
hOldCursor = SetCursor (LoadCursor (NULL, IDC_WAIT));
|
|
|
|
// get the pointer to the dialog's user data
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA) GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData == NULL) {
|
|
pdhStatus = PDH_INVALID_HANDLE;
|
|
goto Cleanup;
|
|
}
|
|
|
|
hWndCounterListBox = GetDlgItem(hDlg, IDC_COUNTER_LIST);
|
|
hWndInstanceListBox = GetDlgItem(hDlg, IDC_INSTANCE_LIST);
|
|
if (hWndCounterListBox == NULL || hWndInstanceListBox == NULL) {
|
|
pdhStatus = PDH_INVALID_HANDLE;
|
|
goto Cleanup;
|
|
}
|
|
|
|
szMachineName = PdhiGetDlgText(hDlg, IDC_MACHINE_COMBO);
|
|
szObjectName = PdhiGetDlgText(hDlg, IDC_OBJECT_COMBO);
|
|
if (szMachineName == NULL || szObjectName == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
goto Cleanup;
|
|
}
|
|
|
|
dwCounterListLength = 0;
|
|
dwInstanceListLength = 0;
|
|
pdhStatus = PdhEnumObjectItemsHW(pData->pDlgData->hDataSource,
|
|
szMachineName,
|
|
szObjectName,
|
|
mszCounterList,
|
|
& dwCounterListLength,
|
|
mszInstanceList,
|
|
& dwInstanceListLength,
|
|
pData->dwCurrentDetailLevel,
|
|
0);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
if (dwCounterListLength > 0) {
|
|
G_FREE(mszCounterList);
|
|
mszCounterList = G_ALLOC(dwCounterListLength * sizeof(WCHAR));
|
|
if (mszCounterList == NULL) pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
if (dwInstanceListLength > 0) {
|
|
G_FREE(mszInstanceList);
|
|
mszInstanceList = G_ALLOC(dwInstanceListLength * sizeof(WCHAR));
|
|
if (mszInstanceList == NULL) pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
|
|
if (pdhStatus != PDH_MEMORY_ALLOCATION_FAILURE) {
|
|
pdhStatus = PdhEnumObjectItemsHW(pData->pDlgData->hDataSource,
|
|
szMachineName,
|
|
szObjectName,
|
|
mszCounterList,
|
|
& dwCounterListLength,
|
|
mszInstanceList,
|
|
& dwInstanceListLength,
|
|
pData->dwCurrentDetailLevel,
|
|
0);
|
|
}
|
|
}
|
|
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
//reset contents of both list boxes
|
|
SendMessageW(hWndCounterListBox, LB_RESETCONTENT, 0, 0);
|
|
SendMessageW(hWndInstanceListBox, LB_RESETCONTENT, 0, 0);
|
|
|
|
// enable both list boxes
|
|
EnableWindow(hWndInstanceListBox, TRUE);
|
|
EnableWindow(hWndCounterListBox, TRUE);
|
|
|
|
// now fill 'em up
|
|
// start with the counters
|
|
hDcListBox = GetDC(hWndCounterListBox);
|
|
if (hDcListBox == NULL) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
dwHorizExtent = 0;
|
|
if (dwCounterListLength > 0 && mszCounterList != NULL) {
|
|
for (szThisItem = mszCounterList; * szThisItem != L'\0'; szThisItem += lstrlenW(szThisItem) + 1) {
|
|
if (GetTextExtentPoint32W(hDcListBox, szThisItem, lstrlenW(szThisItem), & Size)) {
|
|
if (Size.cx > dwHorizExtent) {
|
|
dwHorizExtent = Size.cx;
|
|
}
|
|
}
|
|
SendMessageW(hWndCounterListBox, LB_ADDSTRING, 0, (LPARAM) szThisItem);
|
|
}
|
|
SendMessageW(hWndCounterListBox, LB_SETHORIZONTALEXTENT, (WPARAM) dwHorizExtent, 0);
|
|
}
|
|
ReleaseDC(hWndCounterListBox, hDcListBox);
|
|
|
|
// once the list box has been loaded see if we want to keep it
|
|
// enabled. It's filled regardless just so the user can see some
|
|
// of the entries, even if they have this disabled by the "all"
|
|
// counter button
|
|
|
|
if (pData->bSelectAllCounters) {
|
|
// disable instance list
|
|
EnableWindow(hWndCounterListBox, FALSE);
|
|
}
|
|
else {
|
|
// set the default selection if there are entries in the
|
|
// list box and use the correct message depending on the
|
|
// selection options
|
|
// set the default counter
|
|
dwLength = 0;
|
|
pdhStatus = PdhGetDefaultPerfCounterHW(pData->pDlgData->hDataSource,
|
|
szMachineName,
|
|
szObjectName,
|
|
szDefaultCounter,
|
|
& dwLength);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
G_FREE(szDefaultCounter);
|
|
szDefaultCounter = G_ALLOC(dwLength * sizeof(WCHAR));
|
|
if (szDefaultCounter == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
pdhStatus = PdhGetDefaultPerfCounterHW(pData->pDlgData->hDataSource,
|
|
szMachineName,
|
|
szObjectName,
|
|
szDefaultCounter,
|
|
& dwLength);
|
|
}
|
|
}
|
|
if (pdhStatus != ERROR_SUCCESS) {
|
|
dwDefaultIndex = 0;
|
|
}
|
|
else {
|
|
dwDefaultIndex = (DWORD)SendMessageW(hWndCounterListBox,
|
|
LB_FINDSTRINGEXACT,
|
|
(WPARAM) -1,
|
|
(LPARAM) szDefaultCounter);
|
|
if (dwDefaultIndex == LB_ERR) dwDefaultIndex = 0;
|
|
}
|
|
|
|
if (pData->bSelectMultipleCounters) {
|
|
SendMessageW(hWndCounterListBox, LB_SETSEL, TRUE, dwDefaultIndex);
|
|
SendMessageW(hWndCounterListBox, LB_SETCARETINDEX, (WPARAM) dwDefaultIndex, MAKELPARAM(FALSE, 0));
|
|
}
|
|
else {
|
|
SendMessageW (hWndCounterListBox, LB_SETCURSEL, dwDefaultIndex, 0);
|
|
}
|
|
}
|
|
|
|
// now the instance list
|
|
if (mszInstanceList != NULL && dwInstanceListLength > 0) {
|
|
// there's at least one entry, so prepare the list box
|
|
// enable the list box and the instance radio buttons on the
|
|
// assumption that they will be used. this is tested later.
|
|
EnableWindow(hWndInstanceListBox, TRUE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ALL_INSTANCES), TRUE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_USE_INSTANCE_LIST), TRUE);
|
|
|
|
dwInstanceCount = 0;
|
|
dwLength = 0;
|
|
|
|
// load instance entries
|
|
hDcListBox = GetDC(hWndInstanceListBox);
|
|
if (hDcListBox == NULL) {
|
|
goto Cleanup;
|
|
}
|
|
dwHorizExtent = 0;
|
|
for (szThisItem = mszInstanceList; * szThisItem != L'\0'; szThisItem += lstrlenW(szThisItem) + 1) {
|
|
// see if the index number should be displayed
|
|
if (pData->bShowIndex) {
|
|
// if so, it must be derived,
|
|
// this is accomplished by making an index entry starting
|
|
// at 1, and looking for a match in the current entries.
|
|
// if a match is found, then the index is incremented and
|
|
// the process is repeated until the specified
|
|
// instance is not found. The first value not found is
|
|
// then the index entry for that item.
|
|
//
|
|
// first see if there's an undecorated one in the list box
|
|
// if not then add this one
|
|
if (dwLength < (DWORD) (lstrlenW(szThisItem) + 32)) {
|
|
LPWSTR szTmp = szInstanceString;
|
|
dwLength = lstrlenW(szThisItem) + 32;
|
|
if (szTmp == NULL) {
|
|
szInstanceString = G_ALLOC(dwLength * sizeof(WCHAR));
|
|
}
|
|
else {
|
|
szInstanceString = G_REALLOC(szTmp, dwLength * sizeof(WCHAR));
|
|
}
|
|
if (szInstanceString == NULL) { G_FREE(szTmp); goto Cleanup; }
|
|
}
|
|
ZeroMemory(szInstanceString, dwLength * sizeof(WCHAR));
|
|
StringCchCopyW(szInstanceString, dwLength, szThisItem);
|
|
dwInstanceMatch = (DWORD) -1;
|
|
dwInstanceMatch = (DWORD) SendMessageW(hWndInstanceListBox,
|
|
LB_FINDSTRINGEXACT,
|
|
(WPARAM) dwInstanceMatch,
|
|
(LPARAM) szInstanceString);
|
|
if (dwInstanceMatch == LB_ERR) {
|
|
// then this is the first one so add it in the
|
|
// undecorated form
|
|
if (GetTextExtentPoint32W(hDcListBox, szInstanceString, lstrlenW(szInstanceString), & Size)) {
|
|
if (Size.cx > dwHorizExtent) {
|
|
dwHorizExtent = Size.cx;
|
|
SendMessageW(hWndInstanceListBox, LB_SETHORIZONTALEXTENT, (WPARAM) dwHorizExtent, 0);
|
|
}
|
|
}
|
|
SendMessageW(hWndInstanceListBox, LB_ADDSTRING, 0, (LPARAM) szInstanceString);
|
|
}
|
|
else {
|
|
// there's already a plain one, so increment through
|
|
// the index values and find one that's not in the
|
|
// list already
|
|
dwInstanceIndex = 1;
|
|
dwInstanceMatch = (DWORD) -1;
|
|
StringCchCatW(szInstanceString, dwLength, cszPoundSign);
|
|
szIndexStringPos = & szInstanceString[lstrlenW(szInstanceString)];
|
|
do {
|
|
_ltow((long) dwInstanceIndex ++, szIndexStringPos, 10);
|
|
dwInstanceMatch = (DWORD) SendMessageW(hWndInstanceListBox,
|
|
LB_FINDSTRINGEXACT,
|
|
(WPARAM) dwInstanceMatch,
|
|
(LPARAM) szInstanceString);
|
|
}
|
|
while (dwInstanceMatch != LB_ERR);
|
|
// add the last entry checked (the first one not found)
|
|
// to the list box now.
|
|
if (GetTextExtentPoint32W(hDcListBox, szInstanceString, lstrlenW(szInstanceString), & Size)) {
|
|
if (Size.cx > dwHorizExtent) {
|
|
dwHorizExtent = Size.cx;
|
|
SendMessageW (hWndInstanceListBox, LB_SETHORIZONTALEXTENT, (WPARAM) dwHorizExtent, 0);
|
|
}
|
|
}
|
|
SendMessageW (hWndInstanceListBox, LB_ADDSTRING, 0, (LPARAM) szInstanceString);
|
|
}
|
|
}
|
|
else {
|
|
// index values are not required so just add the string
|
|
// to the list box
|
|
if (GetTextExtentPoint32W(hDcListBox, szThisItem, lstrlenW(szThisItem), & Size)) {
|
|
if (Size.cx > dwHorizExtent) {
|
|
dwHorizExtent = Size.cx;
|
|
SendMessageW(hWndInstanceListBox, LB_SETHORIZONTALEXTENT, (WPARAM) dwHorizExtent, 0);
|
|
}
|
|
}
|
|
SendMessageW (hWndInstanceListBox, LB_ADDSTRING, 0, (LPARAM) szThisItem);
|
|
}
|
|
dwInstanceCount++;
|
|
}
|
|
|
|
ReleaseDC(hWndInstanceListBox, hDcListBox);
|
|
|
|
if (dwInstanceCount == 0) {
|
|
// disable the OK/Add button, since this object has no
|
|
// current instances to monitor
|
|
EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
|
|
szMsg = GetStringResource(IDS_BRWS_NO_INSTANCES);
|
|
if (szMsg != NULL) {
|
|
SendMessageW(hWndInstanceListBox, LB_ADDSTRING, 0, (LPARAM) szMsg);
|
|
G_FREE(szMsg);
|
|
}
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ALL_INSTANCES), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_USE_INSTANCE_LIST), FALSE);
|
|
EnableWindow(hWndInstanceListBox, FALSE);
|
|
}
|
|
else {
|
|
// enable the OK/Add button since there is some monitorable
|
|
// instance(s)
|
|
EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ALL_INSTANCES), TRUE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_USE_INSTANCE_LIST), TRUE);
|
|
EnableWindow(hWndInstanceListBox, TRUE);
|
|
}
|
|
// once the list box has been loaded see if we want to keep it
|
|
// enabled. It's filled regardless just so the user can see some
|
|
// of the entries, even if they have this disabled by the "all"
|
|
// instance button
|
|
|
|
if (pData->bSelectAllInstances) {
|
|
// disable instance list
|
|
EnableWindow(hWndInstanceListBox, FALSE);
|
|
}
|
|
else {
|
|
// set the default selection if there are entries in the
|
|
// list box and use the correct message depending on the
|
|
// selection options
|
|
if ((dwInstanceCount > 0) && (SendMessageW(hWndInstanceListBox, LB_GETCOUNT, 0, 0) != LB_ERR)) {
|
|
if (pData->bSelectMultipleCounters) {
|
|
SendMessageW(hWndInstanceListBox, LB_SETSEL, TRUE, 0);
|
|
}
|
|
else {
|
|
SendMessageW(hWndInstanceListBox, LB_SETCURSEL, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// there are no instances of this counter so display the
|
|
// string and disable the buttons and the list box
|
|
EnableWindow(hWndInstanceListBox, FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ALL_INSTANCES), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_USE_INSTANCE_LIST), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
|
|
}
|
|
}
|
|
else {
|
|
// unable to retrieve the counters and instances so
|
|
// clear and then...
|
|
SendMessageW(hWndCounterListBox, LB_RESETCONTENT, 0, 0);
|
|
SendMessageW(hWndInstanceListBox, LB_RESETCONTENT, 0, 0);
|
|
// disable the windows
|
|
szMsg = GetStringResource(IDS_BRWS_NO_INSTANCES);
|
|
if (szMsg != NULL) {
|
|
SendMessageW(hWndInstanceListBox, LB_ADDSTRING, 0, (LPARAM) szMsg);
|
|
G_FREE(szMsg);
|
|
}
|
|
szMsg = GetStringResource(IDS_BRWS_NO_COUNTERS);
|
|
if (szMsg != NULL) {
|
|
SendMessageW(hWndCounterListBox, LB_ADDSTRING, 0, (LPARAM) szMsg);
|
|
G_FREE(szMsg);
|
|
}
|
|
EnableWindow(hWndInstanceListBox, FALSE);
|
|
EnableWindow(hWndCounterListBox, FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ALL_INSTANCES), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_USE_INSTANCE_LIST), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
|
|
}
|
|
bReturn = TRUE;
|
|
|
|
Cleanup:
|
|
// restore the cursor to it's original shape
|
|
SetCursor(hOldCursor);
|
|
|
|
G_FREE(szMachineName);
|
|
G_FREE(szObjectName);
|
|
G_FREE(szDefaultCounter);
|
|
G_FREE(szInstanceString);
|
|
G_FREE(mszCounterList);
|
|
G_FREE(mszInstanceList);
|
|
|
|
// return status
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_PDH_FUNCTION
|
|
PdhiCompileSelectedObjectsT(
|
|
HWND hDlg,
|
|
LPVOID pUsersPathBuffer,
|
|
DWORD cchUsersPathLength,
|
|
BOOL bUnicode
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Scans the selected objects, counter, instances and builds a multi-SZ
|
|
string containing the expanded path of all the selections, unless
|
|
the wild card syntax is specified.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle of Dialog containing the controls
|
|
IN LPVOID pUsersPathBuffer
|
|
pointer to the caller's buffer that will receive the MSZ string
|
|
IN DWORD cchUsersPathLength
|
|
size of caller's buffer in characters
|
|
IN BOOL bUnicode
|
|
size of characters to return: TRUE = WCHAR, FALSE = CHAR
|
|
|
|
Return Value:
|
|
WIN32 Status of function completion
|
|
ERROR_SUCCESS if successful
|
|
--*/
|
|
{
|
|
LPWSTR lszMachineName = NULL;
|
|
LPWSTR lszObjectName = NULL;
|
|
DWORD dwObjectName = 0;
|
|
LPWSTR szWorkBuffer = NULL;
|
|
DWORD dwWorkBuffer = 0;
|
|
LRESULT iNumEntries;
|
|
int iThisEntry;
|
|
LRESULT iCurSelState;
|
|
LRESULT iTextLen;
|
|
LRESULT dwObjectFlags;
|
|
DWORD dwBufferRemaining;
|
|
DWORD dwSize1;
|
|
PDH_COUNTER_PATH_ELEMENTS_W lszPath;
|
|
LPVOID szCounterStart;
|
|
PDH_STATUS pdhStatus = ERROR_SUCCESS;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
|
|
// get pointer to dialog user data
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA) GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData == NULL) {
|
|
pdhStatus = PDH_NO_DIALOG_DATA;
|
|
goto Cleanup;
|
|
}
|
|
|
|
// clear user's string
|
|
if (pUsersPathBuffer != NULL) {
|
|
// clear first four bytes of string
|
|
* ((LPDWORD) pUsersPathBuffer) = 0;
|
|
dwBufferRemaining = cchUsersPathLength;
|
|
szCounterStart = pUsersPathBuffer;
|
|
}
|
|
else {
|
|
pdhStatus = PDH_INVALID_BUFFER; // no point in continuing if the caller doesn't have a buffer
|
|
goto Cleanup;
|
|
}
|
|
|
|
// each counter path string is built by setting the elements of
|
|
// the counter data structure and then calling the MakeCounterPath
|
|
// function to build the string
|
|
// build base string using selected machine & objects from list
|
|
|
|
if (pData->bIncludeMachineInPath) {
|
|
lszMachineName = PdhiGetDlgText(hDlg, IDC_MACHINE_COMBO);
|
|
if (lszMachineName == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
goto Cleanup;
|
|
}
|
|
lszPath.szMachineName = lszMachineName;
|
|
}
|
|
else {
|
|
lszPath.szMachineName = NULL;
|
|
}
|
|
|
|
// Get number of objects currently listed in the list box
|
|
|
|
iNumEntries = SendMessageW(GetDlgItem(hDlg, IDC_OBJECT_LIST), LB_GETCOUNT, 0, 0);
|
|
if (iNumEntries != LB_ERR) {
|
|
lszPath.szCounterName = (LPWSTR) cszSplat; // wildcard counter entry
|
|
lszPath.szParentInstance = NULL; // no parent instances
|
|
lszPath.dwInstanceIndex = ((DWORD) -1); // no index numbers
|
|
|
|
for (iThisEntry = 0; iThisEntry < iNumEntries; iThisEntry++) {
|
|
iCurSelState = SendMessageW(GetDlgItem(hDlg, IDC_OBJECT_LIST), LB_GETSEL, (WPARAM) iThisEntry, 0);
|
|
if (iCurSelState > 0) {
|
|
// then get the string and add it to the list
|
|
iTextLen = PdhiGetListText(hDlg, IDC_OBJECT_LIST, iThisEntry, & lszObjectName, & dwObjectName);
|
|
dwObjectFlags = SendMessage(GetDlgItem(hDlg, IDC_OBJECT_LIST),
|
|
LB_GETITEMDATA,
|
|
(WPARAM) iThisEntry,
|
|
0);
|
|
if (iTextLen != LB_ERR) {
|
|
if (lszObjectName != NULL) {
|
|
// build path elements
|
|
lszPath.szObjectName = lszObjectName;
|
|
if (dwObjectFlags & PDH_OBJECT_HAS_INSTANCES) {
|
|
lszPath.szInstanceName = (LPWSTR) cszSplat; // wildcard instance entry
|
|
}
|
|
else {
|
|
lszPath.szInstanceName = NULL; // no instance
|
|
}
|
|
dwSize1 = dwWorkBuffer;
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
G_FREE(szWorkBuffer);
|
|
dwWorkBuffer = dwSize1;
|
|
szWorkBuffer = G_ALLOC(dwWorkBuffer * sizeof(WCHAR));
|
|
if (szWorkBuffer == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
}
|
|
else {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
}
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
// add the string if there's room
|
|
pdhStatus = PdhiCopyString(
|
|
& ((LPBYTE) szCounterStart), szWorkBuffer, & dwBufferRemaining, bUnicode);
|
|
}
|
|
} // else, item isn't selected so skip
|
|
} // end for each item in the list box
|
|
|
|
if (bUnicode) {
|
|
* ((LPWSTR) szCounterStart) ++ = L'\0'; // terminate MSZ
|
|
}
|
|
else {
|
|
* ((LPSTR) szCounterStart) ++ = '\0'; // terminate MSZ
|
|
}
|
|
}
|
|
|
|
Cleanup:
|
|
G_FREE(lszMachineName);
|
|
G_FREE(lszObjectName);
|
|
G_FREE(szWorkBuffer);
|
|
return pdhStatus;
|
|
}
|
|
|
|
STATIC_PDH_FUNCTION
|
|
PdhiCompileSelectedObjectsW(
|
|
HWND hDlg,
|
|
LPWSTR szUsersPathBuffer,
|
|
DWORD cchUsersPathLength
|
|
)
|
|
{
|
|
return PdhiCompileSelectedObjectsT(hDlg, (LPVOID) szUsersPathBuffer, cchUsersPathLength, TRUE);
|
|
}
|
|
|
|
STATIC_PDH_FUNCTION
|
|
PdhiCompileSelectedObjectsA(
|
|
HWND hDlg,
|
|
LPSTR szUsersPathBuffer,
|
|
DWORD cchUsersPathLength
|
|
)
|
|
{
|
|
return PdhiCompileSelectedObjectsT(hDlg, (LPVOID) szUsersPathBuffer, cchUsersPathLength, FALSE);
|
|
}
|
|
|
|
STATIC_PDH_FUNCTION
|
|
PdhiCompileSelectedCountersT(
|
|
HWND hDlg,
|
|
LPVOID pUsersPathBuffer,
|
|
DWORD cchUsersPathLength,
|
|
BOOL bUnicode
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Scans the selected objects, counter, instances and builds a multi-SZ
|
|
string containing the expanded path of all the selections, unless
|
|
the wild card syntax is specified.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle of Dialog containing the controls
|
|
IN LPVOID pUsersPathBuffer
|
|
pointer to the caller's buffer that will receive the MSZ string
|
|
IN DWORD cchUsersPathLength
|
|
size of caller's buffer in characters
|
|
IN BOOL bUnicode
|
|
size of characters to return: TRUE = WCHAR, FALSE = CHAR
|
|
|
|
Return Value:
|
|
WIN32 Status of function completion
|
|
ERROR_SUCCESS if successful
|
|
--*/
|
|
{
|
|
LPWSTR lszMachineName = NULL;
|
|
LPWSTR lszObjectName = NULL;
|
|
LPWSTR lszFullInstance = NULL;
|
|
DWORD dwFullInstance = 0;
|
|
LPWSTR lszInstanceName = NULL;
|
|
DWORD dwInstanceName = 0;
|
|
LPWSTR lszParentInstance = NULL;
|
|
DWORD dwParentInstance = 0;
|
|
LPWSTR lszCounterName = NULL;
|
|
DWORD dwCounterName = 0;
|
|
LPWSTR szWorkBuffer = NULL;
|
|
DWORD dwWorkBuffer = 0;
|
|
DWORD dwBufferRemaining;
|
|
DWORD dwCountCounters;
|
|
DWORD dwThisCounter;
|
|
DWORD dwCountInstances;
|
|
DWORD dwThisInstance;
|
|
DWORD dwSize1;
|
|
DWORD dwSize2;
|
|
PDH_COUNTER_PATH_ELEMENTS_W lszPath;
|
|
LPVOID szCounterStart;
|
|
HWND hWndCounterList;
|
|
HWND hWndInstanceList;
|
|
BOOL bSel;
|
|
PDH_STATUS pdhStatus = ERROR_SUCCESS;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
LRESULT iTextLen;
|
|
|
|
// get pointer to dialog user data
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA) GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData == NULL) {
|
|
pdhStatus = PDH_NO_DIALOG_DATA;
|
|
goto Cleanup;
|
|
}
|
|
|
|
// clear user's string
|
|
if (pUsersPathBuffer != NULL) {
|
|
// clear first four bytes of string
|
|
* ((LPDWORD) pUsersPathBuffer) = 0;
|
|
dwBufferRemaining = cchUsersPathLength;
|
|
szCounterStart = pUsersPathBuffer;
|
|
}
|
|
else {
|
|
pdhStatus = PDH_INVALID_BUFFER; // no point in continuing if the caller doesn't have a buffer
|
|
goto Cleanup;
|
|
}
|
|
|
|
// each counter path string is built by setting the elements of
|
|
// the counter data structure and then calling the MakeCounterPath
|
|
// function to build the string
|
|
// build base string using selected machine and object
|
|
|
|
if (pData->bIncludeMachineInPath) {
|
|
lszMachineName = PdhiGetDlgText(hDlg, IDC_MACHINE_COMBO);
|
|
if (lszMachineName == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
goto Cleanup;
|
|
}
|
|
lszPath.szMachineName = lszMachineName;
|
|
}
|
|
else {
|
|
lszPath.szMachineName = NULL;
|
|
}
|
|
|
|
lszObjectName = PdhiGetDlgText(hDlg, IDC_OBJECT_COMBO);
|
|
if (lszObjectName == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
goto Cleanup;
|
|
}
|
|
lszPath.szObjectName = lszObjectName;
|
|
|
|
hWndCounterList = GetDlgItem(hDlg, IDC_COUNTER_LIST);
|
|
hWndInstanceList = GetDlgItem(hDlg, IDC_INSTANCE_LIST);
|
|
|
|
if (pData->bSelectMultipleCounters) {
|
|
if (pData->bWildCardInstances && pData->bSelectAllInstances) {
|
|
if (IsWindowEnabled(GetDlgItem(hDlg, IDC_ALL_INSTANCES))) {
|
|
// then this object has instances and we want ALL of them
|
|
lszPath.szInstanceName = (LPWSTR) cszSplat; // wildcard instances
|
|
lszPath.szParentInstance = NULL;
|
|
lszPath.dwInstanceIndex = (DWORD) -1;
|
|
}
|
|
else {
|
|
// this object has no instances
|
|
lszPath.szInstanceName = NULL;
|
|
lszPath.szParentInstance = NULL;
|
|
lszPath.dwInstanceIndex = (DWORD) -1;
|
|
}
|
|
// make a counter path for each selected counter
|
|
if (pData->bSelectAllCounters) {
|
|
lszPath.szCounterName = (LPWSTR) cszSplat; // wildcard counters
|
|
|
|
dwSize1 = dwWorkBuffer;
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
G_FREE(szWorkBuffer);
|
|
dwWorkBuffer = dwSize1;
|
|
szWorkBuffer = G_ALLOC(dwWorkBuffer * sizeof(WCHAR));
|
|
if (szWorkBuffer == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
}
|
|
}
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
// add the string if there's room
|
|
pdhStatus = PdhiCopyString(& ((LPBYTE) szCounterStart),
|
|
szWorkBuffer,
|
|
& dwBufferRemaining,
|
|
bUnicode);
|
|
}
|
|
}
|
|
else {
|
|
dwCountCounters = (DWORD)SendMessageW(hWndCounterList, LB_GETCOUNT, 0, 0);
|
|
for (dwThisCounter = 0; dwThisCounter < dwCountCounters; dwThisCounter++) {
|
|
if (SendMessageW(hWndCounterList, LB_GETSEL, (WPARAM) dwThisCounter, 0) > 0) {
|
|
iTextLen = PdhiGetListText(
|
|
hDlg, IDC_COUNTER_LIST, dwThisCounter, & lszCounterName, & dwCounterName);
|
|
if (iTextLen == LB_ERR) continue;
|
|
if (lszCounterName == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
goto Cleanup;
|
|
}
|
|
lszPath.szCounterName = lszCounterName;
|
|
dwSize1 = dwWorkBuffer;
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
G_FREE(szWorkBuffer);
|
|
dwWorkBuffer = dwSize1;
|
|
szWorkBuffer = G_ALLOC(dwWorkBuffer * sizeof(WCHAR));
|
|
if (szWorkBuffer == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
}
|
|
}
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
// add the string if there's room
|
|
pdhStatus = PdhiCopyString(& ((LPBYTE) szCounterStart),
|
|
szWorkBuffer,
|
|
& dwBufferRemaining,
|
|
bUnicode);
|
|
}
|
|
} // end if this counter was selected
|
|
} // end for each counter in object list box
|
|
}
|
|
}
|
|
else {
|
|
// get selected instances from list
|
|
dwCountCounters = (DWORD)SendMessageW(hWndCounterList, LB_GETCOUNT, 0, 0);
|
|
for (dwThisCounter = 0; dwThisCounter < dwCountCounters; dwThisCounter++) {
|
|
bSel = (BOOL) SendMessageW(hWndCounterList, LB_GETSEL, (WPARAM) dwThisCounter, 0);
|
|
if (bSel || pData->bSelectAllCounters) {
|
|
iTextLen = PdhiGetListText(
|
|
hDlg, IDC_COUNTER_LIST, dwThisCounter, & lszCounterName, & dwCounterName);
|
|
if (iTextLen == LB_ERR) continue;
|
|
if (lszCounterName == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
goto Cleanup;
|
|
}
|
|
lszPath.szCounterName = lszCounterName;
|
|
if (IsWindowEnabled(hWndInstanceList) || pData->bSelectAllInstances) {
|
|
dwCountInstances = (DWORD)SendMessageW(hWndInstanceList, LB_GETCOUNT, 0, 0);
|
|
for (dwThisInstance = 0; dwThisInstance < dwCountInstances; dwThisInstance++) {
|
|
if (SendMessageW(hWndInstanceList, LB_GETSEL, (WPARAM) dwThisInstance, 0)
|
|
|| pData->bSelectAllInstances) {
|
|
iTextLen = PdhiGetListText(
|
|
hDlg, IDC_INSTANCE_LIST, dwThisInstance, & lszFullInstance, & dwFullInstance);
|
|
if (iTextLen == LB_ERR) continue;
|
|
if (lszFullInstance == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
goto Cleanup;
|
|
}
|
|
lszPath.szInstanceName = lszFullInstance;
|
|
dwSize1 = dwInstanceName;
|
|
dwSize2 = dwParentInstance;
|
|
if (lszInstanceName != NULL) {
|
|
ZeroMemory(lszInstanceName, dwInstanceName * sizeof(WCHAR));
|
|
}
|
|
if (lszParentInstance != NULL) {
|
|
ZeroMemory(lszParentInstance, dwParentInstance * sizeof(WCHAR));
|
|
}
|
|
pdhStatus = PdhParseInstanceNameW(lszFullInstance,
|
|
lszInstanceName,
|
|
& dwSize1,
|
|
lszParentInstance,
|
|
& dwSize2,
|
|
& lszPath.dwInstanceIndex);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
if (dwSize1 > 0 && dwSize1 > dwInstanceName) {
|
|
G_FREE(lszInstanceName);
|
|
dwInstanceName = dwSize1;
|
|
lszInstanceName = G_ALLOC(dwInstanceName * sizeof(WCHAR));
|
|
if (lszInstanceName == NULL) pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
if (dwSize2 > 0 && dwSize2 > dwParentInstance) {
|
|
G_FREE(lszParentInstance);
|
|
dwParentInstance = dwSize2;
|
|
lszParentInstance = G_ALLOC(dwParentInstance * sizeof(WCHAR));
|
|
if (lszParentInstance == NULL) pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
if (pdhStatus != PDH_MEMORY_ALLOCATION_FAILURE) {
|
|
pdhStatus = PdhParseInstanceNameW(lszFullInstance,
|
|
lszInstanceName,
|
|
& dwSize1,
|
|
lszParentInstance,
|
|
& dwSize2,
|
|
& lszPath.dwInstanceIndex);
|
|
}
|
|
}
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
// parse instance name adds in the default index if one is
|
|
// not present. so if it's not wanted, this will remove it
|
|
if (!pData->bShowIndex) {
|
|
lszPath.dwInstanceIndex = (DWORD) -1;
|
|
}
|
|
else {
|
|
// only add in the instance # if it's not 0
|
|
if (lszPath.dwInstanceIndex == 0) {
|
|
lszPath.dwInstanceIndex = (DWORD) -1;
|
|
}
|
|
}
|
|
if (dwInstanceName > 1) {
|
|
lszPath.szInstanceName = lszInstanceName;
|
|
}
|
|
else {
|
|
lszPath.szInstanceName = NULL;
|
|
}
|
|
if (dwParentInstance > 1) {
|
|
lszPath.szParentInstance = lszParentInstance;
|
|
}
|
|
else {
|
|
lszPath.szParentInstance = NULL;
|
|
}
|
|
}
|
|
else {
|
|
// ignore the instances
|
|
lszPath.szInstanceName = NULL;
|
|
lszPath.szParentInstance = NULL;
|
|
}
|
|
|
|
dwSize1 = dwWorkBuffer;
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
G_FREE(szWorkBuffer);
|
|
dwWorkBuffer = dwSize1;
|
|
szWorkBuffer = G_ALLOC(dwWorkBuffer * sizeof(WCHAR));
|
|
if (szWorkBuffer == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
}
|
|
}
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
pdhStatus = PdhiCopyString(& ((LPBYTE) szCounterStart),
|
|
szWorkBuffer,
|
|
& dwBufferRemaining,
|
|
bUnicode);
|
|
}
|
|
} // end if instance is selected
|
|
} // end for each instance in list
|
|
}
|
|
else {
|
|
// this counter has no instances so process now
|
|
lszPath.szInstanceName = NULL;
|
|
lszPath.szParentInstance = NULL;
|
|
lszPath.dwInstanceIndex = (DWORD)-1;
|
|
|
|
dwSize1 = dwWorkBuffer;
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
G_FREE(szWorkBuffer);
|
|
dwWorkBuffer = dwSize1;
|
|
szWorkBuffer = G_ALLOC(dwWorkBuffer * sizeof(WCHAR));
|
|
if (szWorkBuffer == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
}
|
|
}
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
pdhStatus = PdhiCopyString(& ((LPBYTE) szCounterStart),
|
|
szWorkBuffer,
|
|
& dwBufferRemaining,
|
|
bUnicode);
|
|
}
|
|
} // end if counter has instances
|
|
} // else counter is not selected
|
|
} // end for each counter in list
|
|
}
|
|
} // end if not wild card instances
|
|
else {
|
|
dwThisCounter = (DWORD) SendMessageW(hWndCounterList, LB_GETCURSEL, 0, 0);
|
|
if (dwThisCounter == LB_ERR) {
|
|
// counter not found so select 0
|
|
dwThisCounter = 0;
|
|
}
|
|
iTextLen = PdhiGetListText(hDlg, IDC_COUNTER_LIST, dwThisCounter, & lszCounterName, & dwCounterName);
|
|
if (iTextLen == LB_ERR) {
|
|
pdhStatus = PDH_INVALID_DATA;
|
|
goto Cleanup;
|
|
}
|
|
else if (lszCounterName == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
goto Cleanup;
|
|
}
|
|
lszPath.szCounterName = lszCounterName;
|
|
|
|
// only single selections are allowed
|
|
if (pData->bWildCardInstances && pData->bSelectAllInstances) {
|
|
lszPath.szInstanceName = (LPWSTR) cszSplat; // wildcard instances
|
|
lszPath.szParentInstance = NULL;
|
|
lszPath.dwInstanceIndex = (DWORD) -1;
|
|
|
|
dwSize1 = dwWorkBuffer;
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
G_FREE(szWorkBuffer);
|
|
dwWorkBuffer = dwSize1;
|
|
szWorkBuffer = G_ALLOC(dwWorkBuffer * sizeof(WCHAR));
|
|
if (szWorkBuffer == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
}
|
|
}
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
pdhStatus = PdhiCopyString(& ((LPBYTE) szCounterStart),
|
|
szWorkBuffer,
|
|
& dwBufferRemaining,
|
|
bUnicode);
|
|
}
|
|
}
|
|
else {
|
|
// get selected instance from list
|
|
if (IsWindowEnabled(hWndInstanceList)) {
|
|
dwThisInstance = (DWORD)SendMessageW(hWndInstanceList, LB_GETCURSEL, 0, 0);
|
|
if (dwThisInstance == LB_ERR) {
|
|
// instance not found so select 0
|
|
dwThisInstance = 0;
|
|
}
|
|
iTextLen = PdhiGetListText(
|
|
hDlg, IDC_INSTANCE_LIST, dwThisInstance, & lszFullInstance, & dwFullInstance);
|
|
if (iTextLen == LB_ERR) {
|
|
pdhStatus = PDH_INVALID_DATA;
|
|
goto Cleanup;
|
|
}
|
|
else if (lszFullInstance == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
goto Cleanup;
|
|
}
|
|
lszPath.szCounterName = lszCounterName;
|
|
dwSize1 = dwInstanceName;
|
|
dwSize2 = dwParentInstance;
|
|
if (lszInstanceName != NULL) {
|
|
ZeroMemory(lszInstanceName, dwInstanceName * sizeof(WCHAR));
|
|
}
|
|
if (lszParentInstance != NULL) {
|
|
ZeroMemory(lszParentInstance, dwParentInstance * sizeof(WCHAR));
|
|
}
|
|
pdhStatus = PdhParseInstanceNameW(lszFullInstance,
|
|
lszInstanceName,
|
|
& dwSize1,
|
|
lszParentInstance,
|
|
& dwSize2,
|
|
& lszPath.dwInstanceIndex);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
if (dwSize1 > 0 && dwSize1 > dwInstanceName) {
|
|
G_FREE(lszInstanceName);
|
|
dwInstanceName = dwSize1;
|
|
lszInstanceName = G_ALLOC(dwInstanceName * sizeof(WCHAR));
|
|
if (lszInstanceName == NULL) pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
if (dwSize2 > 0 && dwSize2 > dwParentInstance) {
|
|
G_FREE(lszParentInstance);
|
|
dwParentInstance = dwSize2;
|
|
lszParentInstance = G_ALLOC(dwParentInstance * sizeof(WCHAR));
|
|
if (lszParentInstance == NULL) pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
if (pdhStatus != PDH_MEMORY_ALLOCATION_FAILURE) {
|
|
pdhStatus = PdhParseInstanceNameW(lszFullInstance,
|
|
lszInstanceName,
|
|
& dwSize1,
|
|
lszParentInstance,
|
|
& dwSize2,
|
|
& lszPath.dwInstanceIndex);
|
|
}
|
|
}
|
|
if (pdhStatus == ERROR_SUCCESS ) {
|
|
// parse instance name adds in the default index of one is
|
|
// not present. so if it's not wanted, this will remove it
|
|
if (!pData->bShowIndex) {
|
|
lszPath.dwInstanceIndex = (DWORD) -1;
|
|
}
|
|
// size values include trailing NULL char so
|
|
// strings must be > 1 char in length to have some
|
|
// text since a length of 1 would imply only a
|
|
// NULL character.
|
|
if (dwInstanceName > 1) {
|
|
lszPath.szInstanceName = lszInstanceName;
|
|
}
|
|
else {
|
|
lszPath.szInstanceName = NULL;
|
|
}
|
|
if (dwParentInstance > 1) {
|
|
lszPath.szParentInstance = lszParentInstance;
|
|
}
|
|
else {
|
|
lszPath.szParentInstance = NULL;
|
|
}
|
|
}
|
|
else {
|
|
// skip this instance
|
|
lszPath.szParentInstance = NULL;
|
|
lszPath.szInstanceName = NULL;
|
|
lszPath.dwInstanceIndex = (DWORD) -1;
|
|
}
|
|
}
|
|
else {
|
|
// this counter has no instances so process now
|
|
lszPath.szInstanceName = NULL;
|
|
lszPath.szParentInstance = NULL;
|
|
lszPath.dwInstanceIndex = (DWORD) -1;
|
|
} // end if counter has instances
|
|
|
|
dwSize1 = dwWorkBuffer;
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
G_FREE(szWorkBuffer);
|
|
dwWorkBuffer = dwSize1;
|
|
szWorkBuffer = G_ALLOC(dwWorkBuffer * sizeof(WCHAR));
|
|
if (szWorkBuffer == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
pdhStatus = PdhMakeCounterPathW(& lszPath, szWorkBuffer, & dwSize1, 0);
|
|
}
|
|
}
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
pdhStatus = PdhiCopyString(& ((LPBYTE) szCounterStart),
|
|
szWorkBuffer,
|
|
& dwBufferRemaining,
|
|
bUnicode);
|
|
}
|
|
} // end if not wild card instances
|
|
}
|
|
|
|
if (bUnicode) {
|
|
* ((LPWSTR) szCounterStart) ++ = L'\0'; // terminate MSZ
|
|
}
|
|
else {
|
|
* ((LPSTR) szCounterStart) ++ = '\0'; // terminate MSZ
|
|
}
|
|
|
|
Cleanup:
|
|
G_FREE(lszMachineName);
|
|
G_FREE(lszObjectName);
|
|
G_FREE(lszCounterName);
|
|
G_FREE(lszInstanceName);
|
|
G_FREE(lszParentInstance);
|
|
G_FREE(szWorkBuffer);
|
|
return pdhStatus;
|
|
}
|
|
|
|
STATIC_PDH_FUNCTION
|
|
PdhiCompileSelectedCountersW(
|
|
HWND hDlg,
|
|
LPWSTR szUsersPathBuffer,
|
|
DWORD cchUsersPathLength
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
UNICODE function wrapper for base function which scans the selected
|
|
objects, counter, instances and builds a multi-SZ string containing
|
|
the expanded path of all the selections, unless the wild card
|
|
syntax is specified.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle of Dialog containing the controls
|
|
IN LPWSTR szUsersPathBuffer
|
|
pointer to the caller's buffer that will receive the MSZ
|
|
wide characters string
|
|
IN DWORD cchUsersPathLength
|
|
size of caller's buffer in characters
|
|
|
|
Return Value:
|
|
WIN32 Status of function completion
|
|
ERROR_SUCCESS if successful
|
|
--*/
|
|
{
|
|
return PdhiCompileSelectedCountersT(hDlg, (LPVOID) szUsersPathBuffer, cchUsersPathLength, TRUE);
|
|
}
|
|
|
|
STATIC_PDH_FUNCTION
|
|
PdhiCompileSelectedCountersA(
|
|
HWND hDlg,
|
|
LPSTR szUsersPathBuffer,
|
|
DWORD cchUsersPathLength
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
ANSI function wrapper for base function which scans the selected
|
|
objects, counter, instances and builds a multi-SZ string containing
|
|
the expanded path of all the selections, unless the wild card
|
|
syntax is specified.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle of Dialog containing the controls
|
|
IN LPsSTR szUsersPathBuffer
|
|
pointer to the caller's buffer that will receive the MSZ
|
|
single-byte characters string
|
|
IN DWORD cchUsersPathLength
|
|
size of caller's buffer in characters
|
|
|
|
Return Value:
|
|
WIN32 Status of function completion
|
|
ERROR_SUCCESS if successful
|
|
--*/
|
|
{
|
|
return PdhiCompileSelectedCountersT(hDlg, (LPVOID) szUsersPathBuffer, cchUsersPathLength, FALSE);
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_MACHINE_COMBO(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows messags sent by the Machine selection combo box
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the control
|
|
IN WORD wNotifyMsg
|
|
Notification message sent by the control
|
|
IN HWND hWndControl
|
|
Window handle of the control sending the message
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
LPWSTR szNewMachineName = NULL;
|
|
DWORD dwNewMachineName = 0;
|
|
HWND hWndMachineCombo = hWndControl;
|
|
long lMatchIndex;
|
|
HCURSOR hOldCursor;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
BOOL bReturn = FALSE;
|
|
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA) GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData != NULL) {
|
|
switch (wNotifyMsg) {
|
|
case CBN_KILLFOCUS:
|
|
// the user has left the control so see if there's a new
|
|
// machine name that will need to be connected to and loaded
|
|
|
|
// display the wait cursor as this could take a while
|
|
hOldCursor = SetCursor(LoadCursor (NULL, IDC_WAIT));
|
|
|
|
// Get current combo box text
|
|
dwNewMachineName = GetWindowTextLength(hWndMachineCombo);
|
|
if (dwNewMachineName != 0) {
|
|
dwNewMachineName ++;
|
|
szNewMachineName = G_ALLOC(dwNewMachineName * sizeof(WCHAR));
|
|
if (szNewMachineName != NULL) {
|
|
GetWindowTextW(hWndMachineCombo, szNewMachineName, dwNewMachineName);
|
|
|
|
// see if it's in the combo box already
|
|
lMatchIndex = (long) SendMessageW(hWndMachineCombo,
|
|
CB_FINDSTRINGEXACT,
|
|
(WPARAM) -1,
|
|
(LPARAM) szNewMachineName);
|
|
// if name is in list, then select it and initialize the dialog
|
|
// update the current counter list & data block for this machine
|
|
// in the process.
|
|
if (lMatchIndex != CB_ERR) {
|
|
// this name is already in the list so see if it's the same as the last selected machine
|
|
if (lstrcmpiW(szNewMachineName, pData->szLastMachineName) != 0) {
|
|
// this is a different machine so update the display
|
|
SendMessageW(hWndMachineCombo, CB_SETCURSEL, (WPARAM) lMatchIndex, 0);
|
|
if (DataSourceTypeH(pData->pDlgData->hDataSource) != DATA_SOURCE_LOGFILE) {
|
|
if (PdhiLoadNewMachine(hDlg, szNewMachineName, FALSE)) {
|
|
// display explain text if necessary
|
|
SendMessageW(hDlg,
|
|
WM_COMMAND,
|
|
MAKEWPARAM(IDC_COUNTER_LIST, LBN_SELCHANGE),
|
|
(LPARAM) GetDlgItem(hDlg, IDC_COUNTER_LIST));
|
|
StringCchCopyW(pData->szLastMachineName, MAX_PATH, szNewMachineName);
|
|
}
|
|
}
|
|
else {
|
|
PdhiLoadMachineObjects(hDlg, TRUE);
|
|
PdhiLoadCountersAndInstances(hDlg);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (PdhiLoadNewMachine(hDlg, szNewMachineName, TRUE)) {
|
|
// new machine loaded and selected so save the name.
|
|
StringCchCopyW(pData->szLastMachineName, MAX_PATH, szNewMachineName);
|
|
}
|
|
}
|
|
G_FREE(szNewMachineName);
|
|
}
|
|
}
|
|
SetCursor (hOldCursor);
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_MACHINE_BUTTON(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows message that occurs when one of the
|
|
machine context selection buttons in pressed in the dialog
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the button controls
|
|
IN WORD wNotifyMsg
|
|
Notification message sent by the button
|
|
IN HWND hWndControl
|
|
Window handle of the control sending the message
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
BOOL bMode;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
HWND hWndMachineCombo;
|
|
BOOL bReturn = FALSE;
|
|
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA)GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData != NULL) {
|
|
switch (wNotifyMsg) {
|
|
case BN_CLICKED:
|
|
// select the current display and processing mode based
|
|
// on the button that his currently checked.
|
|
bMode = ! (BOOL) IsDlgButtonChecked(hDlg, IDC_USE_LOCAL_MACHINE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_MACHINE_COMBO), bMode);
|
|
if (! bMode) {
|
|
hWndMachineCombo = GetDlgItem(hDlg, IDC_MACHINE_COMBO);
|
|
// then this is a Local machine query so
|
|
// make sure the machine name is set to the local machine
|
|
SetWindowTextW(hWndMachineCombo, szStaticLocalMachineName);
|
|
PdhiBrowseCtrDlg_MACHINE_COMBO(hDlg, CBN_KILLFOCUS, hWndMachineCombo);
|
|
}
|
|
pData->bIncludeMachineInPath = bMode;
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_OBJECT_COMBO(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows messags sent by the Object selection combo box.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the control
|
|
IN WORD wNotifyMsg
|
|
Notification message sent by the control
|
|
IN HWND hWndControl
|
|
Window handle of the control sending the message
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
|
|
switch (wNotifyMsg) {
|
|
case CBN_SELCHANGE:
|
|
PdhiLoadCountersAndInstances(hDlg);
|
|
SendMessageW(hDlg,
|
|
WM_COMMAND,
|
|
MAKEWPARAM(IDC_COUNTER_LIST, LBN_SELCHANGE),
|
|
(LPARAM) GetDlgItem(hDlg, IDC_COUNTER_LIST));
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_COUNTER_LIST(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows messags sent by the Object selection combo box.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the control
|
|
IN WORD wNotifyMsg
|
|
Notification message sent by the control
|
|
IN HWND hWndControl
|
|
Window handle of the control sending the message
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
LPWSTR szMachineName = NULL;
|
|
LPWSTR szObjectName = NULL;
|
|
LPWSTR szCounterName = NULL;
|
|
LPWSTR szDisplayString = NULL;
|
|
LRESULT lDisplayString;
|
|
DWORD dwDisplayString;
|
|
LPWSTR szExplainText = NULL;
|
|
WCHAR szNullDisplay[1];
|
|
BOOL bFreeExplain = FALSE;
|
|
LONG lIndex;
|
|
BOOL bReturn = FALSE;
|
|
|
|
UNREFERENCED_PARAMETER (hWndControl);
|
|
switch (wNotifyMsg) {
|
|
case LBN_SELCHANGE:
|
|
bReturn = TRUE;
|
|
if (hExplainDlg != NULL) {
|
|
szMachineName = PdhiGetDlgText(hDlg, IDC_MACHINE_COMBO);
|
|
szObjectName = PdhiGetDlgText(hDlg, IDC_OBJECT_COMBO);
|
|
if (szMachineName == NULL || szObjectName == NULL) break;
|
|
|
|
lIndex = (LONG) SendDlgItemMessageW(hDlg, IDC_COUNTER_LIST, LB_GETCARETINDEX, 0, 0);
|
|
if (lIndex != LB_ERR) {
|
|
lDisplayString = SendDlgItemMessageW(hDlg, IDC_COUNTER_LIST, LB_GETTEXTLEN, (WPARAM) lIndex, 0L);
|
|
if (lDisplayString != LB_ERR) {
|
|
szCounterName = G_ALLOC(sizeof(WCHAR) * ((DWORD) lDisplayString + 1));
|
|
if (szCounterName == NULL) break;
|
|
|
|
lIndex = (LONG) SendDlgItemMessageW(
|
|
hDlg, IDC_COUNTER_LIST, LB_GETTEXT, (WPARAM) lIndex, (LPARAM) szCounterName);
|
|
|
|
if (dwPdhiLocalDefaultDataSource == DATA_SOURCE_WBEM) {
|
|
PDH_STATUS Status = PDH_MORE_DATA;
|
|
DWORD dwExplain = 0;
|
|
|
|
szExplainText = NULL;
|
|
while (Status == PDH_MORE_DATA) {
|
|
dwExplain += MAX_PATH;
|
|
G_FREE(szExplainText);
|
|
szExplainText = G_ALLOC(dwExplain * sizeof(WCHAR));
|
|
if (szExplainText == NULL) {
|
|
bFreeExplain = FALSE;
|
|
Status = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
bFreeExplain = TRUE;
|
|
Status = PdhiGetWbemExplainText(szMachineName,
|
|
szObjectName,
|
|
szCounterName,
|
|
szExplainText,
|
|
& dwExplain);
|
|
}
|
|
}
|
|
if (Status != ERROR_SUCCESS) {
|
|
if (bFreeExplain) {
|
|
bFreeExplain = FALSE;
|
|
G_FREE(szExplainText);
|
|
}
|
|
szExplainText = NULL;
|
|
}
|
|
}
|
|
else {
|
|
szExplainText = PdhiGetExplainText(szMachineName, szObjectName, szCounterName);
|
|
}
|
|
dwDisplayString = lstrlenW(szMachineName) + lstrlenW(szObjectName) + lstrlenW(szCounterName) + 3;
|
|
szDisplayString = G_ALLOC(dwDisplayString * sizeof(WCHAR));
|
|
if (szDisplayString != NULL) {
|
|
StringCchPrintfW(szDisplayString,
|
|
dwDisplayString,
|
|
L"%ws\\%ws\\%ws",
|
|
szMachineName,
|
|
szObjectName,
|
|
szCounterName);
|
|
}
|
|
else {
|
|
szNullDisplay[0] = L'\0';
|
|
szDisplayString = szNullDisplay;
|
|
}
|
|
}
|
|
else {
|
|
szExplainText = NULL;
|
|
szNullDisplay[0] = L'\0';
|
|
szDisplayString = szNullDisplay;
|
|
}
|
|
}
|
|
else {
|
|
szExplainText = NULL;
|
|
szNullDisplay[0] = L'\0';
|
|
szDisplayString = szNullDisplay;
|
|
}
|
|
SendMessageW(hExplainDlg, EDM_UPDATE_EXPLAIN_TEXT, 0, (LPARAM) szExplainText);
|
|
SendMessageW(hExplainDlg, EDM_UPDATE_TITLE_TEXT, 0, (LPARAM) szDisplayString);
|
|
}
|
|
}
|
|
|
|
G_FREE(szMachineName);
|
|
G_FREE(szObjectName);
|
|
G_FREE(szCounterName);
|
|
if (szDisplayString != szNullDisplay) G_FREE(szDisplayString);
|
|
if (bFreeExplain) G_FREE(szExplainText);
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_OBJECT_LIST(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Processes the windows messags sent by the Object selection combo box.
|
|
|
|
Arguments:
|
|
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the control
|
|
|
|
IN WORD wNotifyMsg
|
|
Notification message sent by the control
|
|
|
|
IN HWND hWndControl
|
|
Window handle of the control sending the message
|
|
|
|
Return Value:
|
|
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
|
|
--*/
|
|
{
|
|
LPWSTR szMachineName = NULL;
|
|
LPWSTR szObjectName = NULL;
|
|
LPWSTR szDisplayString = NULL;
|
|
LRESULT lDisplayString;
|
|
DWORD dwDisplayString;
|
|
LPWSTR szExplainText = NULL;
|
|
WCHAR szNullDisplay[1];
|
|
BOOL bFreeExplain = FALSE;
|
|
LONG lIndex;
|
|
BOOL bReturn = FALSE;
|
|
|
|
UNREFERENCED_PARAMETER (hWndControl);
|
|
|
|
switch (wNotifyMsg) {
|
|
case LBN_SELCHANGE:
|
|
bReturn = TRUE;
|
|
if (hExplainDlg != NULL) {
|
|
szMachineName = PdhiGetDlgText(hDlg, IDC_MACHINE_COMBO);
|
|
if (szMachineName == NULL) break;
|
|
|
|
lIndex = (LONG) SendDlgItemMessageW(hDlg, IDC_OBJECT_LIST, LB_GETCARETINDEX, 0, 0);
|
|
if (lIndex != LB_ERR) {
|
|
lDisplayString = SendDlgItemMessageW(hDlg, IDC_OBJECT_LIST, LB_GETTEXTLEN, (WPARAM) lIndex, 0L);
|
|
if (lDisplayString != LB_ERR) {
|
|
szObjectName = G_ALLOC(sizeof(WCHAR) * ((DWORD) lDisplayString + 1));
|
|
if (szObjectName == NULL) break;
|
|
|
|
lIndex = (LONG) SendDlgItemMessageW(
|
|
hDlg, IDC_OBJECT_LIST, LB_GETTEXT, (WPARAM) lIndex, (LPARAM) szObjectName);
|
|
|
|
if (dwPdhiLocalDefaultDataSource == DATA_SOURCE_WBEM) {
|
|
PDH_STATUS Status = PDH_MORE_DATA;
|
|
DWORD dwExplain = 0;
|
|
|
|
szExplainText = NULL;
|
|
while (Status == PDH_MORE_DATA) {
|
|
dwExplain += MAX_PATH;
|
|
G_FREE(szExplainText);
|
|
szExplainText = G_ALLOC(dwExplain * sizeof(WCHAR));
|
|
if (szExplainText == NULL) {
|
|
bFreeExplain = FALSE;
|
|
Status = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
bFreeExplain = TRUE;
|
|
Status = PdhiGetWbemExplainText(szMachineName,
|
|
szObjectName,
|
|
NULL,
|
|
szExplainText,
|
|
& dwExplain);
|
|
}
|
|
}
|
|
if (Status != ERROR_SUCCESS) {
|
|
if (bFreeExplain) {
|
|
bFreeExplain = FALSE;
|
|
G_FREE(szExplainText);
|
|
}
|
|
szExplainText = NULL;
|
|
}
|
|
}
|
|
else {
|
|
szExplainText = PdhiGetExplainText( szMachineName, szObjectName, NULL);
|
|
}
|
|
|
|
dwDisplayString = lstrlenW(szMachineName) + lstrlenW(szObjectName) + 2;
|
|
szDisplayString = G_ALLOC(dwDisplayString * sizeof(WCHAR));
|
|
if (szDisplayString != NULL) {
|
|
StringCchPrintfW(szDisplayString, dwDisplayString, L"%ws\\%ws", szMachineName, szObjectName);
|
|
}
|
|
else {
|
|
szNullDisplay[0] = L'\0';
|
|
szDisplayString = szNullDisplay;
|
|
}
|
|
}
|
|
else {
|
|
szExplainText = NULL;
|
|
szNullDisplay[0] = L'\0';
|
|
szDisplayString = szNullDisplay;
|
|
}
|
|
}
|
|
else {
|
|
szExplainText = NULL;
|
|
szNullDisplay[0] = L'\0';
|
|
szDisplayString = szNullDisplay;
|
|
}
|
|
SendMessageW(hExplainDlg, EDM_UPDATE_EXPLAIN_TEXT, 0, (LPARAM) szExplainText);
|
|
SendMessageW(hExplainDlg, EDM_UPDATE_TITLE_TEXT, 0, (LPARAM) szDisplayString);
|
|
}
|
|
}
|
|
|
|
G_FREE(szMachineName);
|
|
G_FREE(szObjectName);
|
|
if (szDisplayString != szNullDisplay) G_FREE(szDisplayString);
|
|
if (bFreeExplain) G_FREE(szExplainText);
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_DETAIL_COMBO(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows messags sent by the Detail Level Combo box.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the control
|
|
IN WORD wNotifyMsg
|
|
Notification message sent by the control
|
|
IN HWND hWndControl
|
|
Window handle of the control sending the message
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
DWORD dwCurSel;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
BOOL bReturn = FALSE;
|
|
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA) GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData != NULL) {
|
|
switch (wNotifyMsg) {
|
|
case CBN_SELCHANGE:
|
|
dwCurSel = (DWORD) SendMessageW(hWndControl, CB_GETCURSEL, 0, 0);
|
|
if (dwCurSel != CB_ERR) {
|
|
pData->dwCurrentDetailLevel = (DWORD) SendMessageW(hWndControl,
|
|
CB_GETITEMDATA,
|
|
(WPARAM) dwCurSel,
|
|
0);
|
|
// update all the windows to show the new level
|
|
PdhiLoadMachineObjects(hDlg, FALSE);
|
|
PdhiLoadCountersAndInstances(hDlg);
|
|
// display explain text if necessary
|
|
SendMessageW(hDlg,
|
|
WM_COMMAND,
|
|
MAKEWPARAM(IDC_COUNTER_LIST, LBN_SELCHANGE),
|
|
(LPARAM) GetDlgItem(hDlg, IDC_COUNTER_LIST));
|
|
}
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_INSTANCE_BUTTON(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows messags sent by the Instance configuration
|
|
selection buttons
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the control
|
|
IN WORD wNotifyMsg
|
|
Notification message sent by the control
|
|
IN HWND hWndControl
|
|
Window handle of the control sending the message
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
BOOL bMode;
|
|
HWND hWndInstanceList;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
BOOL bReturn = FALSE;
|
|
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA) GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData != NULL) {
|
|
switch (wNotifyMsg) {
|
|
case BN_CLICKED:
|
|
bMode = (BOOL) IsDlgButtonChecked(hDlg, IDC_ALL_INSTANCES);
|
|
hWndInstanceList = GetDlgItem(hDlg, IDC_INSTANCE_LIST);
|
|
// if "Select ALL" then clear list box selections and disable
|
|
// the list box
|
|
if (bMode) {
|
|
SendMessageW(hWndInstanceList, LB_SETSEL, FALSE, (LPARAM) -1);
|
|
}
|
|
else {
|
|
LRESULT dwCountInstance = SendMessage(hWndInstanceList, LB_GETCOUNT, 0, 0);
|
|
LRESULT dwThisInstance = 0;
|
|
BOOL bSelection = FALSE;
|
|
|
|
for (dwThisInstance = 0; ! bSelection && dwThisInstance < dwCountInstance; dwThisInstance ++) {
|
|
bSelection = (BOOL) SendMessage(hWndInstanceList, LB_GETSEL, (WPARAM) dwThisInstance, 0);
|
|
}
|
|
if (! bSelection) {
|
|
SendMessageW(hWndInstanceList, LB_SETSEL, TRUE, (LPARAM) 0);
|
|
}
|
|
}
|
|
EnableWindow(hWndInstanceList, !bMode);
|
|
pData->bSelectAllInstances = bMode;
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_COUNTER_BUTTON(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows messags sent by the Instance configuration
|
|
selection buttons
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the control
|
|
IN WORD wNotifyMsg
|
|
Notification message sent by the control
|
|
IN HWND hWndControl
|
|
Window handle of the control sending the message
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
BOOL bMode;
|
|
HWND hWndCounterList;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
BOOL bReturn = FALSE;
|
|
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA)GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData != NULL) {
|
|
switch (wNotifyMsg) {
|
|
case BN_CLICKED:
|
|
bMode = (BOOL) IsDlgButtonChecked(hDlg, IDC_ALL_COUNTERS);
|
|
hWndCounterList = GetDlgItem(hDlg, IDC_COUNTER_LIST);
|
|
// if "Select ALL" then clear list box selections and disable
|
|
// the list box
|
|
if (bMode) {
|
|
SendMessageW(hWndCounterList, LB_SETSEL, FALSE, (LPARAM) -1);
|
|
}
|
|
else {
|
|
LRESULT dwCountCounter = SendMessage(hWndCounterList, LB_GETCOUNT, 0, 0);
|
|
LRESULT dwThisCounter = 0;
|
|
BOOL bSelection = FALSE;
|
|
|
|
for (dwThisCounter = 0; ! bSelection && dwThisCounter < dwCountCounter; dwThisCounter ++) {
|
|
bSelection = (BOOL) SendMessage(hWndCounterList, LB_GETSEL, (WPARAM) dwThisCounter, 0);
|
|
}
|
|
if (! bSelection) {
|
|
PDH_STATUS pdhStatus = ERROR_SUCCESS;
|
|
DWORD dwCounterName = 0;
|
|
DWORD dwCounterIndex = 0;
|
|
LPWSTR szMachineName = PdhiGetDlgText(hDlg, IDC_MACHINE_COMBO);
|
|
LPWSTR szObjectName = PdhiGetDlgText(hDlg, IDC_OBJECT_COMBO);
|
|
LPWSTR szCounterName = NULL;
|
|
|
|
if (szMachineName != NULL && szObjectName != NULL) {
|
|
pdhStatus = PdhGetDefaultPerfCounterHW(pData->pDlgData->hDataSource,
|
|
szMachineName,
|
|
szObjectName,
|
|
szCounterName,
|
|
& dwCounterName);
|
|
while (pdhStatus == PDH_MORE_DATA) {
|
|
G_FREE(szCounterName);
|
|
szCounterName = G_ALLOC(dwCounterName * sizeof(WCHAR));
|
|
if (szCounterName == NULL) {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
else {
|
|
pdhStatus = PdhGetDefaultPerfCounterHW(pData->pDlgData->hDataSource,
|
|
szMachineName,
|
|
szObjectName,
|
|
szCounterName,
|
|
& dwCounterName);
|
|
}
|
|
}
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
dwCounterIndex = (DWORD) SendMessageW(hWndCounterList,
|
|
LB_FINDSTRINGEXACT,
|
|
(WPARAM) -1,
|
|
(LPARAM) szCounterName);
|
|
if (dwCounterIndex == LB_ERR) {
|
|
dwCounterIndex = 0;
|
|
}
|
|
SendMessageW(hWndCounterList, LB_SETSEL, TRUE, (LPARAM) dwCounterIndex);
|
|
}
|
|
}
|
|
G_FREE(szMachineName);
|
|
G_FREE(szObjectName);
|
|
G_FREE(szCounterName);
|
|
}
|
|
}
|
|
EnableWindow(hWndCounterList, !bMode);
|
|
pData->bSelectAllCounters = bMode;
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
#pragma warning ( disable : 4127 )
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_OK(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the currently selected counter and instance strings to
|
|
build a list of selected paths strings in the user's supplied
|
|
buffer. This buffer will either be processed by a call back
|
|
string or the dialog box will be terminated allowing the
|
|
calling function to continue processing the returned strings.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the button controls
|
|
IN WORD wNotifyMsg
|
|
Notification message sent by the button
|
|
IN HWND hWndControl
|
|
Window handle of the control sending the message
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
HCURSOR hOldCursor;
|
|
CounterPathCallBack pCallBack;
|
|
DWORD_PTR dwArg;
|
|
PDH_STATUS pdhStatus;
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
PPDHI_BROWSE_DLG_INFO pDlgData;
|
|
HWND hWndFocus;
|
|
HWND hWndMachine;
|
|
BOOL bReturn = FALSE;
|
|
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA) GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData == NULL) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
pDlgData = pData->pDlgData;
|
|
hWndFocus = GetFocus();
|
|
hWndMachine = GetDlgItem(hDlg, IDC_MACHINE_COMBO);
|
|
|
|
if (hWndFocus == hWndMachine) {
|
|
//special case to make sure the dialog has the current machine data
|
|
PdhiBrowseCtrDlg_MACHINE_COMBO(hDlg, CBN_KILLFOCUS, hWndMachine);
|
|
SetFocus(hWndControl);
|
|
}
|
|
|
|
switch (wNotifyMsg) {
|
|
case BN_CLICKED:
|
|
// display wait cursor while this is being processed
|
|
hOldCursor = SetCursor (LoadCursor (NULL, IDC_WAIT));
|
|
|
|
while (TRUE) {
|
|
if (pData->bShowObjects) {
|
|
// then return object spec(s) using selected perf objects
|
|
if (pDlgData->pWideStruct != NULL) {
|
|
// use wide character function
|
|
pdhStatus = PdhiCompileSelectedObjectsW(hDlg,
|
|
pDlgData->pWideStruct->szReturnPathBuffer,
|
|
pDlgData->pWideStruct->cchReturnPathLength);
|
|
pCallBack = pDlgData->pWideStruct->pCallBack;
|
|
dwArg = pDlgData->pWideStruct->dwCallBackArg;
|
|
pDlgData->pWideStruct->CallBackStatus = pdhStatus;
|
|
}
|
|
else if (pDlgData->pAnsiStruct != NULL) {
|
|
// use ansi char functions
|
|
pdhStatus = PdhiCompileSelectedObjectsA(hDlg,
|
|
pDlgData->pAnsiStruct->szReturnPathBuffer,
|
|
pDlgData->pAnsiStruct->cchReturnPathLength);
|
|
pCallBack = pDlgData->pAnsiStruct->pCallBack;
|
|
dwArg = pDlgData->pAnsiStruct->dwCallBackArg;
|
|
pDlgData->pAnsiStruct->CallBackStatus = pdhStatus;
|
|
}
|
|
else {
|
|
// do nothing
|
|
pCallBack = NULL;
|
|
dwArg = 0;
|
|
}
|
|
}
|
|
else {
|
|
// return selected counters & instances
|
|
// process these string until it works. (note, this
|
|
// could cause an infinite loop if the callback
|
|
// function is not working correctly (i.e. always
|
|
// returning PDH_RETRY, for example)
|
|
if (pDlgData->pWideStruct != NULL) {
|
|
// use wide character function
|
|
pdhStatus = PdhiCompileSelectedCountersW(hDlg,
|
|
pDlgData->pWideStruct->szReturnPathBuffer,
|
|
pDlgData->pWideStruct->cchReturnPathLength);
|
|
pCallBack = pDlgData->pWideStruct->pCallBack;
|
|
dwArg = pDlgData->pWideStruct->dwCallBackArg;
|
|
pDlgData->pWideStruct->CallBackStatus = pdhStatus;
|
|
}
|
|
else if (pDlgData->pAnsiStruct != NULL) {
|
|
// use ansi char functions
|
|
pdhStatus = PdhiCompileSelectedCountersA(hDlg,
|
|
pDlgData->pAnsiStruct->szReturnPathBuffer,
|
|
pDlgData->pAnsiStruct->cchReturnPathLength);
|
|
pCallBack = pDlgData->pAnsiStruct->pCallBack;
|
|
dwArg = pDlgData->pAnsiStruct->dwCallBackArg;
|
|
pDlgData->pAnsiStruct->CallBackStatus = pdhStatus;
|
|
}
|
|
else {
|
|
// do nothing
|
|
pCallBack = NULL;
|
|
dwArg = 0;
|
|
}
|
|
|
|
}
|
|
if (pCallBack != NULL) {
|
|
pdhStatus = (* pCallBack)(dwArg);
|
|
}
|
|
else {
|
|
pdhStatus = ERROR_SUCCESS;
|
|
}
|
|
|
|
// see if the callback wants to try again
|
|
if (pdhStatus != PDH_RETRY) {
|
|
break;
|
|
}
|
|
} // end while (retry loop)
|
|
|
|
// if the caller only wants to give the user ONE chance to
|
|
// add counters, then end the dialog now.
|
|
if (! pData->bAddMultipleCounters) {
|
|
EndDialog(hDlg, IDOK);
|
|
}
|
|
else {
|
|
SetFocus(hWndFocus);
|
|
}
|
|
SetCursor(hOldCursor);
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
Cleanup:
|
|
return bReturn;
|
|
}
|
|
#pragma warning ( default : 4127 )
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_CANCEL(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows messages that occur when the cancel button
|
|
is pressed.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the button controls
|
|
IN WORD wNotifyMsg
|
|
Notification message sent by the button
|
|
IN HWND hWndControl
|
|
Window handle of the control sending the message
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
UNREFERENCED_PARAMETER (hWndControl);
|
|
|
|
switch (wNotifyMsg) {
|
|
case BN_CLICKED:
|
|
EndDialog (hDlg, IDCANCEL);
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_EXPLAIN_BTN(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows message that occurs when the help button
|
|
is pressed. (This feature is not currently implemented)
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the button controls
|
|
IN WORD wNotifyMsg
|
|
Notification message sent by the button
|
|
IN HWND hWndControl
|
|
Window handle of the control sending the message
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
HWND hFocusWnd;
|
|
PPDHI_BROWSE_DIALOG_DATA pData = (PPDHI_BROWSE_DIALOG_DATA) GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
|
|
UNREFERENCED_PARAMETER(wNotifyMsg);
|
|
if (hExplainDlg == NULL) {
|
|
if (pData->bShowObjects) {
|
|
hFocusWnd = GetDlgItem(hDlg, IDC_OBJECT_LIST);
|
|
}
|
|
else {
|
|
hFocusWnd = GetDlgItem(hDlg, IDC_COUNTER_LIST);
|
|
}
|
|
if (hFocusWnd == NULL || hFocusWnd == INVALID_HANDLE_VALUE) {
|
|
hFocusWnd = GetFocus();
|
|
}
|
|
|
|
// create a modeless dialog to display the explain text
|
|
hExplainDlg = CreateDialogW(ThisDLLHandle,
|
|
MAKEINTRESOURCEW(IDD_EXPLAIN_DLG),
|
|
hDlg,
|
|
ExplainTextDlgProc);
|
|
|
|
SetFocus(hFocusWnd);
|
|
EnableWindow(hWndControl, FALSE);
|
|
}
|
|
if (pData->bShowObjects) {
|
|
SendMessageW(hDlg,
|
|
WM_COMMAND,
|
|
MAKEWPARAM(IDC_OBJECT_LIST, LBN_SELCHANGE),
|
|
(LPARAM) GetDlgItem(hDlg, IDC_OBJECT_LIST));
|
|
}
|
|
else {
|
|
SendMessageW(hDlg,
|
|
WM_COMMAND,
|
|
MAKEWPARAM(IDC_COUNTER_LIST, LBN_SELCHANGE),
|
|
(LPARAM) GetDlgItem(hDlg, IDC_COUNTER_LIST));
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_HELP_BTN(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows message that occurs when the network button
|
|
is pressed. (This feature is not currently implemented)
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the button controls
|
|
IN WORD wNotifyMsg
|
|
Notification message sent by the button
|
|
IN HWND hWndControl
|
|
Window handle of the control sending the message
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
LPWSTR szMsg;
|
|
|
|
UNREFERENCED_PARAMETER(wNotifyMsg);
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
|
|
szMsg = GetStringResource(IDS_ERR_NO_HELP);
|
|
if (szMsg != NULL) {
|
|
MessageBoxW(hDlg, szMsg, szMsg, MB_OK);
|
|
G_FREE(szMsg);
|
|
}
|
|
else {
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_WM_INITDIALOG(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows message that occurs just before the dialog
|
|
box is displayed for the first time.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the button controls
|
|
IN WORD wParam
|
|
IN HWND lParam
|
|
Pointer to dialog box data block
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
PPDHI_BROWSE_DLG_INFO pDlgData;
|
|
HCURSOR hOldCursor;
|
|
LPWSTR szMsg;
|
|
|
|
UNREFERENCED_PARAMETER (wParam);
|
|
|
|
// reset the last error value
|
|
SetLastError(ERROR_SUCCESS);
|
|
|
|
hOldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
|
|
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA) G_ALLOC(sizeof(PDHI_BROWSE_DIALOG_DATA));
|
|
if (pData == NULL) {
|
|
SetLastError(PDH_MEMORY_ALLOCATION_FAILURE);
|
|
EndDialog(hDlg, IDCANCEL);
|
|
goto Cleanup;
|
|
}
|
|
|
|
// save user data
|
|
|
|
pDlgData = (PPDHI_BROWSE_DLG_INFO) lParam;
|
|
pData->pDlgData = (PPDHI_BROWSE_DLG_INFO) lParam;
|
|
|
|
SetWindowLongPtrW(hDlg, DWLP_USER, (LONG_PTR) pData);
|
|
|
|
// load configuration flags from user data
|
|
|
|
if (pData->pDlgData->pWideStruct != NULL) {
|
|
// use wide structure
|
|
pData->bShowIndex = (BOOL) pDlgData->pWideStruct->bIncludeInstanceIndex;
|
|
pData->bSelectMultipleCounters = ! (BOOL) pDlgData->pWideStruct->bSingleCounterPerAdd;
|
|
pData->bAddMultipleCounters = ! (BOOL) pDlgData->pWideStruct->bSingleCounterPerDialog;
|
|
pData->bLocalCountersOnly = (BOOL) pDlgData->pWideStruct->bLocalCountersOnly;
|
|
pData->bIncludeMachineInPath = ! pData->bLocalCountersOnly;
|
|
pData->bWildCardInstances = (BOOL) pDlgData->pWideStruct->bWildCardInstances;
|
|
pData->bHideDetailLevel = (BOOL) pDlgData->pWideStruct->bHideDetailBox;
|
|
if (pDlgData->pWideStruct->szDialogBoxCaption != NULL) {
|
|
SetWindowTextW(hDlg, pDlgData->pWideStruct->szDialogBoxCaption);
|
|
}
|
|
pData->dwCurrentDetailLevel = pDlgData->pWideStruct->dwDefaultDetailLevel;
|
|
pData->bDisableMachineSelection = (BOOL) pDlgData->pWideStruct->bDisableMachineSelection;
|
|
pData->bInitializePath = (BOOL) pDlgData->pWideStruct->bInitializePath;
|
|
pData->bIncludeCostlyObjects = (BOOL) pDlgData->pWideStruct->bIncludeCostlyObjects;
|
|
pData->bShowObjects = (BOOL) pDlgData->pWideStruct->bShowObjectBrowser;
|
|
}
|
|
else if (pData->pDlgData->pAnsiStruct != NULL) {
|
|
// use Ansi struct
|
|
pData->bShowIndex = (BOOL) pDlgData->pAnsiStruct->bIncludeInstanceIndex;
|
|
pData->bSelectMultipleCounters = ! (BOOL) pDlgData->pAnsiStruct->bSingleCounterPerAdd;
|
|
pData->bAddMultipleCounters = ! (BOOL) pDlgData->pAnsiStruct->bSingleCounterPerDialog;
|
|
pData->bLocalCountersOnly = (BOOL) pDlgData->pAnsiStruct->bLocalCountersOnly;
|
|
pData->bIncludeMachineInPath = ! pData->bLocalCountersOnly;
|
|
pData->bWildCardInstances = (BOOL) pDlgData->pAnsiStruct->bWildCardInstances;
|
|
pData->bHideDetailLevel = (BOOL) pDlgData->pAnsiStruct->bHideDetailBox;
|
|
if (pDlgData->pAnsiStruct->szDialogBoxCaption != NULL) {
|
|
SetWindowTextA(hDlg, pDlgData->pAnsiStruct->szDialogBoxCaption);
|
|
}
|
|
pData->dwCurrentDetailLevel = pDlgData->pAnsiStruct->dwDefaultDetailLevel;
|
|
pData->bDisableMachineSelection = (BOOL) pDlgData->pAnsiStruct->bDisableMachineSelection;
|
|
pData->bInitializePath = (BOOL) pDlgData->pAnsiStruct->bInitializePath;
|
|
pData->bIncludeCostlyObjects = (BOOL) pDlgData->pAnsiStruct->bIncludeCostlyObjects;
|
|
pData->bShowObjects = (BOOL) pDlgData->pAnsiStruct->bShowObjectBrowser;
|
|
}
|
|
else {
|
|
// bad data so bail out
|
|
EndDialog(hDlg, IDCANCEL);
|
|
G_FREE(pData);
|
|
goto Cleanup;
|
|
}
|
|
|
|
// selecting objects implies multiple selections
|
|
if (pData->bShowObjects) {
|
|
pData->bSelectMultipleCounters = TRUE;
|
|
}
|
|
// limit text to machine name
|
|
SendDlgItemMessageW(hDlg, IDC_MACHINE_COMBO, EM_LIMITTEXT, MAX_PATH, 0);
|
|
|
|
// set check boxes to the caller defined setting
|
|
|
|
if (pData->bLocalCountersOnly) {
|
|
// then only the local counters button is selected and enabled
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SELECT_MACHINE), FALSE);
|
|
}
|
|
|
|
CheckRadioButton(hDlg, IDC_USE_LOCAL_MACHINE, IDC_SELECT_MACHINE,
|
|
(pData->bIncludeMachineInPath ? IDC_SELECT_MACHINE : IDC_USE_LOCAL_MACHINE));
|
|
EnableWindow(GetDlgItem(hDlg, IDC_MACHINE_COMBO), (pData->bIncludeMachineInPath ? TRUE : FALSE));
|
|
|
|
if (! pData->bShowObjects) {
|
|
// these controls aren't found in the Object browser
|
|
CheckRadioButton(hDlg, IDC_ALL_INSTANCES, IDC_USE_INSTANCE_LIST, IDC_USE_INSTANCE_LIST);
|
|
pData->bSelectAllInstances = FALSE;
|
|
CheckRadioButton(hDlg, IDC_ALL_COUNTERS, IDC_USE_COUNTER_LIST, IDC_USE_COUNTER_LIST);
|
|
pData->bSelectAllCounters = FALSE;
|
|
}
|
|
|
|
// set button text strings to reflect mode of dialog
|
|
if (pData->bAddMultipleCounters) {
|
|
szMsg = GetStringResource(IDS_BRWS_ADD);
|
|
if (szMsg != NULL) {
|
|
SetWindowTextW(GetDlgItem(hDlg, IDOK), (LPCWSTR) szMsg);
|
|
G_FREE(szMsg);
|
|
}
|
|
szMsg = GetStringResource(IDS_BRWS_CLOSE);
|
|
if (szMsg != NULL) {
|
|
SetWindowTextW(GetDlgItem(hDlg, IDCANCEL), (LPCWSTR) szMsg);
|
|
G_FREE(szMsg);
|
|
}
|
|
}
|
|
else {
|
|
szMsg = GetStringResource(IDS_BRWS_OK);
|
|
if (szMsg != NULL) {
|
|
SetWindowTextW(GetDlgItem(hDlg, IDOK), (LPCWSTR) szMsg);
|
|
G_FREE(szMsg);
|
|
}
|
|
szMsg = GetStringResource(IDS_BRWS_CANCEL);
|
|
if (szMsg != NULL) {
|
|
SetWindowTextW(GetDlgItem(hDlg, IDCANCEL), (LPCWSTR) szMsg);
|
|
G_FREE(szMsg);
|
|
}
|
|
}
|
|
|
|
// see if the data source supports detail levels
|
|
if (! PdhiDataSourceHasDetailLevelsH(pData->pDlgData->hDataSource)) {
|
|
//then set detail to wizard and hide the combo box
|
|
pData->bHideDetailLevel = TRUE;
|
|
pData->dwCurrentDetailLevel = PERF_DETAIL_WIZARD;
|
|
}
|
|
|
|
// hide detail combo box if desired
|
|
if (pData->bHideDetailLevel) {
|
|
ShowWindow(GetDlgItem(hDlg, IDC_COUNTER_DETAIL_CAPTION), SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg, IDC_COUNTER_DETAIL_COMBO), SW_HIDE);
|
|
// make sure this is a "legal" value
|
|
switch (pData->dwCurrentDetailLevel) {
|
|
case PERF_DETAIL_NOVICE:
|
|
case PERF_DETAIL_EXPERT:
|
|
case PERF_DETAIL_ADVANCED:
|
|
case PERF_DETAIL_WIZARD:
|
|
// these are OK
|
|
break;
|
|
|
|
default:
|
|
// default is to show all
|
|
pData->dwCurrentDetailLevel = PERF_DETAIL_WIZARD;
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
// load the combo box entries
|
|
pData->dwCurrentDetailLevel = PdhiLoadDetailLevelCombo(hDlg, pData->dwCurrentDetailLevel);
|
|
}
|
|
|
|
// connect to this machine
|
|
if (pData->pDlgData->hDataSource == H_REALTIME_DATASOURCE) {
|
|
PPERF_MACHINE pMachine = GetMachine(NULL, 0, PDH_GM_UPDATE_NAME | PDH_GM_UPDATE_PERFNAME_ONLY);
|
|
if (pMachine != NULL) {
|
|
pMachine->dwRefCount --;
|
|
RELEASE_MUTEX(pMachine->hMutex);
|
|
}
|
|
else {
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
|
|
PdhiLoadKnownMachines(hDlg); // load machine list
|
|
PdhiLoadMachineObjects(hDlg, TRUE); // load object list
|
|
if (!pData->bShowObjects) {
|
|
// these controls don't exist in the object browser
|
|
PdhiLoadCountersAndInstances(hDlg);
|
|
}
|
|
|
|
if (pData->bShowObjects) {
|
|
// display explain text if necessary
|
|
SendMessageW(hDlg,
|
|
WM_COMMAND,
|
|
MAKEWPARAM(IDC_OBJECT_LIST, LBN_SELCHANGE),
|
|
(LPARAM) GetDlgItem(hDlg, IDC_OBJECT_LIST));
|
|
}
|
|
else {
|
|
// display explain text if necessary
|
|
SendMessageW(hDlg,
|
|
WM_COMMAND,
|
|
MAKEWPARAM(IDC_COUNTER_LIST, LBN_SELCHANGE),
|
|
(LPARAM) GetDlgItem(hDlg, IDC_COUNTER_LIST));
|
|
}
|
|
|
|
if (pData->bInitializePath) {
|
|
PdhiSelectItemsInPath(hDlg);
|
|
}
|
|
|
|
if (pData->pDlgData->hDataSource == H_REALTIME_DATASOURCE
|
|
|| pData->pDlgData->hDataSource == H_WBEM_DATASOURCE) {
|
|
EnableWindow(GetDlgItem(hDlg, IDC_EXPLAIN_BTN), TRUE);
|
|
}
|
|
else {
|
|
EnableWindow(GetDlgItem(hDlg, IDC_EXPLAIN_BTN), FALSE);
|
|
}
|
|
|
|
// hide the machine selection buttons and disable the
|
|
// machine combo box if selected (after the connection has been
|
|
// made, of course)
|
|
|
|
if (pData->bDisableMachineSelection) {
|
|
ShowWindow(GetDlgItem(hDlg, IDC_USE_LOCAL_MACHINE), SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg, IDC_SELECT_MACHINE), SW_HIDE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_MACHINE_COMBO), FALSE);
|
|
ShowWindow(GetDlgItem(hDlg, IDC_MACHINE_CAPTION), SW_SHOW);
|
|
}
|
|
else {
|
|
EnableWindow(GetDlgItem(hDlg, IDC_MACHINE_COMBO), TRUE);
|
|
ShowWindow(GetDlgItem(hDlg, IDC_MACHINE_CAPTION), SW_HIDE);
|
|
}
|
|
pData->wpLastMachineSel = 0;
|
|
|
|
Cleanup:
|
|
hExplainDlg = NULL;
|
|
SetCursor(hOldCursor);
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_WM_COMPAREITEM(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows message that are generated when a combo
|
|
box is searched
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window handle to the dialog box window
|
|
IN WPARAM wParam
|
|
HIWORD is the notification message ID
|
|
LOWORD is the control ID of the control issuing the command
|
|
IN LPARAM lParam
|
|
the pointer to a compare item structure
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
LPCOMPAREITEMSTRUCT pCIS = (LPCOMPAREITEMSTRUCT) lParam;
|
|
LPWSTR szString1;
|
|
LPWSTR szString2;
|
|
int nResult;
|
|
BOOL bReturn = (BOOL) 0;
|
|
|
|
UNREFERENCED_PARAMETER(hDlg);
|
|
|
|
if (wParam == IDC_MACHINE_COMBO) {
|
|
// then process this
|
|
szString1 = (LPWSTR) pCIS->itemData1;
|
|
szString2 = (LPWSTR) pCIS->itemData2;
|
|
if ((szString1 != NULL) && (szString2 != NULL)) {
|
|
nResult = lstrcmpiW(szString1, szString2);
|
|
}
|
|
else {
|
|
nResult = 0;
|
|
}
|
|
if (nResult < 0) {
|
|
// string 1 < string 2
|
|
bReturn = (BOOL) -1;
|
|
}
|
|
else if (nResult > 0) {
|
|
// string 1 > string 2
|
|
bReturn = (BOOL) 1;
|
|
}
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_WM_COMMAND(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows message that occurs when the user interacts
|
|
with the dialog box
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window handle to the dialog box window
|
|
IN WPARAM wParam
|
|
HIWORD is the notification message ID
|
|
LOWORD is the control ID of the control issuing the command
|
|
IN LPARAM lParam
|
|
The window handle of the controle issuing the message
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
WORD wNotifyMsg = HIWORD(wParam);
|
|
|
|
switch (LOWORD(wParam)) { // select on the control ID
|
|
case IDC_USE_LOCAL_MACHINE:
|
|
case IDC_SELECT_MACHINE:
|
|
bReturn = PdhiBrowseCtrDlg_MACHINE_BUTTON(hDlg, wNotifyMsg, (HWND) lParam);
|
|
break;
|
|
|
|
case IDC_MACHINE_COMBO:
|
|
bReturn = PdhiBrowseCtrDlg_MACHINE_COMBO(hDlg, wNotifyMsg, (HWND) lParam);
|
|
break;
|
|
|
|
case IDC_OBJECT_COMBO:
|
|
bReturn = PdhiBrowseCtrDlg_OBJECT_COMBO(hDlg, wNotifyMsg, (HWND) lParam);
|
|
break;
|
|
|
|
case IDC_ALL_INSTANCES:
|
|
case IDC_USE_INSTANCE_LIST:
|
|
bReturn = PdhiBrowseCtrDlg_INSTANCE_BUTTON(hDlg, wNotifyMsg, (HWND) lParam);
|
|
break;
|
|
|
|
case IDC_ALL_COUNTERS:
|
|
case IDC_USE_COUNTER_LIST:
|
|
bReturn = PdhiBrowseCtrDlg_COUNTER_BUTTON(hDlg, wNotifyMsg, (HWND) lParam);
|
|
break;
|
|
|
|
case IDC_COUNTER_LIST:
|
|
bReturn = PdhiBrowseCtrDlg_COUNTER_LIST(hDlg, wNotifyMsg, (HWND) lParam);
|
|
break;
|
|
|
|
case IDC_OBJECT_LIST:
|
|
bReturn = PdhiBrowseCtrDlg_OBJECT_LIST(hDlg, wNotifyMsg, (HWND) lParam);
|
|
break;
|
|
|
|
case IDC_COUNTER_DETAIL_COMBO:
|
|
bReturn = PdhiBrowseCtrDlg_DETAIL_COMBO(hDlg, wNotifyMsg, (HWND) lParam);
|
|
break;
|
|
|
|
case IDOK:
|
|
bReturn = PdhiBrowseCtrDlg_OK(hDlg, wNotifyMsg, (HWND) lParam);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
bReturn = PdhiBrowseCtrDlg_CANCEL(hDlg, wNotifyMsg, (HWND) lParam);
|
|
break;
|
|
|
|
case IDC_EXPLAIN_BTN:
|
|
bReturn = PdhiBrowseCtrDlg_EXPLAIN_BTN(hDlg, wNotifyMsg, (HWND) lParam);
|
|
break;
|
|
|
|
case IDC_HELP_BTN:
|
|
bReturn = PdhiBrowseCtrDlg_HELP_BTN(hDlg, wNotifyMsg, (HWND) lParam);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_WM_SYSCOMMAND(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows message that occurs when the user selects an
|
|
item from the system menu
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the button controls
|
|
IN WPARAM wParam
|
|
menu ID of item selected
|
|
IN LPARAM lParam
|
|
Not Used
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
|
|
switch (wParam) {
|
|
case SC_CLOSE:
|
|
EndDialog(hDlg, IDOK);
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_WM_CLOSE(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows message that occurs when the dialog box
|
|
is closed. No processing is needed so this function merely returns.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the button controls
|
|
IN WPARAM wParam
|
|
Not Used
|
|
IN LPARAM lParam
|
|
Not Used
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
UNREFERENCED_PARAMETER(wParam);
|
|
UNREFERENCED_PARAMETER(hDlg);
|
|
return TRUE;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
PdhiBrowseCtrDlg_WM_DESTROY(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes the windows message that occurs just before the window
|
|
is destroyed. Any memory allocations made are now freed.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the button controls
|
|
IN WPARAM wParam
|
|
Not Used
|
|
IN LPARAM lParam
|
|
Not Used
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
PPDHI_BROWSE_DIALOG_DATA pData;
|
|
BOOL bReturn = FALSE;
|
|
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
UNREFERENCED_PARAMETER(wParam);
|
|
|
|
pData = (PPDHI_BROWSE_DIALOG_DATA) GetWindowLongPtrW(hDlg, DWLP_USER);
|
|
if (pData != NULL) {
|
|
G_FREE(pData); // free memory block
|
|
bReturn = TRUE;
|
|
}
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
BrowseCounterDlgProc(
|
|
HWND hDlg,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
Processes all windows messages that are sent to the dialog box window.
|
|
This function is the main dispatching function for the processing
|
|
of these messages.
|
|
|
|
Arguments:
|
|
IN HWND hDlg
|
|
Window Handle to the dialog box containing the button controls
|
|
IN WPARAM wParam
|
|
Not Used
|
|
IN LPARAM lParam
|
|
Not Used
|
|
|
|
Return Value:
|
|
TRUE if this function handles the message
|
|
FALSE if this function did not process the message and the Default
|
|
message handler for this function should handle the message
|
|
--*/
|
|
{
|
|
|
|
BOOL bReturn = FALSE;
|
|
|
|
switch (message) {
|
|
case WM_INITDIALOG:
|
|
bReturn = PdhiBrowseCtrDlg_WM_INITDIALOG(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
bReturn = PdhiBrowseCtrDlg_WM_COMMAND(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_SYSCOMMAND:
|
|
bReturn = PdhiBrowseCtrDlg_WM_SYSCOMMAND(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_CLOSE:
|
|
bReturn = PdhiBrowseCtrDlg_WM_CLOSE(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
bReturn = PdhiBrowseCtrDlg_WM_DESTROY(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_COMPAREITEM:
|
|
bReturn = PdhiBrowseCtrDlg_WM_COMPAREITEM(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case EDM_EXPLAIN_DLG_CLOSING:
|
|
hExplainDlg = NULL;
|
|
EnableWindow(GetDlgItem(hDlg, IDC_EXPLAIN_BTN), TRUE);
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
{
|
|
INT iCtrlID = GetDlgCtrlID((HWND) wParam);
|
|
if (0 != iCtrlID) {
|
|
LPWSTR pszHelpFilePath = NULL;
|
|
DWORD dwLen = 2 * (MAX_PATH + 1);
|
|
|
|
pszHelpFilePath = G_ALLOC(dwLen * sizeof(WCHAR));
|
|
if (pszHelpFilePath != NULL) {
|
|
if (GetWindowsDirectoryW(pszHelpFilePath, dwLen) > 0) {
|
|
StringCchCatW(pszHelpFilePath, dwLen, L"\\help\\sysmon.hlp");
|
|
bReturn = WinHelpW((HWND) wParam,
|
|
pszHelpFilePath,
|
|
HELP_CONTEXTMENU,
|
|
(DWORD_PTR) PdhiBrowseraulControlIdToHelpIdMap);
|
|
}
|
|
G_FREE(pszHelpFilePath);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
{
|
|
// Only display help for known context IDs.
|
|
LPWSTR pszHelpFilePath = NULL;
|
|
DWORD dwLen;
|
|
LPHELPINFO pInfo = (LPHELPINFO) lParam;
|
|
|
|
if (pInfo->iContextType == HELPINFO_WINDOW) {
|
|
for (dwLen = 0; PdhiBrowseraulControlIdToHelpIdMap[dwLen] != 0; dwLen += 2) {
|
|
if ((INT) PdhiBrowseraulControlIdToHelpIdMap[dwLen] == pInfo->iCtrlId) {
|
|
break;
|
|
}
|
|
}
|
|
if (PdhiBrowseraulControlIdToHelpIdMap[dwLen] != 0) {
|
|
dwLen = 2 * (MAX_PATH + 1);
|
|
pszHelpFilePath = G_ALLOC(dwLen * sizeof(WCHAR));
|
|
if (pszHelpFilePath != NULL) {
|
|
if (GetWindowsDirectoryW(pszHelpFilePath, dwLen) > 0) {
|
|
StringCchCatW(pszHelpFilePath, dwLen, L"\\help\\sysmon.hlp");
|
|
bReturn = WinHelpW(pInfo->hItemHandle,
|
|
pszHelpFilePath,
|
|
HELP_WM_HELP,
|
|
(DWORD_PTR) PdhiBrowseraulControlIdToHelpIdMap);
|
|
}
|
|
G_FREE(pszHelpFilePath);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|