1477 lines
50 KiB
C++
1477 lines
50 KiB
C++
/*++
|
|
|
|
Copyright (C) 1999-2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
proputil.cpp
|
|
|
|
Abstract:
|
|
|
|
This file contains all static data related to log and alert properties,
|
|
along with routines to access that data.
|
|
|
|
--*/
|
|
|
|
//==========================================================================//
|
|
// Includes //
|
|
//==========================================================================//
|
|
|
|
#include "stdafx.h"
|
|
#include "strings.h"
|
|
#include "logmmsg.h"
|
|
#include "propbag.h"
|
|
#include "utils.h"
|
|
#include "proputil.h"
|
|
|
|
//==========================================================================//
|
|
// Constants and Types //
|
|
//==========================================================================//
|
|
|
|
// Property constants represent indexes into the static PropertyDataMap table.
|
|
const DWORD IdFirstProp = 0;
|
|
|
|
// The property constants in this first section have a one-to-one
|
|
// correspondence between HTML parameter and registry value
|
|
const DWORD IdCommentProp = IdFirstProp + 0;
|
|
const DWORD IdLogTypeProp = IdFirstProp + 1;
|
|
const DWORD IdCurrentStateProp = IdFirstProp + 2;
|
|
const DWORD IdLogFileMaxSizeProp = IdFirstProp + 3;
|
|
const DWORD IdLogFileBaseNameProp = IdFirstProp + 4;
|
|
const DWORD IdLogFileFolderProp = IdFirstProp + 5;
|
|
const DWORD IdLogFileSerialNumberProp = IdFirstProp + 6;
|
|
const DWORD IdLogFileAutoFormatProp = IdFirstProp + 7;
|
|
const DWORD IdLogFileTypeProp = IdFirstProp + 8;
|
|
const DWORD IdEofCommandFileProp = IdFirstProp + 9;
|
|
const DWORD IdCommandFileProp = IdFirstProp + 10;
|
|
const DWORD IdNetworkNameProp = IdFirstProp + 11;
|
|
const DWORD IdUserTextProp = IdFirstProp + 12;
|
|
const DWORD IdPerfLogNameProp = IdFirstProp + 13;
|
|
const DWORD IdTraceBufferSizeProp = IdFirstProp + 14;
|
|
const DWORD IdTraceBufferMinCountProp = IdFirstProp + 15;
|
|
const DWORD IdTraceBufferMaxCountProp = IdFirstProp + 16;
|
|
const DWORD IdTraceBufferFlushIntProp = IdFirstProp + 17;
|
|
const DWORD IdActionFlagsProp = IdFirstProp + 18;
|
|
const DWORD IdTraceFlagsProp = IdFirstProp + 19;
|
|
|
|
// Property constants below require special handling for BagToRegistry,
|
|
// because there is not a one-to-one correspondence between HTML
|
|
// parameter and registry value.
|
|
const DWORD IdRestartProp = IdFirstProp + 20;
|
|
const DWORD IdStartProp = IdFirstProp + 21;
|
|
const DWORD IdStopProp = IdFirstProp + 22;
|
|
const DWORD IdSampleProp = IdFirstProp + 23;
|
|
const DWORD IdCounterListProp = IdFirstProp + 24;
|
|
const DWORD IdGuidListProp = IdFirstProp + 25;
|
|
|
|
const DWORD IdLastProp = IdFirstProp + 25;
|
|
|
|
/*
|
|
// Not handled yet, or covered by special values above.
|
|
// Some of these might be needed when writing to HTML file from registry.
|
|
//
|
|
const DWORD IdSysmonVersionProp = IdFirstProp + 29;
|
|
|
|
const DWORD IdSysmonCounterCountProp = IdFirstProp + 29;
|
|
const DWORD IdSysmonCounterPathProp = IdFirstProp + 21;
|
|
const DWORD IdAlertThresholdProp = IdFirstProp + 23;
|
|
const DWORD IdAlertOverUnderProp = IdFirstProp + 24;
|
|
const DWORD IdTraceProviderCountProp = IdFirstProp + 25;
|
|
const DWORD IdTraceProviderGuidProp = IdFirstProp + 26;
|
|
|
|
const DWORD IdLogNameProp = IdFirstProp + 27;
|
|
const DWORD IdAlertNameProp = IdFirstProp + 28;
|
|
const DWORD IdStartModeProp = SLQ_TT_TTYPE_LAST + ;
|
|
const DWORD IdStartAtTimeProp = SLQ_TT_TTYPE_LAST + ;
|
|
const DWORD IdStopModeProp = SLQ_TT_TTYPE_LAST + ;
|
|
const DWORD IdStopAtTimeProp = SLQ_TT_TTYPE_LAST + ;
|
|
const DWORD IdStopAfterUnitTypeProp = SLQ_TT_TTYPE_LAST + ;
|
|
const DWORD IdStopAfterValueProp = SLQ_TT_TTYPE_LAST + ;
|
|
const DWORD IdSampleIntUnitTypeProp = IdFirstProp + 21;
|
|
const DWORD IdSampleIntValueProp = IdFirstProp + 21;
|
|
const DWORD IdSysmonUpdateIntervalProp = SLQ_TT_TTYPE_LAST + ;
|
|
|
|
const DWORD IdSysmonSampleCountProp = IdFirstProp + 20;
|
|
const DWORD IdSysmonLogFileNameProp = IdFirstProp + 18;
|
|
|
|
const DWORD IdExecuteOnlyProp = IdFirstProp + 30;
|
|
*/
|
|
|
|
//==========================================================================//
|
|
// Local Constants //
|
|
//==========================================================================//
|
|
|
|
const DWORD cdwFortyfiveDays = ((DWORD)(0xE7BE2C00));
|
|
const WORD cwFirstValidYear = ((DWORD)(2000));
|
|
const DWORD cdwNoMaxSizeLimit = ((DWORD)(0xFFFFFFFF));
|
|
const DWORD cdwNoRange = ((DWORD)(0xFFFFFFFF));
|
|
const DWORD cdwSeverityMask = ((DWORD)(0xC0000000));
|
|
|
|
const CPropertyUtils::PROPERTY_DATA_MAP CPropertyUtils::m_PropertyDataMap[] =
|
|
{
|
|
{IdCommentProp, REG_SZ, cwszHtmlComment, cwszRegComment
|
|
,(ValidationMethod)ValidateString ,FALSE ,NULL ,NULL },
|
|
{IdLogTypeProp, REG_DWORD, cwszHtmlLogType, cwszRegLogType
|
|
,(ValidationMethod)ValidateDwordInterval ,TRUE ,SLQ_FIRST_LOG_TYPE ,SLQ_LAST_LOG_TYPE },
|
|
{IdCurrentStateProp, REG_DWORD, cwszHtmlCurrentState, cwszRegCurrentState
|
|
,(ValidationMethod)ValidateDwordInterval ,FALSE ,SLQ_QUERY_STOPPED ,SLQ_QUERY_RUNNING },
|
|
{IdLogFileMaxSizeProp, REG_DWORD, cwszHtmlLogFileMaxSize, cwszRegLogFileMaxSize
|
|
,(ValidationMethod)ValidateMaxFileSize ,FALSE ,1 ,0x0100000 },
|
|
{IdLogFileBaseNameProp, REG_SZ, cwszHtmlLogFileBaseName, cwszRegLogFileBaseName
|
|
,(ValidationMethod)ValidateFileName ,FALSE ,NULL ,NULL },
|
|
{IdLogFileFolderProp, REG_SZ, cwszHtmlLogFileFolder, cwszRegLogFileFolder
|
|
,(ValidationMethod)ValidateDirectoryPath ,FALSE ,NULL ,NULL },
|
|
{IdLogFileSerialNumberProp, REG_DWORD, cwszHtmlLogFileSerialNumber,cwszRegLogFileSerialNumber
|
|
,(ValidationMethod)ValidateDwordInterval ,FALSE ,0 ,999999 },
|
|
{IdLogFileAutoFormatProp, REG_DWORD, cwszHtmlLogFileAutoFormat, cwszRegLogFileAutoFormat
|
|
,(ValidationMethod)ValidateDwordInterval ,FALSE ,0 ,1 },
|
|
{IdLogFileTypeProp, REG_DWORD, cwszHtmlLogFileType, cwszRegLogFileType
|
|
,(ValidationMethod)ValidateLogFileType ,FALSE ,cdwNoRange ,cdwNoRange },
|
|
{IdEofCommandFileProp, REG_SZ, cwszHtmlEofCommandFile, cwszRegEofCommandFile
|
|
,(ValidationMethod)ValidateFilePath ,FALSE ,NULL ,NULL },
|
|
{IdCommandFileProp, REG_SZ, cwszHtmlCommandFile, cwszRegCommandFile
|
|
,(ValidationMethod)ValidateFilePath ,FALSE ,NULL ,NULL },
|
|
{IdNetworkNameProp, REG_SZ, cwszHtmlNetworkName, cwszRegNetworkName
|
|
,(ValidationMethod)ValidateString ,TRUE ,NULL ,NULL },
|
|
{IdUserTextProp, REG_SZ, cwszHtmlUserText, cwszRegUserText
|
|
,(ValidationMethod)ValidateString ,FALSE ,NULL ,NULL },
|
|
{IdPerfLogNameProp, REG_SZ, cwszHtmlPerfLogName, cwszRegPerfLogName
|
|
,(ValidationMethod)ValidateLogExists ,FALSE ,NULL ,NULL },
|
|
{IdTraceBufferSizeProp, REG_DWORD, cwszHtmlTraceBufferSize, cwszRegTraceBufferSize
|
|
,(ValidationMethod)ValidateDwordInterval ,FALSE ,1 ,1024 },
|
|
{IdTraceBufferMinCountProp, REG_DWORD, cwszHtmlTraceBufferMinCount,cwszRegTraceBufferMinCount
|
|
,(ValidationMethod)ValidateDwordInterval ,FALSE ,2 ,400 },
|
|
{IdTraceBufferMaxCountProp, REG_DWORD, cwszHtmlTraceBufferMaxCount,cwszRegTraceBufferMaxCount
|
|
,(ValidationMethod)ValidateTraceBufferMaxCount,FALSE,2 ,400 },
|
|
{IdTraceBufferFlushIntProp, REG_DWORD, cwszHtmlTraceBufferFlushInt,cwszRegTraceBufferFlushInt
|
|
,(ValidationMethod)ValidateDwordInterval ,FALSE ,0 ,300 },
|
|
{IdActionFlagsProp, REG_DWORD, cwszHtmlActionFlags, cwszRegActionFlags
|
|
,(ValidationMethod)ValidateAlertActions ,FALSE ,cdwNoRange ,cdwNoRange },
|
|
{IdTraceFlagsProp, REG_DWORD, cwszHtmlTraceFlags, cwszRegTraceFlags
|
|
,(ValidationMethod)ValidateTraceFlags ,FALSE ,cdwNoRange ,cdwNoRange },
|
|
{IdRestartProp, REG_BINARY, cwszHtmlRestartMode, cwszRegRestart
|
|
,(ValidationMethod)ValidateSlqTimeInfo ,FALSE ,0 ,1 },
|
|
{IdStartProp, REG_BINARY ,NULL, cwszRegStartTime
|
|
,(ValidationMethod)ValidateSlqTimeInfo ,FALSE ,cdwNoRange ,cdwNoRange },
|
|
{IdStopProp, REG_BINARY ,NULL, cwszRegStopTime
|
|
,(ValidationMethod)ValidateSlqTimeInfo ,FALSE ,cdwNoRange ,cdwNoRange },
|
|
{IdSampleProp, REG_BINARY ,NULL, cwszRegSampleInterval
|
|
,(ValidationMethod)ValidateSlqTimeInfo ,FALSE ,cdwNoRange ,cdwNoRange },
|
|
{IdCounterListProp, REG_MULTI_SZ,NULL, NULL
|
|
,(ValidationMethod)ValidatePrimaryObjectList,TRUE ,cdwNoRange ,cdwNoRange },
|
|
{IdGuidListProp, REG_MULTI_SZ,NULL, NULL
|
|
,(ValidationMethod)ValidatePrimaryObjectList,FALSE ,cdwNoRange ,cdwNoRange }
|
|
|
|
};
|
|
|
|
const DWORD CPropertyUtils::m_dwPropertyDataMapEntries
|
|
= sizeof(CPropertyUtils::m_PropertyDataMap)/sizeof(CPropertyUtils::m_PropertyDataMap[0]);
|
|
|
|
|
|
//==========================================================================//
|
|
// Friend Functions //
|
|
//==========================================================================//
|
|
|
|
DWORD
|
|
ValidateDwordInterval (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD /* dwLogType */)
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
HRESULT hr;
|
|
DWORD dwValue;
|
|
|
|
hr = DwordFromPropertyBag (
|
|
pUtils->m_pPropBag,
|
|
CPropertyUtils::m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
dwValue );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
if ( ( dwValue < CPropertyUtils::m_PropertyDataMap[dwPropId].dwMin )
|
|
|| (dwValue > CPropertyUtils::m_PropertyDataMap[dwPropId].dwMax ) ) {
|
|
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
|
|
if ( pUtils->IsDisplayLevelMessage ( dwStatus ) ) {
|
|
if ( pUtils->GetInvalidStatus ( dwPropId ) == dwStatus ) {
|
|
WCHAR szBufVal [64];
|
|
WCHAR szBufMin [64];
|
|
WCHAR szBufMax [64];
|
|
|
|
swprintf (szBufVal, L"%ld", dwValue );
|
|
swprintf (szBufMin, L"%ld", CPropertyUtils::m_PropertyDataMap[dwPropId].dwMin );
|
|
swprintf (szBufMax, L"%ld", CPropertyUtils::m_PropertyDataMap[dwPropId].dwMax );
|
|
|
|
DisplayErrorMessage (
|
|
LOGMAN_OUT_OF_RANGE,
|
|
szBufVal,
|
|
CPropertyUtils::m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
pUtils->GetQueryName(),
|
|
szBufMin,
|
|
szBufMax );
|
|
} else {
|
|
assert ( pUtils->GetMissingStatus ( dwPropId ) == dwStatus );
|
|
DisplayErrorMessage (
|
|
dwStatus,
|
|
CPropertyUtils::m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
pUtils->GetQueryName() );
|
|
}
|
|
}
|
|
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
ValidatePrimaryObjectList (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD dwLogType )
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
HRESULT hr;
|
|
UNICODE_STRING ustrGuid;
|
|
GUID guid;
|
|
DWORD dwCount = 0;
|
|
WCHAR achInfoBufNew[sizeof(PDH_COUNTER_PATH_ELEMENTS_W) + MAX_PATH + 5];
|
|
PPDH_COUNTER_PATH_ELEMENTS_W pPathInfoNew = (PPDH_COUNTER_PATH_ELEMENTS_W)achInfoBufNew;
|
|
ULONG ulBufSize;
|
|
DWORD dwIndex;
|
|
WCHAR szPropName [MAX_PATH+1]; // Todo: Remove length restriction
|
|
DWORD dwPropBagStringLen = 0;
|
|
DWORD dwTemp = 0;
|
|
DOUBLE dThreshold = 0;
|
|
|
|
LPCWSTR szHtmlCountProp = NULL;
|
|
LPCWSTR szHtmlPathProp = NULL;
|
|
|
|
assert ( REG_MULTI_SZ == CPropertyUtils::m_PropertyDataMap[dwPropId].dwRegType );
|
|
|
|
if ( IdCounterListProp == dwPropId ) {
|
|
if ( SLQ_COUNTER_LOG == dwLogType
|
|
|| SLQ_ALERT == dwLogType ) {
|
|
szHtmlCountProp = cwszHtmlSysmonCounterCount;
|
|
szHtmlPathProp = cwszHtmlSysmonCounterPath;
|
|
} else {
|
|
assert ( FALSE );
|
|
dwStatus = ERROR_INVALID_PARAMETER;
|
|
}
|
|
} else if ( IdGuidListProp == dwPropId ) {
|
|
if ( SLQ_TRACE_LOG == dwLogType ) {
|
|
szHtmlCountProp = cwszHtmlTraceProviderCount;
|
|
szHtmlPathProp = cwszHtmlTraceProviderGuid;
|
|
} else {
|
|
assert ( FALSE );
|
|
dwStatus = ERROR_INVALID_PARAMETER;
|
|
}
|
|
} else {
|
|
assert ( FALSE );
|
|
dwStatus = ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if ( ERROR_SUCCESS == dwStatus ) {
|
|
|
|
hr = DwordFromPropertyBag (
|
|
pUtils->m_pPropBag,
|
|
szHtmlCountProp,
|
|
dwCount ); // Todo: Require counter count? Yes for now
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
|
|
// Todo: Add dwCount to properties table?
|
|
if ( 0 < dwCount ) {
|
|
for ( dwIndex = 1;
|
|
dwIndex <= dwCount && SUCCEEDED ( hr );
|
|
dwIndex++ ) {
|
|
|
|
swprintf ( szPropName, szHtmlPathProp, dwIndex );
|
|
|
|
hr = StringFromPropBagAlloc (
|
|
pUtils->m_pPropBag,
|
|
szPropName,
|
|
&pUtils->m_szPropBagBuffer,
|
|
&pUtils->m_dwPropBagBufLen,
|
|
&dwPropBagStringLen );
|
|
|
|
if ( SUCCEEDED (hr ) ) {
|
|
|
|
if ( SLQ_COUNTER_LOG == dwLogType ) {
|
|
|
|
// Validate counter path
|
|
ulBufSize = sizeof(achInfoBufNew);
|
|
ZeroMemory ( achInfoBufNew, ulBufSize );
|
|
|
|
dwStatus = PdhParseCounterPathW(
|
|
pUtils->m_szPropBagBuffer,
|
|
pPathInfoNew,
|
|
&ulBufSize,
|
|
0);
|
|
|
|
if ( ERROR_SUCCESS != dwStatus ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else if ( SLQ_TRACE_LOG == dwLogType ) {
|
|
|
|
// Validate guid
|
|
// Check to ensure that the length and form are correct
|
|
ustrGuid.Length = (USHORT)(dwPropBagStringLen*sizeof(WCHAR));
|
|
ustrGuid.MaximumLength = (USHORT)(dwPropBagStringLen*sizeof(WCHAR));
|
|
ustrGuid.Buffer = pUtils->m_szPropBagBuffer;
|
|
|
|
dwStatus = GuidFromString (&ustrGuid, &guid );
|
|
|
|
if ( ERROR_SUCCESS != dwStatus ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
|
|
} else if ( SLQ_ALERT == dwLogType ) {
|
|
// Alert threshold and threshold log values are required.
|
|
|
|
swprintf ( szPropName, cwszHtmlAlertOverUnder, dwIndex );
|
|
hr = DwordFromPropertyBag (
|
|
pUtils->m_pPropBag,
|
|
szPropName,
|
|
dwTemp );
|
|
|
|
if ( SUCCEEDED (hr ) ) {
|
|
if ( ( dwTemp != AIBF_OVER )
|
|
&& ( dwTemp != AIBF_UNDER ) ) {
|
|
dwStatus = LOGMAN_REQUIRED_PROP_INVALID;
|
|
}
|
|
} else {
|
|
dwStatus = LOGMAN_REQUIRED_PROP_MISSING;
|
|
break;
|
|
}
|
|
if ( ERROR_SUCCESS == dwStatus && SUCCEEDED ( hr ) ) {
|
|
|
|
swprintf ( szPropName, cwszHtmlAlertThreshold, dwIndex );
|
|
|
|
hr = DoubleFromPropertyBag (
|
|
pUtils->m_pPropBag,
|
|
szPropName,
|
|
dThreshold );
|
|
if ( SUCCEEDED (hr ) ) {
|
|
// Validate threshold value
|
|
if ( 0.0 >= dThreshold ) {
|
|
dwStatus = LOGMAN_REQUIRED_PROP_INVALID;
|
|
}
|
|
} else {
|
|
dwStatus = LOGMAN_REQUIRED_PROP_MISSING;
|
|
break;
|
|
}
|
|
}
|
|
} // else invalid log type.
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
break;
|
|
}
|
|
} // for dwIndex
|
|
} else {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
if ( ERROR_SUCCESS != dwStatus ) {
|
|
// Display error, to include property name
|
|
}
|
|
|
|
} else {
|
|
//Todo: Will need to display errors here, in order to include property name
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
}
|
|
|
|
// Todo: Display error messages.
|
|
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
ValidateSlqTimeInfo (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD dwLogType )
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
HRESULT hr = NOERROR;
|
|
SLQ_TIME_INFO stiData;
|
|
SLQ_TIME_INFO stiDefault;
|
|
WORD wTimeType;
|
|
LONGLONG llmsecs;
|
|
|
|
if ( IdRestartProp == dwPropId ) {
|
|
dwStatus = ValidateDwordInterval ( pUtils, dwPropId, dwLogType );
|
|
} else {
|
|
assert ( IdStartProp == dwPropId
|
|
|| IdStopProp == dwPropId
|
|
|| IdSampleProp == dwPropId );
|
|
|
|
if ( IdStartProp == dwPropId ) {
|
|
wTimeType = SLQ_TT_TTYPE_START;
|
|
} else if ( IdStopProp == dwPropId ) {
|
|
wTimeType = SLQ_TT_TTYPE_STOP;
|
|
} else {
|
|
assert ( IdSampleProp == dwPropId );
|
|
wTimeType = SLQ_TT_TTYPE_SAMPLE;
|
|
}
|
|
|
|
// Initialize time structure to default, in case of missing fields.
|
|
hr = InitDefaultSlqTimeInfo (
|
|
dwLogType,
|
|
wTimeType,
|
|
&stiDefault );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
ZeroMemory ( &stiData, sizeof(stiData) );
|
|
hr = SlqTimeFromPropertyBag (
|
|
pUtils->m_pPropBag,
|
|
wTimeType,
|
|
&stiDefault,
|
|
&stiData );
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
if ( IdStartProp == dwPropId ) {
|
|
if ( SLQ_AUTO_MODE_AT == stiData.dwAutoMode ) {
|
|
if ( !pUtils->IsValidDateTime ( stiData.llDateTime ) ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else if ( SLQ_AUTO_MODE_NONE == stiData.dwAutoMode ) {
|
|
if ( MIN_TIME_VALUE != stiData.llDateTime
|
|
&& MAX_TIME_VALUE != stiData.llDateTime ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else if ( IdStopProp == dwPropId ) {
|
|
if ( SLQ_AUTO_MODE_AT == stiData.dwAutoMode ) {
|
|
if ( !pUtils->IsValidDateTime ( stiData.llDateTime ) ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
// Todo: Ensure stop is after start time.
|
|
// Todo: Ensure stop is after current time.
|
|
// Todo: Ensure session time is >= Sample time
|
|
} else if ( SLQ_AUTO_MODE_NONE == stiData.dwAutoMode ) {
|
|
if ( MIN_TIME_VALUE != stiData.llDateTime
|
|
&& MAX_TIME_VALUE != stiData.llDateTime ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else if ( SLQ_AUTO_MODE_AFTER == stiData.dwAutoMode ) {
|
|
if ( SLQ_TT_UTYPE_SECONDS > stiData.dwUnitType
|
|
|| SLQ_TT_UTYPE_DAYS < stiData.dwUnitType ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
} else {
|
|
if ( 1 > stiData.dwValue
|
|
|| 100000 < stiData.dwValue ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
}
|
|
|
|
} else {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
assert ( IdSampleProp == dwPropId );
|
|
if ( SLQ_TT_UTYPE_SECONDS > stiData.dwUnitType
|
|
|| SLQ_TT_UTYPE_DAYS < stiData.dwUnitType ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
} else {
|
|
// Sample time interval must be less than or equal to 45 days.
|
|
if ( SlqTimeToMilliseconds ( &stiData, &llmsecs ) ) {
|
|
if ( cdwFortyfiveDays < llmsecs ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
} else {
|
|
|
|
|
|
// Todo: Ensure session time is >= Sample time
|
|
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
}
|
|
}
|
|
// Todo: Display error messages here.
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
ValidateMaxFileSize (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD /* dwLogType */ )
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
HRESULT hr;
|
|
DWORD dwValue;
|
|
|
|
hr = DwordFromPropertyBag (
|
|
pUtils->m_pPropBag,
|
|
CPropertyUtils::m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
dwValue );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
if ( cdwNoMaxSizeLimit != dwValue ) {
|
|
if ( ( dwValue < CPropertyUtils::m_PropertyDataMap[dwPropId].dwMin )
|
|
|| (dwValue > CPropertyUtils::m_PropertyDataMap[dwPropId].dwMax ) ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
hr = DwordFromPropertyBag (
|
|
pUtils->m_pPropBag,
|
|
CPropertyUtils::m_PropertyDataMap[IdLogFileTypeProp].cwszHtmlName,
|
|
dwValue );
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
if ( SLF_BIN_CIRC_FILE == dwValue
|
|
|| SLF_CIRC_TRACE_FILE == dwValue ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} // else, default file type is not circular, so not a problem.
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
// Todo: Display error messages here.
|
|
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
ValidateLogFileType (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD dwLogType )
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
HRESULT hr;
|
|
DWORD dwValue;
|
|
|
|
assert ( IdLogFileTypeProp == dwPropId );
|
|
|
|
hr = DwordFromPropertyBag (
|
|
pUtils->m_pPropBag,
|
|
CPropertyUtils::m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
dwValue );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
if ( SLQ_COUNTER_LOG == dwLogType ) {
|
|
if ( SLF_CSV_FILE != dwValue
|
|
&& SLF_TSV_FILE != dwValue
|
|
&& SLF_BIN_FILE != dwValue
|
|
&& SLF_BIN_CIRC_FILE != dwValue ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else if ( SLQ_TRACE_LOG == dwLogType ) {
|
|
if ( SLF_CIRC_TRACE_FILE != dwValue
|
|
&& SLF_SEQ_TRACE_FILE != dwValue ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
// Todo: Display error messages here.
|
|
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
ValidateString (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD /* dwLogType */)
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
HRESULT hr = NOERROR;
|
|
DWORD dwPropBagStringLen = 0;
|
|
|
|
hr = StringFromPropBagAlloc (
|
|
pUtils->m_pPropBag,
|
|
CPropertyUtils::m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
&pUtils->m_szPropBagBuffer,
|
|
&pUtils->m_dwPropBagBufLen,
|
|
&dwPropBagStringLen );
|
|
|
|
// Just check for missing or empty string.
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
if ( NULL == pUtils->m_szPropBagBuffer ) {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
} else {
|
|
if ( 0 == lstrlenW ( pUtils->m_szPropBagBuffer ) ) {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
|
|
// Todo: Display error messages here.
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
ValidateTraceFlags (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD dwLogType )
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
HRESULT hr;
|
|
DWORD dwValue;
|
|
|
|
|
|
if ( IdTraceFlagsProp == dwPropId && SLQ_TRACE_LOG != dwLogType ) {
|
|
assert ( FALSE );
|
|
dwStatus = ERROR_INVALID_PARAMETER;
|
|
} else {
|
|
hr = DwordFromPropertyBag (
|
|
pUtils->m_pPropBag,
|
|
CPropertyUtils::m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
dwValue );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
if ( SLQ_TLI_ENABLE_MASK != ( dwValue | SLQ_TLI_ENABLE_MASK ) ) {
|
|
// Too many flags specified.
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
}
|
|
// Todo: Display error messages here.
|
|
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
ValidateAlertActions (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD dwLogType )
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
HRESULT hr;
|
|
DWORD dwValue;
|
|
|
|
|
|
if ( IdActionFlagsProp == dwPropId && SLQ_ALERT != dwLogType ) {
|
|
assert ( FALSE );
|
|
dwStatus = ERROR_INVALID_PARAMETER;
|
|
} else {
|
|
hr = DwordFromPropertyBag (
|
|
pUtils->m_pPropBag,
|
|
CPropertyUtils::m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
dwValue );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
if ( IdActionFlagsProp == dwPropId ) {
|
|
// Todo: Validate, and check for empty fields. Yes.
|
|
if ( (0 == dwValue )
|
|
|| ( ALRT_ACTION_MASK != ( dwValue | ALRT_ACTION_MASK ) ) ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
|
|
// No validation for ALRT_ACTION_LOG_EVENT
|
|
|
|
if ( ERROR_SUCCESS == dwStatus ) {
|
|
if ( ALRT_ACTION_SEND_MSG & dwValue ) {
|
|
dwStatus = pUtils->Validate ( IdNetworkNameProp );
|
|
}
|
|
|
|
if ( ALRT_ACTION_START_LOG & dwValue ) {
|
|
/*
|
|
// Todo: Validate log existence
|
|
dwIndividualStatus =
|
|
|
|
if ( ERROR_SUCCESS != dwIndividualStatus ) {
|
|
dwStatus = general failure status
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
if ( ALRT_ACTION_EXEC_CMD & dwValue ) {
|
|
// Todo: Validate command file
|
|
if ( 0 == ( dwValue | ALRT_CMD_LINE_MASK ) ) {
|
|
//dwLocalStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
// Todo: Display error message here.
|
|
}
|
|
}
|
|
}
|
|
|
|
} else {
|
|
assert ( FALSE );
|
|
hr = E_INVALIDARG;
|
|
}
|
|
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
}
|
|
// Todo: Display error messages here.
|
|
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
ValidateDirectoryPath (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD dwLogType )
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
|
|
// Todo: Implement
|
|
// Validate the existence of the directory path, if local machine?
|
|
pUtils;
|
|
dwPropId;
|
|
dwLogType;
|
|
|
|
// Todo: Display error messages here.
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
ValidateTraceBufferMaxCount (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD dwLogType )
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
HRESULT hr;
|
|
DWORD dwMaxValue;
|
|
DWORD dwMinValue;
|
|
|
|
if ( SLQ_TRACE_LOG == dwLogType
|
|
&& IdTraceBufferMaxCountProp == dwPropId ) {
|
|
hr = DwordFromPropertyBag (
|
|
pUtils->m_pPropBag,
|
|
CPropertyUtils::m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
dwMaxValue );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
if ( ( dwMaxValue < CPropertyUtils::m_PropertyDataMap[dwPropId].dwMin )
|
|
|| (dwMaxValue > CPropertyUtils::m_PropertyDataMap[dwPropId].dwMax ) ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
} else {
|
|
hr = DwordFromPropertyBag (
|
|
pUtils->m_pPropBag,
|
|
CPropertyUtils::m_PropertyDataMap[IdTraceBufferMinCountProp].cwszHtmlName,
|
|
dwMinValue );
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
if ( dwMinValue > dwMaxValue ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} // else no min value specified, and default min is always <= max
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
assert ( FALSE );
|
|
hr = E_INVALIDARG;
|
|
}
|
|
// Todo: Display error messages here.
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
ValidateFileName (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD /* dwLogType */ )
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
HRESULT hr = NOERROR;
|
|
DWORD dwPropBagStringLen = 0;
|
|
|
|
if ( NULL != pUtils ) {
|
|
hr = StringFromPropBagAlloc (
|
|
pUtils->m_pPropBag,
|
|
CPropertyUtils::m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
&pUtils->m_szPropBagBuffer,
|
|
&pUtils->m_dwPropBagBufLen,
|
|
&dwPropBagStringLen );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
if ( 0 != dwPropBagStringLen ) {
|
|
if ( !IsValidFileName ( pUtils->m_szPropBagBuffer ) ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
assert ( FALSE );
|
|
dwStatus = ERROR_INVALID_PARAMETER;
|
|
}
|
|
// Todo: Display error messages here.
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
ValidateFilePath (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD /* dwLogType */ )
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
HRESULT hr = NOERROR;
|
|
DWORD dwPropBagStringLen = 0;
|
|
HANDLE hOpenFile = NULL;
|
|
|
|
if ( NULL != pUtils ) {
|
|
hr = StringFromPropBagAlloc (
|
|
pUtils->m_pPropBag,
|
|
CPropertyUtils::m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
&pUtils->m_szPropBagBuffer,
|
|
&pUtils->m_dwPropBagBufLen,
|
|
&dwPropBagStringLen );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
if ( 0 != dwPropBagStringLen ) {
|
|
hOpenFile = CreateFileW (
|
|
pUtils->m_szPropBagBuffer,
|
|
GENERIC_READ,
|
|
0, // Not shared
|
|
NULL, // Security attributes
|
|
OPEN_EXISTING, //
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL );
|
|
|
|
if ( ( NULL == hOpenFile )
|
|
|| INVALID_HANDLE_VALUE == hOpenFile ) {
|
|
dwStatus = pUtils->GetInvalidStatus ( dwPropId );
|
|
} else {
|
|
CloseHandle( hOpenFile );
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
dwStatus = pUtils->GetMissingStatus ( dwPropId );
|
|
}
|
|
} else {
|
|
assert ( FALSE );
|
|
dwStatus = ERROR_INVALID_PARAMETER;
|
|
}
|
|
// Todo: Display error messages here.
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
ValidateLogExists (
|
|
CPropertyUtils* pUtils,
|
|
DWORD dwPropId,
|
|
DWORD dwLogType )
|
|
{
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
|
|
// Todo: Implement. Check via m_hkeyQueries
|
|
pUtils;
|
|
dwPropId;
|
|
dwLogType;
|
|
|
|
// Todo: Display error messages here.
|
|
return dwStatus;
|
|
}
|
|
|
|
/*
|
|
* CPropertyUtils::CPropertyUtils
|
|
*
|
|
* Purpose:
|
|
* Constructor.
|
|
*
|
|
* Return Value:
|
|
*/
|
|
|
|
CPropertyUtils::CPropertyUtils (
|
|
LPCWSTR cszMachineName,
|
|
LPCWSTR cszQueryName,
|
|
CPropertyBag* pPropBag,
|
|
HKEY hkeyQuery,
|
|
HKEY hkeyQueryList )
|
|
: m_szPropBagBuffer ( NULL ),
|
|
m_dwPropBagBufLen ( 0 ),
|
|
m_pPropBag ( pPropBag ),
|
|
m_hkeyQuery ( hkeyQuery ),
|
|
m_hkeyQueryList ( hkeyQueryList ),
|
|
m_eMessageDisplayLevel ( eWarnings )
|
|
{
|
|
if ( NULL != cszMachineName ) {
|
|
lstrcpynW ( m_szMachineName, cszMachineName, sizeof(m_szMachineName) );
|
|
} else {
|
|
m_szMachineName[0] = NULL_W;
|
|
}
|
|
|
|
if ( NULL != cszQueryName ) {
|
|
lstrcpynW ( m_szQueryName, cszQueryName, sizeof(m_szQueryName) );
|
|
} else {
|
|
m_szQueryName[0] = NULL_W;
|
|
}
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* CPropertyUtils::CPropertyUtils
|
|
*
|
|
* Purpose:
|
|
* Constructor.
|
|
*
|
|
* Return Value:
|
|
*/
|
|
|
|
CPropertyUtils::CPropertyUtils ( LPCWSTR cszMachineName )
|
|
: m_szPropBagBuffer ( NULL ),
|
|
m_dwPropBagBufLen ( 0 ),
|
|
m_pPropBag ( NULL ),
|
|
m_hkeyQuery ( NULL ),
|
|
m_hkeyQueryList ( NULL ),
|
|
m_eMessageDisplayLevel ( eWarnings )
|
|
{
|
|
if ( NULL != cszMachineName ) {
|
|
lstrcpynW ( m_szMachineName, cszMachineName, sizeof(m_szMachineName) );
|
|
} else {
|
|
m_szMachineName[0] = NULL_W;
|
|
}
|
|
m_szQueryName[0] = NULL_W;
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* CPropertyUtils::~CPropertyUtils
|
|
*
|
|
* Purpose:
|
|
* Destructor.
|
|
*
|
|
* Return Value:
|
|
*/
|
|
|
|
CPropertyUtils::~CPropertyUtils ( void )
|
|
{
|
|
if ( NULL != m_szPropBagBuffer ) {
|
|
delete m_szPropBagBuffer;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Public methods
|
|
//
|
|
|
|
void
|
|
CPropertyUtils::SetQueryName ( LPCWSTR szQueryName )
|
|
{
|
|
assert ( NULL != szQueryName );
|
|
if ( NULL != szQueryName ) {
|
|
lstrcpynW ( m_szQueryName, szQueryName, sizeof(m_szQueryName) );
|
|
}
|
|
}
|
|
|
|
LPCWSTR
|
|
CPropertyUtils::GetQueryName ( void )
|
|
{
|
|
return m_szQueryName;
|
|
}
|
|
|
|
void
|
|
CPropertyUtils::SetPropertyBag ( CPropertyBag* pPropBag )
|
|
{
|
|
m_pPropBag = pPropBag;
|
|
}
|
|
|
|
void
|
|
CPropertyUtils::SetQueryKey ( HKEY hkeyQuery )
|
|
{
|
|
m_hkeyQuery = hkeyQuery;
|
|
}
|
|
|
|
void
|
|
CPropertyUtils::SetQueryListKey ( HKEY hkeyQueryList )
|
|
{
|
|
m_hkeyQueryList = hkeyQueryList;
|
|
}
|
|
|
|
void
|
|
CPropertyUtils::SetMessageDisplayLevel ( eMessageDisplayLevel eLevel )
|
|
{
|
|
m_eMessageDisplayLevel = eLevel;
|
|
}
|
|
|
|
CPropertyUtils::eMessageDisplayLevel
|
|
CPropertyUtils::GetMessageDisplayLevel ( void )
|
|
{
|
|
return m_eMessageDisplayLevel;
|
|
}
|
|
|
|
|
|
DWORD
|
|
CPropertyUtils::Validate (
|
|
DWORD dwPropId,
|
|
DWORD dwLogType )
|
|
{
|
|
DWORD dwStatus = ERROR_INVALID_PARAMETER;
|
|
|
|
assert ( NULL != m_pPropBag );
|
|
assert ( ( IdFirstProp <= dwPropId ) && ( IdLastProp >= dwPropId ) );
|
|
|
|
if ( NULL != m_pPropBag ) {
|
|
|
|
if ( ( IdFirstProp <= dwPropId )
|
|
&& ( IdLastProp >= dwPropId ) ) {
|
|
if ( NULL != m_PropertyDataMap[dwPropId].fValidate ) {
|
|
dwStatus = m_PropertyDataMap[dwPropId].fValidate ( this, dwPropId, dwLogType );
|
|
}
|
|
}
|
|
}
|
|
|
|
return dwStatus;
|
|
}
|
|
|
|
HRESULT
|
|
CPropertyUtils::BagToRegistry (
|
|
DWORD dwPropId,
|
|
DWORD dwLogType )
|
|
{
|
|
HRESULT hr = NOERROR;
|
|
|
|
if ( ( IdFirstProp > dwPropId )
|
|
|| ( IdLastProp < dwPropId ) ) {
|
|
assert ( FALSE );
|
|
hr = E_INVALIDARG;
|
|
} else if ( NULL == m_pPropBag || NULL == m_hkeyQuery ) {
|
|
assert ( FALSE );
|
|
hr = E_POINTER;
|
|
} else {
|
|
|
|
switch ( m_PropertyDataMap[dwPropId].dwRegType ) {
|
|
|
|
case REG_SZ:
|
|
hr = StringBagToRegistry ( dwPropId, dwLogType );
|
|
break;
|
|
|
|
case REG_BINARY:
|
|
hr = SlqTimeBagToRegistry ( dwPropId, dwLogType );
|
|
break;
|
|
|
|
case REG_DWORD:
|
|
hr = DwordBagToRegistry ( dwPropId, dwLogType );
|
|
break;
|
|
|
|
case REG_MULTI_SZ:
|
|
hr = MultiSzBagToRegistry ( dwPropId, dwLogType );
|
|
break;
|
|
|
|
default:
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// Private methods
|
|
//
|
|
|
|
HRESULT
|
|
CPropertyUtils::MultiSzBagToBufferAlloc (
|
|
DWORD dwPropId,
|
|
DWORD dwLogType,
|
|
LPWSTR* pszMszBuf,
|
|
DWORD* pdwMszBufLen,
|
|
DWORD* pdwMszStringLen )
|
|
{
|
|
HRESULT hr = NOERROR;
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
DWORD dwCount = 0;
|
|
|
|
LPCWSTR szHtmlCountProp = NULL;
|
|
LPCWSTR szHtmlPathProp = NULL;
|
|
|
|
if ( IdCounterListProp == dwPropId ) {
|
|
if ( SLQ_COUNTER_LOG == dwLogType
|
|
|| SLQ_ALERT == dwLogType ) {
|
|
szHtmlCountProp = cwszHtmlSysmonCounterCount;
|
|
szHtmlPathProp = cwszHtmlSysmonCounterPath;
|
|
} else {
|
|
assert ( FALSE );
|
|
hr = E_INVALIDARG;
|
|
}
|
|
} else if ( IdGuidListProp == dwPropId ) {
|
|
if ( SLQ_TRACE_LOG == dwLogType ) {
|
|
szHtmlCountProp = cwszHtmlTraceProviderCount;
|
|
szHtmlPathProp = cwszHtmlTraceProviderGuid;
|
|
} else {
|
|
assert ( FALSE );
|
|
hr = E_INVALIDARG;
|
|
}
|
|
} else {
|
|
assert ( FALSE );
|
|
hr = E_INVALIDARG;
|
|
}
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
|
|
hr = DwordFromPropertyBag (
|
|
m_pPropBag,
|
|
szHtmlCountProp,
|
|
dwCount ); // Todo: Require counter count? Yes for now
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
DWORD dwIndex;
|
|
DWORD dwPropBagStringLen = 0;
|
|
|
|
assert ( 0 < dwCount );
|
|
|
|
for ( dwIndex = 1;
|
|
dwIndex <= dwCount && SUCCEEDED ( hr );
|
|
dwIndex++ ) {
|
|
|
|
WCHAR szPropName [MAX_PATH+1]; // Todo: Remove length restriction
|
|
|
|
swprintf ( szPropName, szHtmlPathProp, dwIndex );
|
|
|
|
hr = StringFromPropBagAlloc (
|
|
m_pPropBag,
|
|
szPropName,
|
|
&m_szPropBagBuffer,
|
|
&m_dwPropBagBufLen,
|
|
&dwPropBagStringLen );
|
|
|
|
|
|
if ( SUCCEEDED (hr ) ) {
|
|
if ( SLQ_ALERT != dwLogType ) {
|
|
dwStatus = AddStringToMszBufferAlloc (
|
|
m_szPropBagBuffer,
|
|
pszMszBuf,
|
|
pdwMszBufLen,
|
|
pdwMszStringLen );
|
|
if ( ERROR_SUCCESS != dwStatus ) {
|
|
hr = HRESULT_FROM_WIN32 ( dwStatus );
|
|
}
|
|
} else {
|
|
DWORD dwTemp;
|
|
DOUBLE dThreshold = 0;
|
|
WCHAR szAlert [MAX_PATH*2]; // Todo: Remove length restriction
|
|
|
|
swprintf ( szPropName, cwszHtmlAlertOverUnder, dwIndex );
|
|
|
|
hr = DwordFromPropertyBag (
|
|
m_pPropBag,
|
|
szPropName,
|
|
dwTemp );
|
|
|
|
if ( SUCCEEDED (hr ) ) {
|
|
swprintf ( szPropName, cwszHtmlAlertThreshold, dwIndex );
|
|
|
|
hr = DoubleFromPropertyBag (
|
|
m_pPropBag,
|
|
szPropName,
|
|
dThreshold );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
swprintf (
|
|
szAlert,
|
|
cwszAlertFormatString,
|
|
m_szPropBagBuffer,
|
|
( AIBF_OVER == (dwTemp&AIBF_OVER ) ) ? cwszGreaterThan : cwszLessThan,
|
|
dThreshold );
|
|
|
|
dwStatus = AddStringToMszBufferAlloc (
|
|
szAlert,
|
|
pszMszBuf,
|
|
pdwMszBufLen,
|
|
pdwMszStringLen );
|
|
if ( ERROR_SUCCESS != dwStatus ) {
|
|
hr = HRESULT_FROM_WIN32 ( dwStatus );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
CPropertyUtils::MultiSzBagToRegistry (
|
|
DWORD dwPropId,
|
|
DWORD dwLogType )
|
|
{
|
|
HRESULT hr = NOERROR;
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
LPWSTR szMszBuf = NULL;
|
|
DWORD dwMszBufLen = 0;
|
|
DWORD dwMszStringLen = 0;
|
|
|
|
LPCWSTR szRegListProp = NULL;
|
|
|
|
if ( IdCounterListProp == dwPropId ) {
|
|
if ( SLQ_COUNTER_LOG == dwLogType
|
|
|| SLQ_ALERT == dwLogType ) {
|
|
szRegListProp = cwszRegCounterList;
|
|
} else {
|
|
assert ( FALSE );
|
|
hr = E_INVALIDARG;
|
|
}
|
|
} else if ( IdGuidListProp == dwPropId ) {
|
|
if ( SLQ_TRACE_LOG == dwLogType ) {
|
|
szRegListProp = cwszRegTraceProviderList;
|
|
} else {
|
|
assert ( FALSE );
|
|
hr = E_INVALIDARG;
|
|
}
|
|
} else {
|
|
assert ( FALSE );
|
|
hr = E_INVALIDARG;
|
|
}
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
|
|
hr = MultiSzBagToBufferAlloc (
|
|
dwPropId,
|
|
dwLogType,
|
|
&szMszBuf,
|
|
&dwMszBufLen,
|
|
&dwMszStringLen );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
// Write buffer to the registry
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
dwStatus = WriteRegistryStringValue (
|
|
m_hkeyQuery,
|
|
szRegListProp,
|
|
REG_MULTI_SZ,
|
|
szMszBuf,
|
|
dwMszStringLen );
|
|
if ( ERROR_SUCCESS != dwStatus ) {
|
|
hr = HRESULT_FROM_WIN32 ( dwStatus );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( NULL != szMszBuf ) {
|
|
delete szMszBuf;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
CPropertyUtils::StringBagToRegistry (
|
|
DWORD dwPropId,
|
|
DWORD /* dwLogType */ )
|
|
{
|
|
HRESULT hr = NOERROR;
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
DWORD dwStringLen = 0;
|
|
|
|
hr = StringFromPropBagAlloc (
|
|
m_pPropBag,
|
|
m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
&m_szPropBagBuffer,
|
|
&m_dwPropBagBufLen,
|
|
&dwStringLen );
|
|
|
|
if ( SUCCEEDED ( hr ) && 0 != m_dwPropBagBufLen ) {
|
|
dwStatus = WriteRegistryStringValue (
|
|
m_hkeyQuery,
|
|
m_PropertyDataMap[dwPropId].cwszRegName,
|
|
m_PropertyDataMap[dwPropId].dwRegType,
|
|
m_szPropBagBuffer,
|
|
dwStringLen );
|
|
|
|
if ( ERROR_SUCCESS != dwStatus ) {
|
|
hr = HRESULT_FROM_WIN32 ( dwStatus );
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
CPropertyUtils::DwordBagToRegistry (
|
|
DWORD dwPropId,
|
|
DWORD /* dwLogType */ )
|
|
{
|
|
HRESULT hr = NOERROR;
|
|
DWORD dwValue = 0;
|
|
|
|
hr = DwordFromPropertyBag (
|
|
m_pPropBag,
|
|
m_PropertyDataMap[dwPropId].cwszHtmlName,
|
|
dwValue );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
DWORD dwStatus;
|
|
dwStatus = WriteRegistryDwordValue (
|
|
m_hkeyQuery,
|
|
m_PropertyDataMap[dwPropId].cwszRegName,
|
|
&dwValue,
|
|
m_PropertyDataMap[dwPropId].dwRegType); // Some values, e.g. Restart, are REG_BINARY
|
|
|
|
if ( ERROR_SUCCESS != dwStatus ) {
|
|
hr = HRESULT_FROM_WIN32 ( dwStatus );
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
CPropertyUtils::SlqTimeBagToRegistry (
|
|
DWORD dwPropId,
|
|
DWORD dwLogType )
|
|
{
|
|
HRESULT hr = NOERROR;
|
|
DWORD dwStatus = ERROR_SUCCESS;
|
|
SLQ_TIME_INFO stiData;
|
|
SLQ_TIME_INFO stiDefault;
|
|
LPCWSTR cwszRegPropName;
|
|
WORD wTimeType;
|
|
|
|
assert ( IdRestartProp == dwPropId
|
|
|| IdStartProp == dwPropId
|
|
|| IdStopProp == dwPropId
|
|
|| IdSampleProp == dwPropId );
|
|
|
|
if ( IdRestartProp == dwPropId ) {
|
|
// Dword processing can handle REG_BINARY as well.
|
|
hr = DwordBagToRegistry ( dwPropId, dwLogType );
|
|
|
|
} else {
|
|
|
|
assert ( IdStartProp == dwPropId
|
|
|| IdStopProp == dwPropId
|
|
|| IdSampleProp == dwPropId );
|
|
|
|
if ( IdStartProp == dwPropId ) {
|
|
wTimeType = SLQ_TT_TTYPE_START;
|
|
cwszRegPropName = cwszRegStartTime;
|
|
} else if ( IdStopProp == dwPropId ) {
|
|
wTimeType = SLQ_TT_TTYPE_STOP;
|
|
cwszRegPropName = cwszRegStopTime;
|
|
} else {
|
|
assert ( IdSampleProp == dwPropId );
|
|
wTimeType = SLQ_TT_TTYPE_SAMPLE;
|
|
cwszRegPropName = cwszRegSampleInterval;
|
|
}
|
|
|
|
// Initialize time structure to default, in case of missing fields.
|
|
hr = InitDefaultSlqTimeInfo (
|
|
dwLogType,
|
|
wTimeType,
|
|
&stiDefault );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
ZeroMemory ( &stiData, sizeof(stiData) );
|
|
hr = SlqTimeFromPropertyBag (
|
|
m_pPropBag,
|
|
wTimeType,
|
|
&stiDefault,
|
|
&stiData );
|
|
|
|
if ( SUCCEEDED ( hr ) ) {
|
|
dwStatus = WriteRegistrySlqTime (
|
|
m_hkeyQuery,
|
|
cwszRegPropName,
|
|
&stiData );
|
|
if ( ERROR_SUCCESS != dwStatus ) {
|
|
hr = HRESULT_FROM_WIN32 ( dwStatus );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
DWORD
|
|
CPropertyUtils::GetInvalidStatus (
|
|
DWORD dwPropId )
|
|
{
|
|
DWORD dwStatus;
|
|
|
|
if ( CPropertyUtils::m_PropertyDataMap[dwPropId].bRequired ) {
|
|
dwStatus = LOGMAN_REQUIRED_PROP_INVALID;
|
|
} else {
|
|
dwStatus = LOGMAN_NONREQ_PROP_INVALID;
|
|
}
|
|
|
|
return dwStatus;
|
|
}
|
|
|
|
DWORD
|
|
CPropertyUtils::GetMissingStatus (
|
|
DWORD dwPropId )
|
|
{
|
|
DWORD dwStatus;
|
|
|
|
if ( CPropertyUtils::m_PropertyDataMap[dwPropId].bRequired ) {
|
|
dwStatus = LOGMAN_REQUIRED_PROP_MISSING;
|
|
} else {
|
|
dwStatus = LOGMAN_NONREQ_PROP_MISSING;
|
|
}
|
|
|
|
return dwStatus;
|
|
}
|
|
|
|
BOOL
|
|
CPropertyUtils::IsValidDateTime (
|
|
LONGLONG& rllDateTime )
|
|
{
|
|
BOOL bIsValid = TRUE;
|
|
SYSTEMTIME SystemTime;
|
|
|
|
// Make sure that the date is reasonable. That is, not before 10/99
|
|
|
|
if (FileTimeToSystemTime((FILETIME*)&rllDateTime, &SystemTime)) {
|
|
if ( cwFirstValidYear > SystemTime.wYear ) {
|
|
bIsValid = FALSE;
|
|
}
|
|
} else {
|
|
bIsValid = FALSE;
|
|
}
|
|
return bIsValid;
|
|
}
|
|
|
|
BOOL
|
|
CPropertyUtils::IsKernelTraceMode (
|
|
IN DWORD dwTraceFlags )
|
|
{
|
|
BOOL bReturn;
|
|
|
|
bReturn = ( SLQ_TLI_ENABLE_KERNEL_MASK & dwTraceFlags ) ? TRUE : FALSE;
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
BOOL
|
|
CPropertyUtils::IsDisplayLevelMessage (
|
|
IN DWORD dwStatus )
|
|
{
|
|
BOOL bDisplay = FALSE;
|
|
DWORD dwSeverity = 0;
|
|
|
|
dwSeverity = dwStatus >> 30;
|
|
if ( dwSeverity >= (DWORD)m_eMessageDisplayLevel ) {
|
|
bDisplay = TRUE;
|
|
}
|
|
return bDisplay;
|
|
}
|