|
|
/*++
Copyright (C) 1998-1999 Microsoft Corporation
Module Name:
smproppg.cpp
Abstract:
Implementation of the property page base class.
--*/
#include "stdafx.h"
#include <wbemidl.h>
#include "smcfgmsg.h"
#include "smlogs.h"
#include "smproppg.h"
#include "dialogs.h"
#include <pdhp.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
USE_HANDLE_MACROS("SMLOGCFG(smproppg.cpp)");
/////////////////////////////////////////////////////////////////////////////
// CSmPropertyPage property page
IMPLEMENT_DYNCREATE ( CSmPropertyPage, CPropertyPage )
CSmPropertyPage::CSmPropertyPage ( UINT nIDTemplate, LONG_PTR hConsole, LPDATAOBJECT pDataObject ) : CPropertyPage ( nIDTemplate ), m_uiIdTemplate (nIDTemplate ), m_bIsActive ( FALSE ), m_bIsModifiedPage ( FALSE ), m_pdwHelpIds ( NULL ), m_hConsole (hConsole ), m_pDataObject ( pDataObject ), m_bCanAccessRemoteWbem ( TRUE), m_pQuery ( NULL ), m_bPwdButtonEnabled ( TRUE) { //::OutputDebugStringA("\nCSmProperty::CSmPropertyPage");
// Need to save the original callback pointer because we are replacing
// it with our own
m_pfnOriginalCallback = m_psp.pfnCallback;
// This makes sure the MFC module states will work correctly
MMCPropPageCallback( &m_psp );
// EnableAutomation();
//{{AFX_DATA_INIT(CSmPropertyPage)
//}}AFX_DATA_INIT
m_hModule = (HINSTANCE)GetModuleHandleW (_CONFIG_DLL_NAME_W_); }
CSmPropertyPage::CSmPropertyPage() : CPropertyPage(0xfff) // Unused template IDD
{ ASSERT (FALSE); // the constructor w/ args should be used instead
// //{{AFX_DATA_INIT(CSmPropertyPage)
// //}}AFX_DATA_INIT
}
CSmPropertyPage::~CSmPropertyPage() { }
BEGIN_MESSAGE_MAP(CSmPropertyPage, CPropertyPage) //{{AFX_MSG_MAP(CSmPropertyPage)
ON_WM_HELPINFO() ON_WM_CONTEXTMENU() ON_MESSAGE(PSM_QUERYSIBLINGS, OnQuerySiblings)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSmPropertyPage message handlers
UINT CALLBACK CSmPropertyPage::PropSheetPageProc ( HWND hWnd, // [in] Window handle - always null
UINT uMsg, // [in,out] Either the create or delete message
LPPROPSHEETPAGE pPsp // [in,out] Pointer to the property sheet struct
) { ASSERT( NULL != pPsp );
// We need to recover a pointer to the current instance. We can't just use
// "this" because we are in a static function
CSmPropertyPage* pMe = reinterpret_cast<CSmPropertyPage*>(pPsp->lParam); ASSERT( NULL != pMe ); if (!pMe) return 0;
switch( uMsg ) { case PSPCB_CREATE: break;
case PSPCB_RELEASE: // Since we are deleting ourselves, save a callback on the stack
// so we can callback the base class
//LPFNPSPCALLBACK pfnOrig = pMe->m_pfnOriginalCallback;
delete pMe; return 1; //(pfnOrig)(hWnd, uMsg, pPsp);
} // Must call the base class callback function or none of the MFC
// message map stuff will work
return (pMe->m_pfnOriginalCallback)(hWnd, uMsg, pPsp);
} // end PropSheetPageProc()
BOOL CSmPropertyPage::Initialize(CSmLogQuery* pQuery) { HRESULT hr; PPDH_PLA_INFO pInfo = NULL; DWORD dwInfoSize = 0; CString strMachineName; LPCWSTR pszMachineName = NULL;
if ( NULL != pQuery ) {
if (!pQuery->GetLogService()->IsLocalMachine()) { pszMachineName = pQuery->GetLogService()->GetMachineName(); }
hr = PdhPlaGetInfoW( (LPWSTR)(LPCWSTR)pQuery->GetLogName(), (LPWSTR)pszMachineName, &dwInfoSize, pInfo ); if( ERROR_SUCCESS == hr && 0 != dwInfoSize ){ pInfo = (PPDH_PLA_INFO)malloc(dwInfoSize); if( NULL != pInfo ) { if ( sizeof(PDH_PLA_INFO) <= dwInfoSize ) { pInfo->dwMask = PLA_INFO_FLAG_USER; hr = PdhPlaGetInfoW( (LPWSTR)(LPCWSTR)pQuery->GetLogName(), (LPWSTR)pszMachineName, &dwInfoSize, pInfo ); if( ERROR_SUCCESS == hr ){ pQuery->m_strUser = pInfo->strUser; } } free( pInfo ); } pQuery->m_fDirtyPassword = PASSWORD_CLEAN; } } return TRUE; }
BOOL CSmPropertyPage::OnInitDialog() { DWORD dwExStyle = 0; CWnd* pwndPropSheet;
pwndPropSheet = GetParentOwner();
if ( NULL != pwndPropSheet ) { dwExStyle = pwndPropSheet->GetExStyle(); pwndPropSheet->ModifyStyleEx ( NULL, WS_EX_CONTEXTHELP ); } return CPropertyPage::OnInitDialog(); } BOOL CSmPropertyPage::OnSetActive() { m_bIsActive = TRUE; return CPropertyPage::OnSetActive(); }
BOOL CSmPropertyPage::OnApply() { BOOL bContinue = TRUE; if ( NULL != m_hConsole && NULL != m_pDataObject && IsModifiedPage() ) {
// Only changes on the schedule page cause notification,
// because only schedule changes cause a state change that is
// visible in the result pane.
MMCPropertyChangeNotify ( m_hConsole, // handle to a notification
(LPARAM) m_pDataObject); // unique identifier
}
bContinue = CPropertyPage::OnApply();
return bContinue; }
LRESULT CSmPropertyPage::OnQuerySiblings( WPARAM wParam, LPARAM /*lParam*/ ) { LRESULT lrReturn = (LRESULT)0;
if ( wParam != m_nIDHelp ) { lrReturn = (LRESULT)IsModifiedPage(); } return lrReturn; }
BOOL CSmPropertyPage::OnHelpInfo(HELPINFO* pHelpInfo) { ASSERT ( NULL != m_pdwHelpIds );
if ( NULL != pHelpInfo ) { if ( pHelpInfo->iCtrlId >= GetFirstHelpCtrlId() ) { InvokeWinHelp( WM_HELP, NULL, (LPARAM)pHelpInfo, GetContextHelpFilePath(), m_pdwHelpIds ); //s_aulHelpIds);
} } else { ASSERT ( FALSE ); } return TRUE; }
void CSmPropertyPage::OnContextMenu(CWnd* pWnd, CPoint /* point */) { ASSERT ( NULL != m_pdwHelpIds );
if ( NULL != pWnd ) { InvokeWinHelp ( WM_CONTEXTMENU, (WPARAM)(pWnd->m_hWnd), NULL, GetContextHelpFilePath(), m_pdwHelpIds ); } return; } /////////////////////////////////////////////////////////////////////////////
// CSmPropertyPage helper methods
BOOL CSmPropertyPage::UpdateService( CSmLogQuery* pQuery, BOOL bSyncSerial ) { DWORD dwStatus = ERROR_SUCCESS; BOOL bIsValid = FALSE; BOOL bRegistryUpdated; CString strMessage; CString strMachineName; CString strSysMessage;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if ( NULL == pQuery ) { ASSERT ( FALSE ); return bIsValid; }
if ( (!QuerySiblings(m_nIDHelp, 0)) && IsModifiedPage() ) { // Second parameter not used by called method
{ CWaitCursor WaitCursor; // Update the service with changes.
// Sync changes made by service to properties not modified by this page.
if ( bSyncSerial ) { dwStatus = pQuery->SyncSerialNumberWithRegistry(); }
if ( ERROR_SUCCESS == dwStatus ) { dwStatus = pQuery->UpdateService ( bRegistryUpdated ); } }
if ( ERROR_SUCCESS == dwStatus ) { bIsValid = TRUE; } else {
bIsValid = FALSE;
if ( ERROR_KEY_DELETED == dwStatus ) { strMessage.LoadString( IDS_ERRMSG_QUERY_DELETED ); } else if ( ERROR_ACCESS_DENIED == dwStatus ) { pQuery->GetMachineDisplayName( strMachineName );
FormatSmLogCfgMessage ( strMessage, m_hModule, SMCFG_NO_MODIFY_ACCESS, (LPCWSTR)strMachineName); } else {
FormatMessage ( FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwStatus, 0, strSysMessage.GetBufferSetLength( MAX_PATH ), MAX_PATH, NULL );
strSysMessage.ReleaseBuffer();
if ( strSysMessage.IsEmpty() ) { strSysMessage.Format ( L"0x%08lX", dwStatus ); }
strMessage.Format( IDS_ERRMSG_SERVICE_ERROR, pQuery->GetLogName() ); strMessage += strSysMessage; } MessageBox ( strMessage, pQuery->GetLogName(), MB_OK | MB_ICONERROR ); } } else { bIsValid = TRUE; }
// If valid data, clear the modified page flag because either this page updated
// the service or another page is scheduled to update the service.
if ( bIsValid ) { SetModifiedPage ( FALSE ); }
return bIsValid; }
void CSmPropertyPage::ValidateTextEdit ( CDataExchange* pDX, int nIDC, int nMaxChars, DWORD* pValue, DWORD /* minValue */, DWORD /* maxValue */) { HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC); LONG currentValue = INVALID_DWORD; WCHAR szT[MAXSTR]; CString strTemp;
if ( NULL != pDX && NULL != pValue ) { if (pDX->m_bSaveAndValidate) {
*pValue = (DWORD) currentValue;
::GetWindowText(hWndCtrl, szT, MAXSTR);
strTemp = szT; DDV_MaxChars(pDX, strTemp, nMaxChars);
if (szT[0] >= L'0' && szT[0] <= L'9') { currentValue = _wtol(szT); *pValue = (DWORD) currentValue; } } else { if ( INVALID_DWORD != *pValue ) { wsprintf(szT, L"%lu", *pValue); } else { szT[0] = L'\0'; } GetDlgItem(nIDC)->SetWindowText(szT); } } else { ASSERT ( FALSE ); } }
BOOL CSmPropertyPage::ValidateDWordInterval( int nIDC, LPCWSTR strLogName, long lValue, DWORD minValue, DWORD maxValue ) { CString strMsg; BOOL bResult = (lValue >= (long) minValue) && (lValue <= (long) maxValue);
if (! bResult) { strMsg.Format ( IDS_ERRMSG_INVALIDDWORD, minValue, maxValue ); MessageBox(strMsg, strLogName, MB_OK | MB_ICONERROR); SetFocusAnyPage ( nIDC ); strMsg.Empty(); } return (bResult); }
void CSmPropertyPage::OnDeltaposSpin( NMHDR *pNMHDR, LRESULT *pResult, DWORD *pValue, DWORD dMinValue, DWORD dMaxValue) { NM_UPDOWN* pNMUpDown; LONG lValue; BOOL bResult = TRUE;
UpdateData(TRUE);
ASSERT(dMinValue <= dMaxValue);
if ( NULL != pNMHDR && NULL != pResult && NULL != pValue ) { pNMUpDown = (NM_UPDOWN *) pNMHDR; lValue = (LONG) (*pValue);
if (lValue == INVALID_DWORD) { lValue = (DWORD) dMinValue; }
if ( ((lValue >= (LONG) dMinValue + 1) && (pNMUpDown->iDelta > 0)) || ((lValue <= (LONG) dMaxValue - 1) && (pNMUpDown->iDelta < 0))) { lValue += (pNMUpDown->iDelta * -1);
if (lValue > (LONG) dMaxValue) { lValue = (DWORD) dMaxValue; } else if (lValue < (LONG) dMinValue) { lValue = (DWORD) dMinValue; } } else if (lValue > (LONG) dMaxValue) { lValue = (DWORD) dMaxValue; } else if (lValue < (LONG) dMinValue) { lValue = (DWORD) dMinValue; } else { bResult = FALSE; }
if (bResult) { *pValue = lValue; UpdateData(FALSE); SetModifiedPage(TRUE); } *pResult = 0; } else { ASSERT ( FALSE ); }
return; }
BOOL CSmPropertyPage::SampleTimeIsLessThanSessionTime( CSmLogQuery* pQuery ) { BOOL bIsValid = TRUE; SYSTEMTIME stLocalTime; LONGLONG llMaxStartTime = 0; LONGLONG llSessionMilliseconds = 0; LONGLONG llSampleMilliseconds = 0; CString strMsg;
ResourceStateManager rsm; if ( NULL != pQuery ) { if ( SLQ_TRACE_LOG != pQuery->GetLogType() ) { if ( SLQ_AUTO_MODE_AT == m_SharedData.stiStopTime.dwAutoMode ) { GetLocalTime (&stLocalTime); SystemTimeToFileTime (&stLocalTime, (FILETIME *)&llMaxStartTime);
// For Manual Start mode, Now is used to determine session length.
// For Start At mode, the later of Now vs. schedule start time
// is used to determine session length.
if ( SLQ_AUTO_MODE_AT == m_SharedData.stiStartTime.dwAutoMode ) { if ( m_SharedData.stiStartTime.llDateTime > llMaxStartTime ) { llMaxStartTime = m_SharedData.stiStartTime.llDateTime; } } // Calc and compare session seconds vs. sample seconds
TimeInfoToMilliseconds ( &m_SharedData.stiSampleTime, &llSampleMilliseconds );
llSessionMilliseconds = m_SharedData.stiStopTime.llDateTime - llMaxStartTime; llSessionMilliseconds /= FILETIME_TICS_PER_MILLISECOND;
if ( llSessionMilliseconds < llSampleMilliseconds ) { strMsg.LoadString ( IDS_SCHED_SESSION_TOO_SHORT ); MessageBox(strMsg, pQuery->GetLogName(), MB_OK | MB_ICONERROR); strMsg.Empty(); bIsValid = FALSE; } } else if ( SLQ_AUTO_MODE_AFTER == m_SharedData.stiStopTime.dwAutoMode ) { TimeInfoToMilliseconds ( &m_SharedData.stiStopTime, &llSessionMilliseconds ); TimeInfoToMilliseconds ( &m_SharedData.stiSampleTime, &llSampleMilliseconds ); if ( llSessionMilliseconds < llSampleMilliseconds ) { strMsg.LoadString ( IDS_SCHED_SESSION_TOO_SHORT ); MessageBox(strMsg, pQuery->GetLogName(), MB_OK | MB_ICONERROR); strMsg.Empty(); bIsValid = FALSE; } } } } else { ASSERT ( FALSE ); bIsValid = FALSE; } return bIsValid; }
BOOL CSmPropertyPage::ApplyRunAs ( CSmLogQuery* pQuery ) { DWORD dwStatus = ERROR_SUCCESS; WCHAR strComputerName[MAX_COMPUTERNAME_LENGTH + 1]; CString strComputer; DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; BOOL bReturn = TRUE; HRESULT hr = NOERROR; if ( NULL != pQuery ) { if ( !QuerySiblings(m_nIDHelp, 0)) { // Second parameter not used by called method
//
// If RunAs user/password changed, then we must save RunAs information
//
if( pQuery->m_fDirtyPassword & (PASSWORD_DIRTY|PASSWORD_SET) ){ pQuery->m_fDirtyPassword = PASSWORD_CLEAN; strComputer = pQuery->GetLogService()->GetMachineName(); if( strComputer.IsEmpty() ){ strComputerName[0] = L'\0'; bReturn = GetComputerName( strComputerName, &dwSize );
if ( !bReturn ) { dwStatus = GetLastError(); } else { strComputer = strComputerName; } } pQuery->m_strUser.TrimLeft(); pQuery->m_strUser.TrimRight();
if( pQuery->m_strUser.GetLength() ) { dwStatus = PdhPlaSetRunAs( (LPWSTR)(LPCWSTR)pQuery->GetLogName(), (LPWSTR)(LPCWSTR)strComputer, (LPWSTR)(LPCWSTR)pQuery->m_strUser, (LPWSTR)(LPCWSTR)pQuery->m_strPassword ); } else { dwStatus = PdhPlaSetRunAs( (LPWSTR)(LPCWSTR)pQuery->GetLogName(), (LPWSTR)(LPCWSTR)strComputer, L"", L"" ); } } if ( ERROR_SUCCESS != dwStatus ) { bReturn = FALSE; } } } else { ASSERT ( FALSE ); bReturn = FALSE; }
return bReturn; }
void CSmPropertyPage::SetRunAs( CSmLogQuery* pQuery ) { CPasswordDlg dlg;
if ( NULL != pQuery ) { dlg.SetContextHelpFilePath( GetContextHelpFilePath() );
pQuery->m_strUser.TrimLeft(); pQuery->m_strUser.TrimRight();
dlg.m_strUserName = pQuery->m_strUser;
//
// If we want to reset the RunAs information
//
if (pQuery->m_strUser.IsEmpty() || pQuery->m_strUser.GetAt(0) == L'<' ) { pQuery->m_strPassword = L""; pQuery->m_strUser = L""; pQuery->m_fDirtyPassword |= PASSWORD_SET; } else { if( dlg.DoModal() != IDCANCEL ){ pQuery->m_strPassword = dlg.m_strPassword1;
pQuery->m_strUser = dlg.m_strUserName; SetModifiedPage(TRUE); pQuery->m_fDirtyPassword |= PASSWORD_SET; } } } else { ASSERT ( FALSE ); } }
BOOL CSmPropertyPage::IsValidData( CSmLogQuery* pQuery, DWORD fReason ) { BOOL bIsValid = TRUE; CString strTestFileName; INT iPrevLength = 0;
if ( NULL != pQuery ) {
if ( bIsValid ) { if ( !IsActive() ) { pQuery->GetPropPageSharedData ( &m_SharedData ); } } if( bIsValid && (fReason & VALIDATE_APPLY ) ){ bIsValid = IsWritableQuery( pQuery ); }
if( bIsValid ){ bIsValid = IsValidLocalData(); } if( bIsValid ){ //
// RunAs user name changed, but password not set, set it now
//
if( (pQuery->m_fDirtyPassword & PASSWORD_DIRTY) && !(pQuery->m_fDirtyPassword & PASSWORD_SET) ){
// Note: Trimming can be moved to SetRunAs. Left outside
// for clarity.
iPrevLength = m_strUserDisplay.GetLength();
m_strUserDisplay.TrimLeft(); m_strUserDisplay.TrimRight();
SetRunAs( pQuery );
if ( iPrevLength != m_strUserDisplay.GetLength() ) { SetDlgItemText ( IDC_RUNAS_EDIT, m_strUserDisplay ); }
if( !(pQuery->m_fDirtyPassword & PASSWORD_SET) ){ bIsValid = FALSE; } } }
// Validate log file name and folder for filetypes
if ( bIsValid && SLQ_ALERT != pQuery->GetLogType() && (fReason & VALIDATE_APPLY ) ) { if ( pQuery->GetLogService()->IsLocalMachine() ) { if ( SLF_SQL_LOG != m_SharedData.dwLogFileType ) { // bIsValid is returned as FALSE if the user cancels directory creation.
ProcessDirPath ( pQuery->GetLogService()->GetDefaultLogFileFolder(), m_SharedData.strFolderName, pQuery->GetLogName(), this, bIsValid, FALSE ); } }
if ( bIsValid ) {
CreateSampleFileName ( pQuery->GetLogName(), pQuery->GetLogService()->GetMachineName(), m_SharedData.strFolderName, m_SharedData.strFileBaseName, m_SharedData.strSqlName, m_SharedData.dwSuffix, m_SharedData.dwLogFileType, m_SharedData.dwSerialNumber, strTestFileName);
if ( MAX_PATH <= strTestFileName.GetLength() ) { CString strMessage; strMessage.LoadString ( IDS_FILENAMETOOLONG ); MessageBox ( strMessage, pQuery->GetLogName(), MB_OK | MB_ICONERROR); bIsValid = FALSE; } } } } else { ASSERT ( FALSE ); bIsValid = FALSE; }
return bIsValid; }
BOOL CSmPropertyPage::IsWritableQuery( CSmLogQuery* pQuery ) { BOOL bIsValid = FALSE;
if ( NULL != pQuery ) {
bIsValid = !pQuery->IsExecuteOnly() && !pQuery->IsReadOnly(); if ( !bIsValid ) { CString strMessage; CString strMachineName; DWORD dwMessageId;
pQuery->GetMachineDisplayName( strMachineName ); dwMessageId = pQuery->IsExecuteOnly() ? SMCFG_NO_MODIFY_DEFAULT_LOG : SMCFG_NO_MODIFY_ACCESS;
FormatSmLogCfgMessage ( strMessage, m_hModule, dwMessageId, (LPCWSTR)strMachineName ); MessageBox ( strMessage, pQuery->GetLogName(), MB_OK | MB_ICONERROR); } } else { ASSERT ( FALSE ); } return bIsValid; }
BOOL CSmPropertyPage::SampleIntervalIsInRange( SLQ_TIME_INFO& rstiSample, const CString& rstrQueryName ) { LONGLONG llMillisecondSampleInt; BOOL bIsValid = TRUE; // 45 days in milliseconds = 1000*60*60*24*45
#define FORTYFIVE_DAYS (0xE7BE2C00)
TimeInfoToMilliseconds (&rstiSample, &llMillisecondSampleInt );
bIsValid = ( FORTYFIVE_DAYS >= llMillisecondSampleInt );
if ( !bIsValid ) { CString strMessage;
strMessage.LoadString ( IDS_ERRMSG_SAMPLEINTTOOLARGE ); MessageBox ( strMessage, rstrQueryName, MB_OK | MB_ICONERROR); }
return bIsValid; }
DWORD CSmPropertyPage::SetContextHelpFilePath( const CString& rstrPath ) { DWORD dwStatus = ERROR_SUCCESS;
MFC_TRY m_strContextHelpFilePath = rstrPath; MFC_CATCH_DWSTATUS
return dwStatus; }
void CSmPropertyPage::SetModifiedPage( const BOOL bModified ) { m_bIsModifiedPage = bModified; SetModified ( bModified ); return; }
CSmPropertyPage::eStartType CSmPropertyPage::DetermineCurrentStartType( void ) { eStartType eCurrentStartType; SLQ_TIME_INFO* pstiStart; SLQ_TIME_INFO* pstiStop; SYSTEMTIME stLocalTime; FILETIME ftLocalTime; LONGLONG llLocalTime; ResourceStateManager rsm;
ftLocalTime.dwLowDateTime = ftLocalTime.dwHighDateTime = 0;
pstiStart = &m_SharedData.stiStartTime;
ASSERT ( SLQ_TT_TTYPE_START == pstiStart->wTimeType );
if ( SLQ_AUTO_MODE_NONE == pstiStart->dwAutoMode ) { if ( pstiStart->llDateTime != MIN_TIME_VALUE ) { eCurrentStartType = eStartManually; } else { eCurrentStartType = eStartImmediately; } } else { GetLocalTime (&stLocalTime); SystemTimeToFileTime (&stLocalTime, &ftLocalTime); llLocalTime = *((LONGLONG *)(&ftLocalTime));
// Test current time to determine most appropriate text
if (llLocalTime < pstiStart->llDateTime) { // then the start time is in the future
eCurrentStartType = eStartSched; } else { // Start immediately, unless manual or scheduled stop time is already past.
pstiStop = &m_SharedData.stiStopTime;
if ( SLQ_AUTO_MODE_NONE == pstiStop->dwAutoMode && llLocalTime > pstiStop->llDateTime ) { eCurrentStartType = eStartManually; } else { eCurrentStartType = eStartImmediately; } } }
return eCurrentStartType; } DWORD CSmPropertyPage::AllocInitCounterPath( const LPWSTR szCounterPath, PPDH_COUNTER_PATH_ELEMENTS* ppCounter ) { DWORD dwStatus = ERROR_SUCCESS; PDH_STATUS pdhStatus = ERROR_SUCCESS; PPDH_COUNTER_PATH_ELEMENTS pLocalCounter = NULL; ULONG ulBufSize = 0;
if ( NULL != szCounterPath && NULL != ppCounter ) { *ppCounter = NULL;
pdhStatus = PdhParseCounterPath( szCounterPath, pLocalCounter, &ulBufSize, 0 );
if ( 0 < ulBufSize ) { pLocalCounter = (PPDH_COUNTER_PATH_ELEMENTS) G_ALLOC( ulBufSize);
if ( NULL != pLocalCounter ) { ZeroMemory ( pLocalCounter, ulBufSize ); dwStatus = pdhStatus = PdhParseCounterPath( szCounterPath, pLocalCounter, &ulBufSize, 0);
if ( ERROR_SUCCESS != pdhStatus ) { G_FREE(pLocalCounter); pLocalCounter = NULL; }
} else { dwStatus = ERROR_OUTOFMEMORY; } } if ( ERROR_SUCCESS == dwStatus && NULL != pLocalCounter ) { *ppCounter = pLocalCounter; } } else { dwStatus = ERROR_INVALID_PARAMETER; ASSERT ( FALSE ); } return dwStatus; }
DWORD CSmPropertyPage::SetFocusAnyPage ( INT iControlId ) { DWORD dwStatus = ERROR_SUCCESS; UINT uiIddPropertyPage; CSmPropertyPage* pOriginalPage = NULL; CSmPropertyPage* pNextPage = NULL; CPropertySheet* pPropSheet; BOOL bFound = FALSE; INT iPageCount; INT iPageIndex; CWnd* pwndControl = NULL;
if ( 0 != iControlId ) {
pPropSheet = m_pQuery->GetInitialPropertySheet();
if ( NULL == pPropSheet ) { GetDlgItem ( iControlId )->SetFocus(); } else { //
// Special check for Create From... case.
//
// Check for the normal case first.
//
uiIddPropertyPage = iControlId - (iControlId % 100 ) ;
pOriginalPage = (CSmPropertyPage*)pPropSheet->GetActivePage();
if ( NULL != pOriginalPage ) { if ( uiIddPropertyPage == pOriginalPage->m_uiIdTemplate ) { bFound = TRUE; GetDlgItem ( iControlId )->SetFocus(); } }
if ( !bFound ) { iPageCount = pPropSheet->GetPageCount();
for ( iPageIndex = 0; iPageIndex < iPageCount; iPageIndex++ ) { pNextPage = dynamic_cast<CSmPropertyPage*>(pPropSheet->GetPage ( iPageIndex )) ; if ( NULL != pNextPage ) { if ( uiIddPropertyPage == pNextPage->m_uiIdTemplate ) { bFound = TRUE; pPropSheet->SetActivePage ( pNextPage ); pwndControl = GetDlgItem ( iControlId ); if ( NULL != pwndControl ) { pwndControl->SetFocus(); } break; } } } } } } return dwStatus; }
BOOL CSmPropertyPage::ConnectRemoteWbemFail(CSmLogQuery* pQuery, BOOL bNotTouchRunAs) /*++
Routine Description:
The function display an error message telling users they can not modify the RunAs information.
Arguments:
pQuery - Query structure
bNotTouchRunAs - Don't check/restore RunAs after displaying dialog
Return Value:
Return TRUE if the RunAs need to be restored to its original one, otherwise return FALSE
--*/ { CString strMessage; CString strSysMessage; IWbemStatusCodeText * pStatus = NULL; DWORD dwMessageId; HRESULT hr;
//
// If bNotTouchRunAs is TRUE, don't try to restore the RunAs info.
//
if (!bNotTouchRunAs) { if (m_strUserDisplay == m_strUserSaved) { return FALSE; } }
//
// If the status code returned when we connect remote WBEM is
// access denied, that means we are not an admin on the remote box
// if the remote box is XP, or we are not an admin or performance log
// user if the remote box is .NET
//
dwMessageId = SMCFG_SYSTEM_MESSAGE;
if (pQuery->GetLogService()->m_hWbemAccessStatus == WBEM_E_ACCESS_DENIED) { if (pQuery->GetLogService()->TargetOs() == OS_WINXP) { dwMessageId = SMCFG_ADMIN_ONLY; } else if (pQuery->GetLogService()->TargetOs() == OS_WINNET) { dwMessageId = SMCFG_NO_MODIFY_ACCESS; } }
FormatSmLogCfgMessage ( strMessage, m_hModule, dwMessageId, (LPCWSTR)pQuery->GetLogName());
hr = CoCreateInstance(CLSID_WbemStatusCodeText, 0, CLSCTX_INPROC_SERVER, IID_IWbemStatusCodeText, (LPVOID *) &pStatus);
if (hr == S_OK) { BSTR bstr = 0; hr = pStatus->GetErrorCodeText(pQuery->GetLogService()->m_hWbemAccessStatus, 0, 0, &bstr);
if (hr == S_OK){ strSysMessage = bstr; SysFreeString(bstr); bstr = 0; }
pStatus->Release(); }
if ( strSysMessage.IsEmpty() ) { strSysMessage.Format ( L"0x%08lX", pQuery->GetLogService()->m_hWbemAccessStatus); } strMessage += strSysMessage;
MessageBox(strMessage, pQuery->GetLogName(), MB_OK); return TRUE; }
|