// browsctr.cpp : implementation file // #include "stdafx.h" #include "DPH_TEST.h" #include "browsctr.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CBrowsCountersDlg dialog CBrowsCountersDlg::CBrowsCountersDlg(CWnd* pParent /*=NULL*/, UINT nTemplate /* = IDD_BROWSE_COUNTERS_DLG_EXT */) : CDialog(nTemplate, pParent) { //{{AFX_DATA_INIT(CBrowsCountersDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // initialize the private/public variables here wpLastMachineSel = 0; cpeLastSelection.szMachineName = &cpeMachineName[0]; memset (cpeMachineName, 0, sizeof(cpeMachineName)); cpeLastSelection.szObjectName = &cpeObjectName[0]; memset (cpeObjectName, 0, sizeof(cpeObjectName)); cpeLastSelection.szInstanceName = &cpeInstanceName[0]; memset (cpeInstanceName, 0, sizeof(cpeInstanceName)); cpeLastSelection.szParentInstance = &cpeParentInstance[0]; memset (cpeParentInstance, 0, sizeof(cpeParentInstance)); cpeLastSelection.dwInstanceIndex = (DWORD)-1; cpeLastSelection.szCounterName = &cpeCounterName[0]; memset (cpeCounterName, 0, sizeof(cpeCounterName)); memset (cpeLastPath, 0, sizeof(cpeLastPath)); bShowIndex = FALSE; bSelectMultipleCounters = FALSE; bAddMultipleCounters = TRUE; bIncludeMachineInPath = FALSE; szUsersPathBuffer = NULL; dwUsersPathBufferLength = 0; pCallBack = NULL; } void CBrowsCountersDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CBrowsCountersDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CBrowsCountersDlg, CDialog) //{{AFX_MSG_MAP(CBrowsCountersDlg) ON_CBN_SETFOCUS(IDC_MACHINE_COMBO, OnSetfocusMachineCombo) ON_CBN_KILLFOCUS(IDC_MACHINE_COMBO, OnKillfocusMachineCombo) ON_CBN_SELCHANGE(IDC_OBJECT_COMBO, OnSelchangeObjectCombo) ON_LBN_SELCHANGE(IDC_COUNTER_LIST, OnSelchangeCounterList) ON_LBN_SELCHANGE(IDC_INSTANCE_LIST, OnSelchangeInstanceList) ON_BN_CLICKED(IDC_USE_LOCAL_MACHINE, OnUseLocalMachine) ON_BN_CLICKED(IDC_SELECT_MACHINE, OnSelectMachine) ON_BN_CLICKED(IDC_ALL_INSTANCES, OnAllInstances) ON_BN_CLICKED(IDC_USE_INSTANCE_LIST, OnUseInstanceList) ON_BN_CLICKED(IDC_HELP, OnHelp) ON_BN_CLICKED(IDC_NETWORK, OnNetwork) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // Utility Functions #define MACHINE_LIST_SIZE 1024 #define OBJECT_LIST_SIZE 4096 #define COUNTER_LIST_SIZE 8192 #define INSTANCE_LIST_SIZE 8192 void CBrowsCountersDlg::LoadKnownMachines () { TCHAR mszMachineList[MACHINE_LIST_SIZE]; LPTSTR szThisMachine; DWORD dwLength; PDH_STATUS status; HCURSOR hOldCursor; hOldCursor = ::SetCursor (::LoadCursor (NULL, IDC_WAIT)); dwLength = MACHINE_LIST_SIZE; status = PdhEnumConnectedMachines ( &mszMachineList[0], &dwLength); SendDlgItemMessage(IDC_MACHINE_COMBO, CB_RESETCONTENT); if (status == ERROR_SUCCESS) { // update the combo box for (szThisMachine = &mszMachineList[0]; *szThisMachine != 0; szThisMachine += lstrlen(szThisMachine)+1) { SendDlgItemMessage (IDC_MACHINE_COMBO, CB_ADDSTRING, 0, (LPARAM)szThisMachine); } SendDlgItemMessage (IDC_MACHINE_COMBO, CB_SETCURSEL); } ::SetCursor (hOldCursor); } void CBrowsCountersDlg::LoadMachineObjects (BOOL bRefresh) { TCHAR szMachineName[MAX_PATH]; TCHAR szDefaultObject[MAX_PATH]; TCHAR mszObjectList[OBJECT_LIST_SIZE]; DWORD dwLength; LPTSTR szThisObject; HCURSOR hOldCursor; hOldCursor = ::SetCursor (::LoadCursor (NULL, IDC_WAIT)); // get current machine name (GetDlgItem(IDC_MACHINE_COMBO))->GetWindowText(szMachineName, MAX_PATH); // get object list dwLength = OBJECT_LIST_SIZE; PdhEnumObjects (szMachineName, mszObjectList, &dwLength, bRefresh); // load object list SendDlgItemMessage (IDC_OBJECT_COMBO, CB_RESETCONTENT); for (szThisObject = &mszObjectList[0]; *szThisObject != 0; szThisObject += lstrlen(szThisObject) + 1) { SendDlgItemMessage (IDC_OBJECT_COMBO, CB_ADDSTRING, 0, (LPARAM)szThisObject); } // get default Object dwLength = MAX_PATH; PdhGetDefaultPerfObject ( szMachineName, szDefaultObject, &dwLength); if (SendDlgItemMessage (IDC_OBJECT_COMBO, CB_SELECTSTRING, (WPARAM)-1, (LPARAM)szDefaultObject) == CB_ERR) { // default object not found in list so select the first one SendDlgItemMessage (IDC_OBJECT_COMBO, CB_SETCURSEL); } ::SetCursor (hOldCursor); } void CBrowsCountersDlg::LoadCountersAndInstances () { TCHAR szMachineName[MAX_PATH]; TCHAR szObjectName[MAX_PATH]; TCHAR szDefaultCounter[MAX_PATH]; TCHAR mszCounterList[COUNTER_LIST_SIZE]; TCHAR mszInstanceList[INSTANCE_LIST_SIZE]; TCHAR szInstanceString[MAX_PATH]; LPTSTR szIndexStringPos; DWORD dwCounterLen; DWORD dwDefaultIndex; DWORD dwCounterListLength; DWORD dwInstanceListLength; DWORD dwInstanceMatch; DWORD dwInstanceIndex; LPTSTR szThisItem; CWnd *pcCounterListBox; CWnd *pcInstanceListBox; HCURSOR hOldCursor; hOldCursor = ::SetCursor (::LoadCursor (NULL, IDC_WAIT)); // get current machine & object name (GetDlgItem(IDC_MACHINE_COMBO))->GetWindowText(szMachineName, MAX_PATH); (GetDlgItem(IDC_OBJECT_COMBO))->GetWindowText(szObjectName, MAX_PATH); // get object list dwCounterListLength = sizeof(mszCounterList) / sizeof(TCHAR); dwInstanceListLength = sizeof(mszInstanceList) / sizeof(TCHAR); PdhEnumObjectItems ( szMachineName, szObjectName, mszCounterList, &dwCounterListLength, mszInstanceList, &dwInstanceListLength, 0); //reset contents of both list boxes pcCounterListBox = GetDlgItem (IDC_COUNTER_LIST); pcInstanceListBox = GetDlgItem (IDC_INSTANCE_LIST); pcCounterListBox->SendMessage (LB_RESETCONTENT); pcInstanceListBox->SendMessage (LB_RESETCONTENT); // now fill 'em up // start with the counters for (szThisItem = mszCounterList; *szThisItem != 0; szThisItem += lstrlen(szThisItem) + 1) { pcCounterListBox->SendMessage (LB_ADDSTRING, 0, (LPARAM)szThisItem); } dwCounterLen = MAX_PATH; PdhGetDefaultPerfCounter ( szMachineName, szObjectName, szDefaultCounter, &dwCounterLen); dwDefaultIndex = pcCounterListBox->SendMessage (LB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)szDefaultCounter); if (dwDefaultIndex == LB_ERR) { pcCounterListBox->SendMessage (LB_SETSEL, TRUE, 0); } else { pcCounterListBox->SendMessage (LB_SETSEL, TRUE, dwDefaultIndex); pcCounterListBox->SendMessage (LB_SETCARETINDEX, (WPARAM)dwDefaultIndex, MAKELPARAM(FALSE, 0)); } // now the instance list if (dwInstanceListLength > 0) { pcInstanceListBox->EnableWindow(TRUE); GetDlgItem(IDC_ALL_INSTANCES)->EnableWindow(TRUE); GetDlgItem(IDC_USE_INSTANCE_LIST)->EnableWindow(TRUE); for (szThisItem = mszInstanceList; *szThisItem != 0; szThisItem += lstrlen(szThisItem) + 1) { if (bShowIndex) { dwInstanceIndex = 0; dwInstanceMatch = (DWORD)-1; // find the index of this instance lstrcpy (szInstanceString, szThisItem); lstrcat (szInstanceString, TEXT("#")); szIndexStringPos = &szInstanceString[lstrlen(szInstanceString)]; do { LongToString ((long)dwInstanceIndex++, szIndexStringPos, 10); dwInstanceMatch = (DWORD)SendDlgItemMessage (IDC_INSTANCE_LIST, LB_FINDSTRINGEXACT, (WPARAM)dwInstanceMatch, (LPARAM)szInstanceString); } while (dwInstanceMatch != LB_ERR); pcInstanceListBox->SendMessage (LB_ADDSTRING, 0, (LPARAM)szInstanceString); } else { pcInstanceListBox->SendMessage (LB_ADDSTRING, 0, (LPARAM)szThisItem); } } if (bWildCardInstances) { // disable instance list pcInstanceListBox->EnableWindow(FALSE); } else { if (pcInstanceListBox->SendMessage (LB_GETCOUNT) != LB_ERR) { pcInstanceListBox->SendMessage (LB_SETSEL, TRUE, 0); } } } else { pcInstanceListBox->SendMessage (LB_ADDSTRING, 0, (LPARAM)TEXT("")); pcInstanceListBox->EnableWindow(FALSE); GetDlgItem(IDC_ALL_INSTANCES)->EnableWindow(FALSE); GetDlgItem(IDC_USE_INSTANCE_LIST)->EnableWindow(FALSE); } ::SetCursor (hOldCursor); } void CBrowsCountersDlg::CompileSelectedCounters() { DWORD dwBufferRemaining; DWORD dwCountCounters; DWORD dwThisCounter; DWORD dwCountInstances; DWORD dwThisInstance; DWORD dwSize1, dwSize2; PDH_COUNTER_PATH_ELEMENTS lszPath; TCHAR lszMachineName[MAX_PATH]; TCHAR lszObjectName[MAX_PATH]; TCHAR lszInstanceName[MAX_PATH]; TCHAR lszParentInstance[MAX_PATH]; TCHAR lszCounterName[MAX_PATH]; TCHAR szWorkBuffer[MAX_PATH]; LPTSTR szCounterStart; CWnd *cwCounterList, *cwInstanceList; // clear user's string if (szUsersPathBuffer != NULL) { *szUsersPathBuffer = 0; dwBufferRemaining = dwUsersPathBufferLength; szCounterStart = szUsersPathBuffer; } else { return; // no point in continuing if user doesn't have a buffer } // build base string using selected machine and object if (bIncludeMachineInPath) { lszPath.szMachineName = &lszMachineName[0]; memset (lszMachineName, 0, sizeof(lszMachineName)); GetDlgItemText (IDC_MACHINE_COMBO, lszMachineName, MAX_PATH); } else { lszPath.szMachineName = NULL; } lszPath.szObjectName = &lszObjectName[0]; memset (lszObjectName, 0, sizeof(lszObjectName)); GetDlgItemText (IDC_OBJECT_COMBO, lszObjectName, MAX_PATH); cwCounterList = GetDlgItem (IDC_COUNTER_LIST); cwInstanceList = GetDlgItem (IDC_INSTANCE_LIST); if (bSelectMultipleCounters) { if (bWildCardInstances) { lszPath.szInstanceName = &lszInstanceName[0]; memset (lszInstanceName, 0, sizeof(lszInstanceName)); lstrcpy (lszInstanceName, TEXT("*")); lszPath.szParentInstance = NULL; lszPath.dwInstanceIndex = (DWORD)-1; dwSize1 = sizeof (szWorkBuffer) / sizeof (TCHAR); PdhMakeCounterPath (&lszPath, szWorkBuffer, &dwSize1, 0); if ((dwSize1 + 1) < dwBufferRemaining) { // then this will fit so add it to the string lstrcpy (szCounterStart, szWorkBuffer); szCounterStart += lstrlen(szWorkBuffer); *szCounterStart++ = 0; } } else { // get selected instances from list dwCountCounters = cwCounterList->SendMessage (LB_GETCOUNT); for (dwThisCounter = 0; dwThisCounter < dwCountCounters; dwThisCounter++) { if (cwCounterList->SendMessage (LB_GETSEL, (WPARAM)dwThisCounter)) { lszPath.szCounterName = &lszCounterName[0]; memset (lszCounterName, 0, sizeof(lszCounterName)); cwCounterList->SendMessage (LB_GETTEXT, (WPARAM)dwThisCounter, (LPARAM)lszCounterName); if (cwInstanceList->IsWindowEnabled()) { dwCountInstances = cwInstanceList->SendMessage (LB_GETCOUNT); for (dwThisInstance = 0; dwThisInstance < dwCountInstances; dwThisInstance++) { if (cwInstanceList->SendMessage (LB_GETSEL, (WPARAM)dwThisInstance)) { lszPath.szInstanceName = &lszInstanceName[0]; memset (lszInstanceName, 0, sizeof(lszInstanceName)); cwInstanceList->SendMessage (LB_GETTEXT, (WPARAM)dwThisInstance, (LPARAM)lszInstanceName); lszPath.szParentInstance = &lszParentInstance[0]; memset (lszParentInstance, 0, sizeof(lszParentInstance)); dwSize1 = dwSize2 = MAX_PATH; PdhParseInstanceName (lszInstanceName, lszInstanceName, &dwSize1, lszParentInstance, &dwSize2, &lszPath.dwInstanceIndex); // parse instance name adds in the default index of one is // not present. so if it's not wanted, this will remove it if (!bShowIndex) lszPath.dwInstanceIndex = (DWORD)-1; if (dwSize1 > 0) { lszPath.szInstanceName = &lszInstanceName[0]; } else { lszPath.szInstanceName = NULL; } if (dwSize2 > 0) { lszPath.szParentInstance = &lszParentInstance[0]; } else { lszPath.szParentInstance = NULL; } dwSize1 = sizeof (szWorkBuffer) / sizeof (TCHAR); PdhMakeCounterPath (&lszPath, szWorkBuffer, &dwSize1, 0); if ((dwSize1 + 1) < dwBufferRemaining) { // then this will fit so add it to the string lstrcpy (szCounterStart, szWorkBuffer); szCounterStart += lstrlen(szWorkBuffer); *szCounterStart++ = 0; } } // 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 = sizeof (szWorkBuffer) / sizeof (TCHAR); PdhMakeCounterPath (&lszPath, szWorkBuffer, &dwSize1, 0); if ((dwSize1 + 1) < dwBufferRemaining) { // then this will fit so add it to the string lstrcpy (szCounterStart, szWorkBuffer); szCounterStart += lstrlen(szWorkBuffer); *szCounterStart++ = 0; } } // end if counter has instances } // else counter is not selected } // end for each counter in list } // end if not wild card instances *szCounterStart++ = 0; // terminate MSZ } else { // only single selections are allowed // FIXFIX: add this code. } } //////////////////////////////////////////////////////////////////////////// // CBrowsCountersDlg message handlers BOOL CBrowsCountersDlg::OnInitDialog() { HCURSOR hOldCursor; hOldCursor = ::SetCursor (::LoadCursor (NULL, IDC_WAIT)); CDialog::OnInitDialog(); // limit text to machine name (GetDlgItem(IDC_MACHINE_COMBO))->SendMessage(EM_LIMITTEXT, MAX_PATH); // set check boxes to the caller defined setting CheckRadioButton (IDC_USE_LOCAL_MACHINE, IDC_SELECT_MACHINE, (bIncludeMachineInPath ? IDC_SELECT_MACHINE : IDC_USE_LOCAL_MACHINE)); GetDlgItem(IDC_MACHINE_COMBO)->EnableWindow ( (bIncludeMachineInPath ? TRUE : FALSE)); CheckRadioButton (IDC_ALL_INSTANCES, IDC_USE_INSTANCE_LIST, IDC_USE_INSTANCE_LIST); // set button text strings to reflect mode of dialog if (bAddMultipleCounters) { (GetDlgItem(IDOK))->SetWindowText(TEXT("Add")); (GetDlgItem(IDCANCEL))->SetWindowText(TEXT("Close")); } // connect to this machine PdhConnectMachine(NULL); // Null is local machine LoadKnownMachines(); // load machine list LoadMachineObjects(TRUE); // load object list LoadCountersAndInstances(); wpLastMachineSel = 0; ::SetCursor (hOldCursor); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CBrowsCountersDlg::OnOK() { HCURSOR hOldCursor; hOldCursor = ::SetCursor (::LoadCursor (NULL, IDC_WAIT)); CompileSelectedCounters(); if (pCallBack != NULL) { (*pCallBack)(dwArg); } if (!bAddMultipleCounters) { CDialog::OnOK(); } ::SetCursor (hOldCursor); } void CBrowsCountersDlg::OnCancel() { CDialog::OnCancel(); } void CBrowsCountersDlg::OnSetfocusMachineCombo() { wpLastMachineSel = SendDlgItemMessage (IDC_MACHINE_COMBO, CB_GETCURSEL); } void CBrowsCountersDlg::OnKillfocusMachineCombo() { TCHAR szNewMachineName[MAX_PATH]; CWnd *pcMachineCombo; long lMatchIndex; PDH_STATUS status; int mbStatus; HCURSOR hOldCursor; hOldCursor = ::SetCursor (::LoadCursor (NULL, IDC_WAIT)); pcMachineCombo = GetDlgItem(IDC_MACHINE_COMBO); // Get current combo box text pcMachineCombo->GetWindowText (szNewMachineName, MAX_PATH); // see if it's in the combo box already lMatchIndex = (long)pcMachineCombo->SendMessage ( CB_FINDSTRING,(WPARAM)-1, (LPARAM)szNewMachineName); // if name is in list, then select it if (lMatchIndex != CB_ERR) { // this name is already in the list so see if it's the same as the last selected machine if (lstrcmpi (szNewMachineName, cpeMachineName) != 0) { // this is a different machine so update the display pcMachineCombo->SendMessage (CB_SETCURSEL, (WPARAM)lMatchIndex); LoadMachineObjects (TRUE); LoadCountersAndInstances (); } } else { // not in list so try to add it status = PdhConnectMachine (szNewMachineName); if (status == ERROR_SUCCESS) { // if successful, add string to combo box lMatchIndex = pcMachineCombo->SendMessage (CB_ADDSTRING, 0, (LPARAM)szNewMachineName); pcMachineCombo->SendMessage (CB_SETCURSEL, (WPARAM)lMatchIndex); // update other fields LoadMachineObjects (); // no need to update since it was just connected LoadCountersAndInstances (); } else { mbStatus = MessageBox (TEXT("Unable to connect to machine"), NULL, MB_ICONEXCLAMATION | MB_TASKMODAL | MB_OKCANCEL); if (mbStatus == IDCANCEL) { GetDlgItem(IDC_MACHINE_COMBO)->SetFocus(); } else { pcMachineCombo->SendMessage (CB_SETCURSEL, wpLastMachineSel); } } } ::SetCursor (hOldCursor); } void CBrowsCountersDlg::OnSelchangeObjectCombo() { LoadCountersAndInstances(); } void CBrowsCountersDlg::OnSelchangeCounterList() { } void CBrowsCountersDlg::OnSelchangeInstanceList() { } void CBrowsCountersDlg::OnUseLocalMachine() { BOOL bMode; bMode = !(BOOL)IsDlgButtonChecked(IDC_USE_LOCAL_MACHINE); GetDlgItem(IDC_MACHINE_COMBO)->EnableWindow(bMode); bIncludeMachineInPath = bMode; } void CBrowsCountersDlg::OnSelectMachine() { BOOL bMode ; bMode = (BOOL)IsDlgButtonChecked(IDC_SELECT_MACHINE); GetDlgItem(IDC_MACHINE_COMBO)->EnableWindow(bMode); bIncludeMachineInPath = bMode; } void CBrowsCountersDlg::OnAllInstances() { BOOL bMode; CWnd *pInstanceList; bMode = (BOOL)IsDlgButtonChecked(IDC_ALL_INSTANCES); pInstanceList = GetDlgItem(IDC_INSTANCE_LIST); // if "Sselect ALL" then clear list box selections and disable if (bMode) { pInstanceList->SendMessage(LB_SETSEL, FALSE, (LPARAM)-1); } pInstanceList->EnableWindow(!bMode); bWildCardInstances = bMode; } void CBrowsCountersDlg::OnUseInstanceList() { BOOL bMode; CWnd *pInstanceList; bMode = (BOOL)IsDlgButtonChecked(IDC_USE_INSTANCE_LIST); pInstanceList = GetDlgItem(IDC_INSTANCE_LIST); // enable list box and select 1st Instance pInstanceList->EnableWindow(bMode); if (bMode) { if (pInstanceList->SendMessage(LB_GETCOUNT) > 0) { pInstanceList->SendMessage (LB_SETSEL, TRUE, 0); } } bWildCardInstances = !bMode; } void CBrowsCountersDlg::OnHelp() { } void CBrowsCountersDlg::OnNetwork() { }