windows-nt/Source/XPSP1/NT/sdktools/trace/logman/win2000/proputil.cpp

1477 lines
50 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
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;
}