/*++ Copyright (C) 1998-1999 Microsoft Corporation Module Name: provprop.cpp Abstract: Implementation of the trace providers general property page. --*/ #include "stdafx.h" #include // For xxx_TIME_VALUE #include "smlogs.h" #include "smcfgmsg.h" #include "provdlg.h" #include "warndlg.h" #include "enabldlg.h" #include "provprop.h" #include #include "dialogs.h" #include "smlogres.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif USE_HANDLE_MACROS("SMLOGCFG(provprop.cpp)"); static ULONG s_aulHelpIds[] = { IDC_PROV_FILENAME_DISPLAY, IDH_PROV_FILENAME_DISPLAY, IDC_PROV_PROVIDER_LIST, IDH_PROV_PROVIDER_LIST, IDC_PROV_ADD_BTN, IDH_PROV_ADD_BTN, IDC_PROV_REMOVE_BTN, IDH_PROV_REMOVE_BTN, IDC_PROV_KERNEL_BTN, IDH_PROV_KERNEL_BTN, IDC_PROV_OTHER_BTN, IDH_PROV_OTHER_BTN, IDC_PROV_K_PROCESS_CHK, IDH_PROV_K_PROCESS_CHK, IDC_PROV_K_THREAD_CHK, IDH_PROV_K_THREAD_CHK, IDC_PROV_K_DISK_IO_CHK, IDH_PROV_K_DISK_IO_CHK, IDC_PROV_K_NETWORK_CHK, IDH_PROV_K_NETWORK_CHK, IDC_PROV_K_SOFT_PF_CHK, IDH_PROV_K_SOFT_PF_CHK, IDC_PROV_K_FILE_IO_CHK, IDH_PROV_K_FILE_IO_CHK, IDC_PROV_SHOW_PROVIDERS_BTN, IDH_PROV_SHOW_PROVIDERS_BTN, IDC_RUNAS_EDIT, IDH_RUNAS_EDIT, IDC_SETPWD_BTN, IDH_SETPWD_BTN, 0,0 }; ///////////////////////////////////////////////////////////////////////////// // CProvidersProperty property page IMPLEMENT_DYNCREATE(CProvidersProperty, CSmPropertyPage) CProvidersProperty::CProvidersProperty(MMC_COOKIE lCookie, LONG_PTR hConsole) : CSmPropertyPage ( CProvidersProperty::IDD, hConsole ) // lCookie is really the pointer to the Log Query object { // ::OutputDebugStringA("\nCProvidersProperty::CProvidersProperty"); // save pointers from arg list m_pTraceLogQuery = reinterpret_cast (lCookie); ASSERT ( m_pTraceLogQuery->CastToTraceLogQuery() ); m_pQuery = dynamic_cast (m_pTraceLogQuery); m_dwMaxHorizListExtent = 0; m_dwTraceMode = eTraceModeApplication; // EnableAutomation(); //{{AFX_DATA_INIT(CProvidersProperty) m_bNonsystemProvidersExist = TRUE; m_bEnableProcessTrace = FALSE; m_bEnableThreadTrace = FALSE; m_bEnableDiskIoTrace = FALSE; m_bEnableNetworkTcpipTrace = FALSE; m_bEnableMemMgmtTrace = FALSE; m_bEnableFileIoTrace = FALSE; //}}AFX_DATA_INIT } CProvidersProperty::CProvidersProperty() : CSmPropertyPage(CProvidersProperty::IDD) { ASSERT (FALSE); // the constructor w/ args should be used instead EnableAutomation(); //{{AFX_DATA_INIT(CProvidersProperty) m_bNonsystemProvidersExist = TRUE; m_bEnableProcessTrace = FALSE; m_bEnableThreadTrace = FALSE; m_bEnableDiskIoTrace = FALSE; m_bEnableNetworkTcpipTrace = FALSE; m_bEnableMemMgmtTrace = FALSE; m_bEnableFileIoTrace = FALSE; //}}AFX_DATA_INIT m_pTraceLogQuery = NULL; } CProvidersProperty::~CProvidersProperty() { // ::OutputDebugStringA("\nCProvidersProperty::~CProvidersProperty"); } void CProvidersProperty::OnFinalRelease() { // When the last reference for an automation object is released // OnFinalRelease is called. The base class will automatically // deletes the object. Add additional cleanup required for your // object before calling the base class. CPropertyPage::OnFinalRelease(); } void CProvidersProperty::DoDataExchange(CDataExchange* pDX) { AFX_MANAGE_STATE(AfxGetStaticModuleState( )); DoProvidersDataExchange ( pDX ); TraceModeRadioExchange ( pDX ); CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CProvidersProperty) DDX_Text(pDX, IDC_PROV_LOG_SCHED_TEXT, m_strStartText); DDX_Text(pDX, IDC_RUNAS_EDIT, m_strUserDisplay ); DDX_Check(pDX, IDC_PROV_K_PROCESS_CHK, m_bEnableProcessTrace); DDX_Check(pDX, IDC_PROV_K_THREAD_CHK, m_bEnableThreadTrace); DDX_Check(pDX, IDC_PROV_K_DISK_IO_CHK, m_bEnableDiskIoTrace); DDX_Check(pDX, IDC_PROV_K_NETWORK_CHK, m_bEnableNetworkTcpipTrace); DDX_Check(pDX, IDC_PROV_K_SOFT_PF_CHK, m_bEnableMemMgmtTrace); DDX_Check(pDX, IDC_PROV_K_FILE_IO_CHK, m_bEnableFileIoTrace); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CProvidersProperty, CSmPropertyPage) //{{AFX_MSG_MAP(CProvidersProperty) ON_BN_CLICKED(IDC_PROV_KERNEL_BTN, OnProvTraceModeRdo) ON_BN_CLICKED(IDC_PROV_OTHER_BTN, OnProvTraceModeRdo) ON_BN_CLICKED(IDC_PROV_SHOW_PROVIDERS_BTN, OnProvShowProvBtn) ON_BN_CLICKED(IDC_PROV_ADD_BTN, OnProvAddBtn) ON_BN_CLICKED(IDC_PROV_REMOVE_BTN, OnProvRemoveBtn) ON_LBN_DBLCLK(IDC_PROV_PROVIDER_LIST, OnDblclkProvProviderList) ON_LBN_SELCANCEL(IDC_PROV_PROVIDER_LIST, OnSelcancelProvProviderList) ON_LBN_SELCHANGE(IDC_PROV_PROVIDER_LIST, OnSelchangeProvProviderList) ON_BN_CLICKED(IDC_PROV_K_PROCESS_CHK, OnProvKernelEnableCheck) ON_BN_CLICKED(IDC_PROV_K_THREAD_CHK, OnProvKernelEnableCheck) ON_EN_CHANGE( IDC_RUNAS_EDIT, OnChangeUser ) ON_BN_CLICKED(IDC_PROV_K_DISK_IO_CHK, OnProvKernelEnableCheck) ON_BN_CLICKED(IDC_PROV_K_NETWORK_CHK, OnProvKernelEnableCheck) ON_BN_CLICKED(IDC_PROV_K_FILE_IO_CHK, OnProvKernelEnableCheck) ON_BN_CLICKED(IDC_PROV_K_SOFT_PF_CHK, OnProvKernelEnableCheck) ON_BN_CLICKED(IDC_SETPWD_BTN, OnPwdBtn) ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() BEGIN_DISPATCH_MAP(CProvidersProperty, CSmPropertyPage) //{{AFX_DISPATCH_MAP(CProvidersProperty) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_DISPATCH_MAP END_DISPATCH_MAP() // Note: we add support for IID_IProvidersProperty to support typesafe binding // from VBA. This IID must match the GUID that is attached to the // dispinterface in the .ODL file. // {65154EA9-BDBE-11D1-BF99-00C04F94A83A} static const IID IID_IProvidersProperty = { 0x65154ea9, 0xbdbe, 0x11d1, { 0xbf, 0x99, 0x0, 0xc0, 0x4f, 0x94, 0xa8, 0x3a } }; BEGIN_INTERFACE_MAP(CProvidersProperty, CSmPropertyPage) INTERFACE_PART(CProvidersProperty, IID_IProvidersProperty, Dispatch) END_INTERFACE_MAP() ///////////////////////////////////////////////////////////////////////////// // CProvidersProperty message handlers void CProvidersProperty::OnChangeUser() { // // If you can not access remote WBEM, you can not modify RunAs info, // changing the user name is not allowed. // if (m_bCanAccessRemoteWbem) { // When the user hits OK in the password dialog, // the user name might not have changed. UpdateData ( TRUE ); m_strUserDisplay.TrimLeft(); m_strUserDisplay.TrimRight(); if ( 0 != m_strUserSaved.Compare ( m_strUserDisplay ) ) { m_pTraceLogQuery->m_fDirtyPassword = PASSWORD_DIRTY; SetModifiedPage(TRUE); } else { m_pTraceLogQuery->m_fDirtyPassword &= ~PASSWORD_DIRTY; } // // If default user is typed, never need to set password // if (m_strUserDisplay.IsEmpty() || m_strUserDisplay.GetAt(0) == L'<') { if (m_bPwdButtonEnabled) { GetDlgItem(IDC_SETPWD_BTN)->EnableWindow(FALSE); m_bPwdButtonEnabled = FALSE; } } else { if (!m_bPwdButtonEnabled) { GetDlgItem(IDC_SETPWD_BTN)->EnableWindow(TRUE); m_bPwdButtonEnabled = TRUE; } } } else { // // We can not modify the RunAs info, then display // an error message and retore the original user name in RunAs // UpdateData(TRUE); if (ConnectRemoteWbemFail(m_pTraceLogQuery, FALSE)) { GetDlgItem(IDC_RUNAS_EDIT)->SetWindowText(m_strUserSaved); } } } void CProvidersProperty::OnPwdBtn() { CString strTempUser; UpdateData(); if (!m_bCanAccessRemoteWbem) { ConnectRemoteWbemFail(m_pTraceLogQuery, TRUE); return; } MFC_TRY strTempUser = m_strUserDisplay; m_strUserDisplay.TrimLeft(); m_strUserDisplay.TrimRight(); m_pTraceLogQuery->m_strUser = m_strUserDisplay; SetRunAs(m_pTraceLogQuery); m_strUserDisplay = m_pTraceLogQuery->m_strUser; if ( 0 != strTempUser.CompareNoCase ( m_strUserDisplay ) ) { SetDlgItemText ( IDC_RUNAS_EDIT, m_strUserDisplay ); } MFC_CATCH_MINIMUM; } void CProvidersProperty::OnProvAddBtn() { ImplementAdd(); } void CProvidersProperty::OnProvRemoveBtn() { CListBox *plbProviderList; CDC* pCDC = NULL; LONG lThisItem; BOOL bDone; LONG lOrigCaret = 0; LONG lItemStatus; LONG lItemCount; BOOL bChanged = FALSE; DWORD dwItemExtent; CString strItemText; plbProviderList = (CListBox *)GetDlgItem(IDC_PROV_PROVIDER_LIST); // delete all selected items in the list box and // set the cursor to the item above the original caret position // or the first or last if that is out of the new range if ( NULL != plbProviderList ) { pCDC = plbProviderList->GetDC(); if ( NULL != pCDC ) { lOrigCaret = plbProviderList->GetCaretIndex(); lThisItem = 0; bDone = FALSE; // clear the max extent m_dwMaxHorizListExtent = 0; // clear the value do { lItemStatus = plbProviderList->GetSel(lThisItem); if (lItemStatus > 0) { // then it's selected so delete it INT iProvIndex = (INT)plbProviderList->GetItemData ( lThisItem ); m_arrGenProviders[iProvIndex] = CSmTraceLogQuery::eNotInQuery; plbProviderList->DeleteString ( lThisItem ); bChanged = TRUE; } else if (lItemStatus == 0) { // get the text length of this item since it will stay plbProviderList->GetText(lThisItem, strItemText); dwItemExtent = (DWORD)(pCDC->GetTextExtent(strItemText)).cx; if (dwItemExtent > m_dwMaxHorizListExtent) { m_dwMaxHorizListExtent = dwItemExtent; } // then it's not selected so go to the next one lThisItem++; } else { // we've run out so exit bDone = TRUE; } } while (!bDone); } if ( NULL != pCDC ) { plbProviderList->ReleaseDC(pCDC); pCDC = NULL; } // update the text extent of the list box plbProviderList->SetHorizontalExtent(m_dwMaxHorizListExtent); // see how many entries are left and update the // caret position and the remove button state lItemCount = plbProviderList->GetCount(); if (lItemCount > 0) { // the update the caret if (lOrigCaret >= lItemCount) { lOrigCaret = lItemCount-1; } else { // caret should be within the list } plbProviderList->SetSel(lOrigCaret); plbProviderList->SetCaretIndex(lOrigCaret); } else { // the list is empty so remove caret, selection plbProviderList->SetSel(-1); if ( eTraceModeApplication == m_dwTraceMode ) GetDlgItem(IDC_PROV_ADD_BTN)->SetFocus(); } SetTraceModeState(); SetModifiedPage(bChanged); } } void CProvidersProperty::OnDblclkProvProviderList() { ImplementAdd(); } void CProvidersProperty::OnSelcancelProvProviderList() { SetAddRemoveBtnState(); } void CProvidersProperty::OnSelchangeProvProviderList() { SetAddRemoveBtnState(); } void CProvidersProperty::DoProvidersDataExchange ( CDataExchange* pDX) { CListBox* plbInQueryProviders = (CListBox *)GetDlgItem(IDC_PROV_PROVIDER_LIST); long lNumProviders; CDC* pCDC = NULL; if ( m_bNonsystemProvidersExist && NULL != plbInQueryProviders ) { pCDC = plbInQueryProviders->GetDC(); if ( NULL != pCDC ) { if ( TRUE == pDX->m_bSaveAndValidate ) { // update the provider array based on list box contents. lNumProviders = plbInQueryProviders->GetCount(); if (lNumProviders != LB_ERR) { long lThisProvider; INT iProvIndex; // Reset InQuery array, retaining state for eInactive providers. m_pTraceLogQuery->GetInQueryProviders ( m_arrGenProviders ); // Reset eInQuery to eNotInQuery, in case some were removed from the query. for ( iProvIndex = 0; iProvIndex < m_arrGenProviders.GetSize(); iProvIndex++ ) { if ( CSmTraceLogQuery::eInQuery == m_arrGenProviders[iProvIndex] ) m_arrGenProviders[iProvIndex] = CSmTraceLogQuery::eNotInQuery; } lThisProvider = 0; while (lThisProvider < lNumProviders) { iProvIndex = (INT)plbInQueryProviders->GetItemData( lThisProvider ); m_arrGenProviders[iProvIndex] = CSmTraceLogQuery::eInQuery; lThisProvider++; } } } else { // Reset the list box. CString strProviderName; INT iProvIndex; DWORD dwItemExtent; ASSERT( NULL != m_pTraceLogQuery ); //load nonsystem provider list box from string in provider list plbInQueryProviders->ResetContent(); for ( iProvIndex = 0; iProvIndex < m_arrGenProviders.GetSize(); iProvIndex++ ) { if ( CSmTraceLogQuery::eInQuery == m_arrGenProviders[iProvIndex] ) { INT iAddIndex; GetProviderDescription( iProvIndex, strProviderName ); iAddIndex = plbInQueryProviders->AddString ( strProviderName ); plbInQueryProviders->SetItemData ( iAddIndex, ( DWORD ) iProvIndex ); // update list box extent dwItemExtent = (DWORD)(pCDC->GetTextExtent(strProviderName)).cx; if (dwItemExtent > m_dwMaxHorizListExtent) { m_dwMaxHorizListExtent = dwItemExtent; plbInQueryProviders->SetHorizontalExtent(dwItemExtent); } } } } } if ( NULL != pCDC ) { plbInQueryProviders->ReleaseDC(pCDC); pCDC = NULL; } } } BOOL CProvidersProperty::IsValidLocalData( ) { BOOL bIsValid = TRUE; ResourceStateManager rsm; if ( eTraceModeKernel == m_dwTraceMode ) { DWORD dwKernelFlags = 0; // Ensure that the user has enabled at least one of the 4 basic Kernel traces. if ( m_bEnableProcessTrace ) { dwKernelFlags |= SLQ_TLI_ENABLE_PROCESS_TRACE; } if ( m_bEnableThreadTrace ) { dwKernelFlags |= SLQ_TLI_ENABLE_THREAD_TRACE; } if ( m_bEnableDiskIoTrace ) { dwKernelFlags |= SLQ_TLI_ENABLE_DISKIO_TRACE; } if ( m_bEnableNetworkTcpipTrace ) { dwKernelFlags |= SLQ_TLI_ENABLE_NETWORK_TCPIP_TRACE; } if ( 0 == dwKernelFlags ) { CString strMsg; strMsg.LoadString ( IDS_KERNEL_PROVIDERS_REQUIRED ); MessageBox ( strMsg, m_pTraceLogQuery->GetLogName(), MB_OK | MB_ICONERROR); SetFocusAnyPage ( IDC_PROV_KERNEL_BTN ); bIsValid = FALSE; } } else { CListBox * plbInQueryProviders = (CListBox *)GetDlgItem(IDC_PROV_PROVIDER_LIST); if ( !m_bNonsystemProvidersExist || 0 == plbInQueryProviders->GetCount() ) { CString strMsg; strMsg.LoadString ( IDS_APP_PROVIDERS_REQUIRED ); MessageBox ( strMsg, m_pTraceLogQuery->GetLogName(), MB_OK | MB_ICONERROR); SetFocusAnyPage ( IDC_PROV_ADD_BTN ); bIsValid = FALSE; } } return bIsValid; } void CProvidersProperty::OnProvTraceModeRdo() { UpdateData ( TRUE ); SetModifiedPage ( TRUE ); } void CProvidersProperty::OnCancel() { m_pTraceLogQuery->SyncPropPageSharedData(); // clear memory shared between property pages. } BOOL CProvidersProperty::OnApply() { BOOL bContinue = TRUE; bContinue = UpdateData ( TRUE ); if ( bContinue ) { bContinue = IsValidData(m_pTraceLogQuery, VALIDATE_APPLY ); } // Write the data to the query. if ( bContinue ) { if ( eTraceModeKernel == m_dwTraceMode ) { DWORD dwKernelFlags = 0; INT iProvIndex; if ( m_bEnableProcessTrace ) { dwKernelFlags |= SLQ_TLI_ENABLE_PROCESS_TRACE; } if ( m_bEnableThreadTrace ) { dwKernelFlags |= SLQ_TLI_ENABLE_THREAD_TRACE; } if ( m_bEnableDiskIoTrace ) { dwKernelFlags |= SLQ_TLI_ENABLE_DISKIO_TRACE; } if ( m_bEnableNetworkTcpipTrace ) { dwKernelFlags |= SLQ_TLI_ENABLE_NETWORK_TCPIP_TRACE; } // Ensure that the user has enabled at least one of the 4 basic Kernel traces. ASSERT ( 0 != dwKernelFlags ); if ( m_bEnableMemMgmtTrace ) { dwKernelFlags |= SLQ_TLI_ENABLE_MEMMAN_TRACE; } if ( m_bEnableFileIoTrace ) { dwKernelFlags |= SLQ_TLI_ENABLE_FILEIO_TRACE; } m_pTraceLogQuery->SetKernelFlags (dwKernelFlags); // Erase all InQuery providers. for ( iProvIndex = 0; iProvIndex < m_arrGenProviders.GetSize(); iProvIndex++ ) { if ( CSmTraceLogQuery::eInQuery == m_arrGenProviders[iProvIndex] ) m_arrGenProviders[iProvIndex] = CSmTraceLogQuery::eNotInQuery; } m_pTraceLogQuery->SetInQueryProviders ( m_arrGenProviders ); } else { CListBox * plbInQueryProviders = (CListBox *)GetDlgItem(IDC_PROV_PROVIDER_LIST); ASSERT ( 0 < plbInQueryProviders->GetCount() ); m_pTraceLogQuery->SetInQueryProviders ( m_arrGenProviders ); // Reset kernel flags m_pTraceLogQuery->SetKernelFlags (0); } } if ( bContinue ) { // ApplyRunAs must be called before UpdateService bContinue = ApplyRunAs(m_pTraceLogQuery); } if ( bContinue ){ bContinue = CSmPropertyPage::OnApply(); } if ( bContinue ) { // Save property page shared data. m_pTraceLogQuery->UpdatePropPageSharedData(); bContinue = UpdateService ( m_pTraceLogQuery, TRUE ); } return bContinue; } BOOL CProvidersProperty::OnInitDialog() { DWORD dwStatus; DWORD dwKernelFlags; CListBox * plbInQueryProviders; BOOL bDeleteInactiveProviders = FALSE; INT iIndex; ResourceStateManager rsm; // // Here m_pTraceLogQuery should not be NULL, if it is, // There must be something wrong. // if ( NULL == m_pTraceLogQuery ) { return TRUE; } m_bCanAccessRemoteWbem = m_pTraceLogQuery->GetLogService()->CanAccessWbemRemote(); m_pTraceLogQuery->SetActivePropertyPage( this ); dwStatus = m_pTraceLogQuery->InitGenProvidersArray(); if ( SMCFG_INACTIVE_PROVIDER == dwStatus ) { CString strMessage; CString strSysMessage; INT_PTR iResult; FormatSmLogCfgMessage ( strMessage, m_hModule, SMCFG_INACTIVE_PROVIDER, m_pTraceLogQuery->GetLogName() ); iIndex = m_pTraceLogQuery->GetFirstInactiveIndex(); while ( -1 != iIndex ) { CString strNextName; GetProviderDescription( iIndex, strNextName ); strMessage += L"\n "; strMessage += strNextName; iIndex = m_pTraceLogQuery->GetNextInactiveIndex(); } iResult = MessageBox( (LPCWSTR)strMessage, m_pTraceLogQuery->GetLogName(), MB_YESNO | MB_ICONWARNING ); if ( IDYES == iResult ) { bDeleteInactiveProviders = TRUE; } } // Continue even if no active providers exist. plbInQueryProviders = (CListBox *)GetDlgItem(IDC_PROV_PROVIDER_LIST); // Initialize from model. dwStatus = m_pTraceLogQuery->GetInQueryProviders ( m_arrGenProviders ); if ( bDeleteInactiveProviders ) { // Delete all inactive providers iIndex = m_pTraceLogQuery->GetFirstInactiveIndex(); while ( -1 != iIndex ) { m_arrGenProviders[iIndex] = CSmTraceLogQuery::eNotInQuery; iIndex = m_pTraceLogQuery->GetNextInactiveIndex(); } } m_bNonsystemProvidersExist = FALSE; for ( iIndex = 0; iIndex < m_arrGenProviders.GetSize(); iIndex++ ) { if ( m_pTraceLogQuery->IsActiveProvider ( iIndex ) ) { m_bNonsystemProvidersExist = TRUE; break; } } m_pTraceLogQuery->GetKernelFlags (dwKernelFlags); if ( (dwKernelFlags & SLQ_TLI_ENABLE_KERNEL_TRACE) != 0) { // NT5 Beta2 Kernel trace flag in use to cover all four basic trace. m_bEnableProcessTrace = TRUE; m_bEnableThreadTrace = TRUE; m_bEnableDiskIoTrace = TRUE; m_bEnableNetworkTcpipTrace = TRUE; } else { m_bEnableProcessTrace = (BOOL)((dwKernelFlags & SLQ_TLI_ENABLE_PROCESS_TRACE) != 0); m_bEnableThreadTrace = (BOOL)((dwKernelFlags & SLQ_TLI_ENABLE_THREAD_TRACE) != 0); m_bEnableDiskIoTrace = (BOOL)((dwKernelFlags & SLQ_TLI_ENABLE_DISKIO_TRACE) != 0); m_bEnableNetworkTcpipTrace = (BOOL)((dwKernelFlags & SLQ_TLI_ENABLE_NETWORK_TCPIP_TRACE) != 0); } m_bEnableMemMgmtTrace = (BOOL)((dwKernelFlags & SLQ_TLI_ENABLE_MEMMAN_TRACE) != 0); m_bEnableFileIoTrace = (BOOL)((dwKernelFlags & SLQ_TLI_ENABLE_FILEIO_TRACE) != 0); m_dwTraceMode = ( 0 != dwKernelFlags ) ? eTraceModeKernel : eTraceModeApplication; if ( eTraceModeApplication == m_dwTraceMode ) { // If initial mode is set to Application, initialize the Kernel // trace events to the default. m_bEnableProcessTrace = TRUE; m_bEnableThreadTrace = TRUE; m_bEnableDiskIoTrace = TRUE; m_bEnableNetworkTcpipTrace = TRUE; } CSmPropertyPage::OnInitDialog(); SetHelpIds ( (DWORD*)&s_aulHelpIds ); Initialize( m_pTraceLogQuery ); m_strUserDisplay = m_pTraceLogQuery->m_strUser; m_strUserSaved = m_strUserDisplay; SetDetailsGroupBoxMode(); SetTraceModeState(); if ( m_bNonsystemProvidersExist ) { if ( 0 < plbInQueryProviders->GetCount() ) { // select first entry plbInQueryProviders->SetSel (0, TRUE); plbInQueryProviders->SetCaretIndex (0, TRUE); } else { plbInQueryProviders->SetSel (-1, TRUE); GetDlgItem(IDC_PROV_ADD_BTN)->SetFocus(); } } else { CString strNoProviders; strNoProviders.LoadString( IDS_PROV_NO_PROVIDERS ); plbInQueryProviders->AddString( strNoProviders ); plbInQueryProviders->EnableWindow(FALSE); GetDlgItem(IDC_PROV_REMOVE_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_PROV_ADD_BTN)->EnableWindow(FALSE); } if (m_pTraceLogQuery->GetLogService()->TargetOs() == OS_WIN2K) { GetDlgItem(IDC_RUNAS_STATIC)->EnableWindow(FALSE); GetDlgItem(IDC_RUNAS_EDIT)->EnableWindow(FALSE); } if (m_pTraceLogQuery->GetLogService()->TargetOs() == OS_WIN2K || m_strUserDisplay.IsEmpty() || m_strUserDisplay.GetAt(0) == L'<') { GetDlgItem(IDC_SETPWD_BTN)->EnableWindow(FALSE); m_bPwdButtonEnabled = FALSE; } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CProvidersProperty::PostNcDestroy() { // delete this; if ( NULL != m_pTraceLogQuery ) { m_pTraceLogQuery->SetActivePropertyPage( NULL ); } CPropertyPage::PostNcDestroy(); } // // Helper functions. // void CProvidersProperty::SetAddRemoveBtnState ( void ) { if ( m_bNonsystemProvidersExist ) { if ( eTraceModeKernel == m_dwTraceMode ) { GetDlgItem(IDC_PROV_REMOVE_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_PROV_ADD_BTN)->EnableWindow(FALSE); } else { CListBox * plbInQueryProviders = (CListBox *)GetDlgItem(IDC_PROV_PROVIDER_LIST); INT iTotalCount; iTotalCount = plbInQueryProviders->GetCount(); if ( 0 < plbInQueryProviders->GetSelCount() ) { GetDlgItem(IDC_PROV_REMOVE_BTN)->EnableWindow(TRUE); } else { GetDlgItem(IDC_PROV_REMOVE_BTN)->EnableWindow(FALSE); } if ( iTotalCount < m_arrGenProviders.GetSize() ) { GetDlgItem(IDC_PROV_ADD_BTN)->EnableWindow(TRUE); } else { GetDlgItem(IDC_PROV_ADD_BTN)->EnableWindow(FALSE); } if ( 0 == iTotalCount ) { plbInQueryProviders->SetSel(-1); } } } } // // Return the description for the trace provider specified by // InQuery array index. // DWORD CProvidersProperty::GetProviderDescription ( INT iProvIndex, CString& rstrDesc ) { ASSERT ( NULL != m_pTraceLogQuery ); rstrDesc = m_pTraceLogQuery->GetProviderDescription ( iProvIndex ); // If the description is empty, build name from guid. if ( rstrDesc.IsEmpty() ) { CString strGuid; ASSERT( !m_pTraceLogQuery->IsActiveProvider( iProvIndex) ); strGuid = m_pTraceLogQuery->GetProviderGuid( iProvIndex ); rstrDesc.Format ( IDS_PROV_UNKNOWN, strGuid ); } return ERROR_SUCCESS; } BOOL CProvidersProperty::IsEnabledProvider( INT iIndex ) { ASSERT ( NULL != m_pTraceLogQuery ); return ( m_pTraceLogQuery->IsEnabledProvider ( iIndex ) ); } BOOL CProvidersProperty::IsActiveProvider( INT iIndex ) { ASSERT ( NULL != m_pTraceLogQuery ); return ( m_pTraceLogQuery->IsActiveProvider ( iIndex ) ); } LPCWSTR CProvidersProperty::GetKernelProviderDescription( void ) { ASSERT ( NULL != m_pTraceLogQuery ); return ( m_pTraceLogQuery->GetKernelProviderDescription ( ) ); } BOOL CProvidersProperty::GetKernelProviderEnabled( void ) { ASSERT ( NULL != m_pTraceLogQuery ); return ( m_pTraceLogQuery->GetKernelProviderEnabled ( ) ); } // // Update the provided InQuery array to match the stored version. // DWORD CProvidersProperty::GetInQueryProviders( CArray& rarrOut ) { DWORD dwStatus = ERROR_SUCCESS; int iIndex; rarrOut.RemoveAll(); rarrOut.SetSize( m_arrGenProviders.GetSize() ); for ( iIndex = 0; iIndex < rarrOut.GetSize(); iIndex++ ) { rarrOut[iIndex] = m_arrGenProviders[iIndex]; } return dwStatus; } // // Load the stored InQuery providers array // based on the provided version. // DWORD CProvidersProperty::SetInQueryProviders( CArray& rarrIn ) { DWORD dwStatus = ERROR_SUCCESS; int iProvIndex; m_arrGenProviders.RemoveAll(); m_arrGenProviders.SetSize( rarrIn.GetSize() ); for ( iProvIndex = 0; iProvIndex < m_arrGenProviders.GetSize(); iProvIndex++ ) { m_arrGenProviders[iProvIndex] = rarrIn[iProvIndex]; } return dwStatus; } void CProvidersProperty::ImplementAdd( void ) { INT_PTR iReturn = IDCANCEL; { AFX_MANAGE_STATE(AfxGetStaticModuleState( )); CProviderListDlg dlgAddProviders(this); // Workaround for popup to store pointer to this page. dlgAddProviders.SetProvidersPage( this ); iReturn = dlgAddProviders.DoModal(); } if ( IDOK == iReturn ) { LONG lBeforeCount; LONG lAfterCount; CListBox *plbProviderList; plbProviderList = (CListBox *)GetDlgItem(IDC_PROV_PROVIDER_LIST); // Providers array is modified by the add dialog OnOK procedure. lBeforeCount = plbProviderList->GetCount(); UpdateData ( FALSE ); lAfterCount = plbProviderList->GetCount(); SetAddRemoveBtnState(); if ( lAfterCount > lBeforeCount ) { SetModifiedPage ( TRUE ); } } } void CProvidersProperty::UpdateLogStartString () { eStartType eCurrentStartType; int nResId = 0; ResourceStateManager rsm; eCurrentStartType = DetermineCurrentStartType(); if ( eStartManually == eCurrentStartType ) { nResId = IDS_LOG_START_MANUALLY; } else if ( eStartImmediately == eCurrentStartType ) { nResId = IDS_LOG_START_IMMED; } else if ( eStartSched == eCurrentStartType ) { nResId = IDS_LOG_START_SCHED; } if ( 0 != nResId ) { m_strStartText.LoadString(nResId); } else { m_strStartText.Empty(); } return; } void CProvidersProperty::UpdateFileNameString () { m_strFileNameDisplay.Empty(); CreateSampleFileName ( m_pTraceLogQuery->GetLogName(), m_pTraceLogQuery->GetLogService()->GetMachineName(), m_SharedData.strFolderName, m_SharedData.strFileBaseName, m_SharedData.strSqlName, m_SharedData.dwSuffix, m_SharedData.dwLogFileType, m_SharedData.dwSerialNumber, m_strFileNameDisplay); SetDlgItemText( IDC_PROV_FILENAME_DISPLAY, m_strFileNameDisplay ); // Clear the selection ((CEdit*)GetDlgItem( IDC_PROV_FILENAME_DISPLAY ))->SetSel ( -1, 0 ); return; } BOOL CProvidersProperty::OnSetActive() { BOOL bReturn; bReturn = CSmPropertyPage::OnSetActive(); if (!bReturn) return FALSE; ResourceStateManager rsm; m_pTraceLogQuery->GetPropPageSharedData ( &m_SharedData ); UpdateFileNameString(); UpdateLogStartString(); m_strUserDisplay = m_pTraceLogQuery->m_strUser; UpdateData(FALSE); //to load the edit & combo box return TRUE; } BOOL CProvidersProperty::OnKillActive() { BOOL bContinue = TRUE; bContinue = CPropertyPage::OnKillActive(); if ( bContinue ) { m_pTraceLogQuery->m_strUser = m_strUserDisplay; bContinue = IsValidData(m_pTraceLogQuery, VALIDATE_FOCUS ); } // The providers page does not modify shared data, so no reason to update it. if ( bContinue ) { SetIsActive ( FALSE ); } return bContinue; } void CProvidersProperty::OnProvKernelEnableCheck() { BOOL bMemFlag = m_bEnableMemMgmtTrace; BOOL bFileFlag = m_bEnableFileIoTrace; UpdateData(TRUE); SetModifiedPage(TRUE); bMemFlag = (!bMemFlag && m_bEnableMemMgmtTrace); bFileFlag = (!bFileFlag && m_bEnableFileIoTrace); if (bMemFlag || bFileFlag) { long nErr; HKEY hKey = NULL; DWORD dwWarnFlag; DWORD dwDataType = 0; DWORD dwDataSize = 0; DWORD dwDisposition; // User has checked expensive file io flag // check registry setting to see if we need to pop up warning dialog nErr = RegOpenKey( HKEY_CURRENT_USER, L"Software\\Microsoft\\PerformanceLogsandAlerts", &hKey ); dwWarnFlag = 0; if( nErr == ERROR_SUCCESS ) { dwDataSize = sizeof(DWORD); nErr = RegQueryValueExW( hKey, (bMemFlag ? L"NoWarnPageFault" : L"NoWarnFileIo"), NULL, &dwDataType, (LPBYTE) &dwWarnFlag, (LPDWORD) &dwDataSize ); if ( (dwDataType != REG_DWORD) || (dwDataSize != sizeof(DWORD))) dwWarnFlag = 0; nErr = RegCloseKey( hKey ); hKey = NULL; if( ERROR_SUCCESS != nErr ) { DisplayError( GetLastError(), L"Close PerfLog user key failed" ); } } if (!dwWarnFlag || nErr != ERROR_SUCCESS) { // Pop a dialog here. Need to do a RegQuerySetValue dialog is checked to keep quiet // bMemFlag & bFileFlag gives a clue about what it is doing CWarnDlg WarnDlg; AFX_MANAGE_STATE(AfxGetStaticModuleState( )); WarnDlg.SetProvidersPage( this ); if (IDOK == WarnDlg.DoModal()){ if (WarnDlg.m_CheckNoMore){ dwWarnFlag = WarnDlg.m_CheckNoMore; nErr = RegCreateKeyEx( HKEY_CURRENT_USER, L"Software\\Microsoft\\PerformanceLogsAndAlerts", 0, L"REG_DWORD", REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, &hKey, &dwDisposition); /* if(ERROR_SUCCESS == nErr){ if (dwDisposition == REG_CREATED_NEW_KEY){ //just in case I need this }else if (dwDisposition == REG_OPENED_EXISTING_KEY){ //Just in case I need this } } */ if( nErr == ERROR_SUCCESS ) { dwDataSize = sizeof(DWORD); nErr = RegSetValueEx(hKey, (bMemFlag ? L"NoWarnPageFault" : L"NoWarnFileIo" ), NULL, REG_DWORD, (LPBYTE) &dwWarnFlag, dwDataSize ); if( ERROR_SUCCESS != nErr ) { DisplayError( GetLastError(), L"Set PerfLog User warn value failed" ); } nErr = RegCloseKey( hKey ); hKey = NULL; if( ERROR_SUCCESS != nErr ) { DisplayError( GetLastError(), L"Close PerfLog user key failed" ); } } } } } } } void CProvidersProperty::OnProvShowProvBtn() { CActiveProviderDlg ProvLstDlg; AFX_MANAGE_STATE(AfxGetStaticModuleState( )); ProvLstDlg.SetProvidersPage( this ); ProvLstDlg.DoModal(); } /* void CProvidersProperty::OnProvDetailsBtn() { SetDetailsGroupBoxMode(); } */ BOOL CProvidersProperty::SetDetailsGroupBoxMode() { UINT nWindowState; ResourceStateManager rsm; nWindowState = SW_SHOW; GetDlgItem(IDC_PROV_K_PROCESS_CHK)->ShowWindow(nWindowState); GetDlgItem(IDC_PROV_K_THREAD_CHK)->ShowWindow(nWindowState); GetDlgItem(IDC_PROV_K_DISK_IO_CHK)->ShowWindow(nWindowState); GetDlgItem(IDC_PROV_K_NETWORK_CHK)->ShowWindow(nWindowState); GetDlgItem(IDC_PROV_K_SOFT_PF_CHK)->ShowWindow(nWindowState); GetDlgItem(IDC_PROV_K_FILE_IO_CHK)->ShowWindow(nWindowState); return TRUE; } void CProvidersProperty::TraceModeRadioExchange(CDataExchange* pDX) { if ( !pDX->m_bSaveAndValidate ) { // Load control value from data switch ( m_dwTraceMode ) { case eTraceModeKernel: m_nTraceModeRdo = 0; break; case eTraceModeApplication: m_nTraceModeRdo = 1; break; default: ; break; } } DDX_Radio(pDX, IDC_PROV_KERNEL_BTN, m_nTraceModeRdo); if ( pDX->m_bSaveAndValidate ) { switch ( m_nTraceModeRdo ) { case 0: m_dwTraceMode = eTraceModeKernel; break; case 1: m_dwTraceMode = eTraceModeApplication; break; default: ; break; } SetTraceModeState(); } } void CProvidersProperty::SetTraceModeState ( void ) { BOOL bEnable; bEnable = (eTraceModeKernel == m_dwTraceMode) ? TRUE : FALSE; // Kernel trace controls // GetDlgItem(IDC_PROV_SHOW_ADV_BTN)->EnableWindow(bEnable); GetDlgItem(IDC_PROV_K_PROCESS_CHK)->EnableWindow(bEnable); GetDlgItem(IDC_PROV_K_THREAD_CHK)->EnableWindow(bEnable); GetDlgItem(IDC_PROV_K_DISK_IO_CHK)->EnableWindow(bEnable); GetDlgItem(IDC_PROV_K_NETWORK_CHK)->EnableWindow(bEnable); GetDlgItem(IDC_PROV_K_SOFT_PF_CHK)->EnableWindow(bEnable); GetDlgItem(IDC_PROV_K_FILE_IO_CHK)->EnableWindow(bEnable); if ( m_bNonsystemProvidersExist ) { bEnable = !bEnable; // Application trace controls GetDlgItem(IDC_PROV_PROVIDER_LIST)->EnableWindow(bEnable); SetAddRemoveBtnState(); } } DWORD CProvidersProperty::GetGenProviderCount ( INT& iCount ) { return m_pTraceLogQuery->GetGenProviderCount( iCount ); } void CProvidersProperty::GetMachineDisplayName ( CString& rstrMachineName ) { m_pTraceLogQuery->GetMachineDisplayName( rstrMachineName ); return; } CSmTraceLogQuery* CProvidersProperty::GetTraceQuery ( void ) { return m_pTraceLogQuery; }