Leaked source code of windows server 2003
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.
 
 
 
 
 
 

1032 lines
31 KiB

/*++
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;
}