487 lines
13 KiB
C++
487 lines
13 KiB
C++
|
//***************************************************************************
|
||
|
// Copyright (c) Microsoft Corporation
|
||
|
//
|
||
|
// Module Name:
|
||
|
// GENERAL.CPP
|
||
|
//
|
||
|
// Abstract:
|
||
|
// Source file that that contains general functions implementation.
|
||
|
//
|
||
|
// Author:
|
||
|
// Vasundhara .G
|
||
|
//
|
||
|
// Revision History:
|
||
|
// Vasundhara .G 9-oct-2k : Created It.
|
||
|
//***************************************************************************
|
||
|
|
||
|
#include "pch.h"
|
||
|
#include "EventConsumerProvider.h"
|
||
|
#include "General.h"
|
||
|
#include "resource.h"
|
||
|
extern HMODULE g_hModule;
|
||
|
|
||
|
//
|
||
|
// internal functions ... private
|
||
|
//
|
||
|
|
||
|
//***************************************************************************
|
||
|
// Routine Description:
|
||
|
// Returns the variant string for a variable of type LPCTSTR .
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszValue [in] - A LPCTSTR value to convert into varaint type.
|
||
|
// pVariant [in/out] - A VARAINT type variable which hold the variant
|
||
|
// type for the given LPCTSTR string.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// A Variant type string.
|
||
|
//***************************************************************************
|
||
|
inline VARIANT* AsVariant( LPCTSTR pszValue, VARIANT* pVariant )
|
||
|
{
|
||
|
// local variables
|
||
|
WCHAR wszValue[ MAX_STRING_LENGTH + 1 ] = L"\0";
|
||
|
|
||
|
// set the variant structure
|
||
|
VariantInit( pVariant );
|
||
|
pVariant->vt = VT_BSTR;
|
||
|
pVariant->bstrVal = GetAsUnicodeString( pszValue, wszValue, MAX_STRING_LENGTH );
|
||
|
|
||
|
// return the out parameter itself as the return value
|
||
|
return pVariant;
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
// Routine Description:
|
||
|
// Returns the variant value for a variable of type DWORD .
|
||
|
//
|
||
|
// Arguments:
|
||
|
// dwValue [in] - A DWORD value to convert into varaint type.
|
||
|
// pVariant [in/out] - A VARAINT type variable which hold the variant
|
||
|
// type for the given DWORD.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// A Variant type string.
|
||
|
//***************************************************************************
|
||
|
inline VARIANT* AsVariant( DWORD dwValue, VARIANT* pVariant )
|
||
|
{
|
||
|
// set the variant structure
|
||
|
VariantInit( pVariant );
|
||
|
pVariant->vt = VT_UI1;
|
||
|
pVariant->ulVal = dwValue;
|
||
|
|
||
|
// return the out parameter itself as the return value
|
||
|
return pVariant;
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
// Routine Description:
|
||
|
// Get the value of a property for the given instance .
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pWmiObject[in] - A pointer to wmi class.
|
||
|
// szProperty [in] - property name whose value to be returned.
|
||
|
// dwType [in] - Data Type of the property.
|
||
|
// pValue [in/out] - Variable to hold the data.
|
||
|
// dwSize [in] - size of the variable.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// HRESULT value.
|
||
|
//***************************************************************************
|
||
|
HRESULT PropertyGet( IWbemClassObject* pWmiObject,
|
||
|
LPCTSTR szProperty,
|
||
|
DWORD dwType, LPVOID pValue, DWORD dwSize )
|
||
|
{
|
||
|
// local variables
|
||
|
HRESULT hr = S_OK;
|
||
|
VARIANT varValue;
|
||
|
LPWSTR pwszValue = NULL;
|
||
|
WCHAR wszProperty[ MAX_STRING_LENGTH ] = L"\0";
|
||
|
|
||
|
// value should not be NULL
|
||
|
if ( pValue == NULL )
|
||
|
{
|
||
|
return S_FALSE;
|
||
|
}
|
||
|
// initialize the values with zeros ... to be on safe side
|
||
|
memset( pValue, 0, dwSize );
|
||
|
memset( wszProperty, 0, MAX_STRING_LENGTH );
|
||
|
|
||
|
// get the property name in UNICODE version
|
||
|
GetAsUnicodeString( szProperty, wszProperty, MAX_STRING_LENGTH );
|
||
|
|
||
|
// initialize the variant and then get the value of the specified property
|
||
|
VariantInit( &varValue );
|
||
|
hr = pWmiObject->Get( wszProperty, 0, &varValue, NULL, NULL );
|
||
|
if ( FAILED( hr ) )
|
||
|
{
|
||
|
// clear the variant variable
|
||
|
VariantClear( &varValue );
|
||
|
|
||
|
// failed to get the value for the property
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
// get and put the value
|
||
|
switch( varValue.vt )
|
||
|
{
|
||
|
case VT_EMPTY:
|
||
|
case VT_NULL:
|
||
|
break;
|
||
|
|
||
|
case VT_I2:
|
||
|
*( ( short* ) pValue ) = V_I2( &varValue );
|
||
|
break;
|
||
|
|
||
|
case VT_I4:
|
||
|
*( ( long* ) pValue ) = V_I4( &varValue );
|
||
|
break;
|
||
|
|
||
|
case VT_R4:
|
||
|
*( ( float* ) pValue ) = V_R4( &varValue );
|
||
|
break;
|
||
|
|
||
|
case VT_R8:
|
||
|
*( ( double* ) pValue ) = V_R8( &varValue );
|
||
|
break;
|
||
|
|
||
|
|
||
|
case VT_UI1:
|
||
|
*( ( UINT* ) pValue ) = V_UI1( &varValue );
|
||
|
break;
|
||
|
|
||
|
case VT_BSTR:
|
||
|
{
|
||
|
// get the unicode value
|
||
|
pwszValue = V_BSTR( &varValue );
|
||
|
|
||
|
// get the comptable string
|
||
|
GetCompatibleStringFromUnicode( pwszValue, ( LPTSTR ) pValue, dwSize );
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// clear the variant variable
|
||
|
VariantClear( &varValue );
|
||
|
|
||
|
// inform success
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
// Routine Description:
|
||
|
// putt the value of a property for the given instance .
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pWmiObject[in] - A pointer to wmi class.
|
||
|
// szProperty [in] - property name whose value to be set.
|
||
|
// SZValue [in/out] - Variable that hold the data.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// HRESULT value.
|
||
|
//***************************************************************************
|
||
|
HRESULT PropertyPut( IWbemClassObject* pWmiObject, LPCTSTR szProperty, LPCTSTR szValue )
|
||
|
{
|
||
|
// local variables
|
||
|
HRESULT hr;
|
||
|
VARIANT var;
|
||
|
WCHAR wszProperty[ MAX_STRING_LENGTH + 1 ] = L"\0";
|
||
|
|
||
|
// put the value
|
||
|
hr = pWmiObject->Put( GetAsUnicodeString( szProperty, wszProperty, MAX_STRING_LENGTH ),
|
||
|
0, AsVariant( szValue, &var ), VT_BSTR );
|
||
|
|
||
|
// clear the variant
|
||
|
VariantClear( &var );
|
||
|
|
||
|
// now check the result of 'put' operation
|
||
|
if ( FAILED( hr ) )
|
||
|
{
|
||
|
return hr; // put has failed
|
||
|
}
|
||
|
// put is success ... inform the same
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
// Routine Description:
|
||
|
// put the value of a property for the given instance .
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pWmiObject[in] - A pointer to wmi class.
|
||
|
// szProperty [in] - property name whose value to be set.
|
||
|
// dwValue [in] - Variable that hold the data.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// HRESULT value.
|
||
|
//***************************************************************************
|
||
|
HRESULT PropertyPut( IWbemClassObject* pWmiObject, LPCTSTR szProperty, DWORD dwValue )
|
||
|
{
|
||
|
// local variables
|
||
|
HRESULT hr = S_OK;
|
||
|
VARIANT var;
|
||
|
WCHAR wszProperty[ MAX_STRING_LENGTH + 1 ] = L"\0";
|
||
|
|
||
|
// put the value
|
||
|
hr = pWmiObject->Put( GetAsUnicodeString( szProperty, wszProperty, MAX_STRING_LENGTH ),
|
||
|
0, AsVariant( dwValue, &var ), VT_UI1 );
|
||
|
|
||
|
// clear the variant
|
||
|
VariantClear( &var );
|
||
|
|
||
|
// now check the result of 'put' operation
|
||
|
if ( FAILED( hr ) )
|
||
|
{
|
||
|
return hr; // put has failed
|
||
|
}
|
||
|
|
||
|
// put is success ... inform the same
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
// Routine Description:
|
||
|
// To write the log into log file.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// lpErrString [in] - text that hold the status of creating a trigger.
|
||
|
// lpTrigName [in] - trigger name.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// none.
|
||
|
//***************************************************************************
|
||
|
VOID ErrorLog( LPCTSTR lpErrString, LPWSTR lpTrigName, DWORD dwID )
|
||
|
{
|
||
|
LPTSTR lpTemp = NULL;
|
||
|
LPSTR lpFilePath = NULL;
|
||
|
FILE *fLogFile = NULL;
|
||
|
DWORD dwResult = 0;
|
||
|
LPTSTR lpResStr = NULL;
|
||
|
|
||
|
|
||
|
if( ( lpErrString == NULL ) || ( lpTrigName == NULL ) )
|
||
|
return;
|
||
|
|
||
|
lpResStr = ( LPTSTR ) __calloc( MAX_RES_STRING1 + 1, sizeof( TCHAR ) );
|
||
|
lpTemp = ( LPTSTR )calloc( MAX_RES_STRING1, sizeof( TCHAR ) );
|
||
|
if( ( lpTemp == NULL ) || ( lpResStr == NULL ) )
|
||
|
{
|
||
|
FREESTRING( lpTemp );
|
||
|
FREESTRING( lpResStr );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
dwResult = GetWindowsDirectory( lpTemp, MAX_RES_STRING1 );
|
||
|
if( dwResult == 0 )
|
||
|
{
|
||
|
FREESTRING( lpTemp );
|
||
|
FREESTRING( lpResStr );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
lstrcat( lpTemp, LOG_FILE_PATH );
|
||
|
CreateDirectory( lpTemp, NULL );
|
||
|
lstrcat( lpTemp, LOG_FILE );
|
||
|
|
||
|
lpFilePath = ( LPSTR )calloc( MAX_RES_STRING1, sizeof( TCHAR ) );
|
||
|
if( lpFilePath == NULL )
|
||
|
{
|
||
|
FREESTRING( lpTemp );
|
||
|
FREESTRING( lpResStr );
|
||
|
return;
|
||
|
}
|
||
|
GetAsMultiByteString( lpTemp, lpFilePath, MAX_RES_STRING1 );
|
||
|
|
||
|
memset( lpTemp, 0, MAX_RES_STRING * sizeof( TCHAR ) );
|
||
|
|
||
|
if ( (fLogFile = fopen( lpFilePath, "a" )) != NULL )
|
||
|
{
|
||
|
LPSTR lpReason = NULL;
|
||
|
lpReason = ( LPSTR )calloc( MAX_RES_STRING1, sizeof( TCHAR ) );
|
||
|
if( lpReason == NULL )
|
||
|
{
|
||
|
FREESTRING( lpTemp );
|
||
|
FREESTRING( lpResStr );
|
||
|
FREESTRING( lpFilePath );
|
||
|
fclose( fLogFile );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
GetFormattedTime( lpTemp );
|
||
|
if( lpTemp == NULL )
|
||
|
{
|
||
|
FREESTRING( lpResStr );
|
||
|
FREESTRING( lpFilePath );
|
||
|
return;
|
||
|
}
|
||
|
GetAsMultiByteString( NEW_LINE, lpReason, MAX_RES_STRING1 );
|
||
|
fprintf( fLogFile, lpReason );
|
||
|
GetAsMultiByteString( lpTemp, lpReason, MAX_RES_STRING1 );
|
||
|
fprintf( fLogFile, lpReason );
|
||
|
|
||
|
memset( lpTemp, 0, MAX_RES_STRING1 * sizeof( TCHAR ) );
|
||
|
|
||
|
LoadStringW( g_hModule, IDS_TRIGGERNAME, lpResStr, MAX_RES_STRING1 );
|
||
|
lstrcpy( lpTemp, lpResStr );
|
||
|
lstrcat( lpTemp, lpTrigName );
|
||
|
GetAsMultiByteString( NEW_LINE, lpReason, MAX_RES_STRING1 );
|
||
|
fprintf( fLogFile, lpReason );
|
||
|
GetAsMultiByteString( lpTemp, lpReason, MAX_RES_STRING1 );
|
||
|
fprintf( fLogFile, lpReason );
|
||
|
|
||
|
memset( lpTemp, 0, MAX_RES_STRING1 * sizeof( TCHAR ) );
|
||
|
LoadStringW( g_hModule, IDS_TRIGGERID, lpResStr, MAX_RES_STRING1 );
|
||
|
wsprintf( lpTemp, lpResStr, dwID );
|
||
|
GetAsMultiByteString( NEW_LINE, lpReason, MAX_RES_STRING1 );
|
||
|
fprintf( fLogFile, lpReason );
|
||
|
GetAsMultiByteString( lpTemp, lpReason, MAX_RES_STRING1 );
|
||
|
fprintf( fLogFile, lpReason );
|
||
|
|
||
|
memset( lpTemp, 0, MAX_RES_STRING1 * sizeof( TCHAR ) );
|
||
|
lstrcat( lpTemp, lpErrString );
|
||
|
GetAsMultiByteString( NEW_LINE, lpReason, MAX_RES_STRING1 );
|
||
|
fprintf( fLogFile, lpReason );
|
||
|
GetAsMultiByteString( lpTemp, lpReason, MAX_RES_STRING1 );
|
||
|
fprintf( fLogFile, lpReason );
|
||
|
GetAsMultiByteString( NEW_LINE, lpReason, MAX_RES_STRING1 );
|
||
|
fprintf( fLogFile, lpReason );
|
||
|
free( lpReason );
|
||
|
fclose( fLogFile );
|
||
|
}
|
||
|
|
||
|
FREESTRING( lpTemp );
|
||
|
FREESTRING( lpResStr );
|
||
|
FREESTRING( lpFilePath );
|
||
|
}
|
||
|
|
||
|
//***************************************************************************
|
||
|
// Routine Description:
|
||
|
// Get the system date and time in specified format .
|
||
|
//
|
||
|
// Arguments:
|
||
|
// lpDate [in/out] - string that holds the current date.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//***************************************************************************
|
||
|
VOID GetFormattedTime( LPTSTR lpDate )
|
||
|
{
|
||
|
TCHAR szTime[MAX_STRING_LENGTH];
|
||
|
INT cch = 0;
|
||
|
|
||
|
if( lpDate == NULL )
|
||
|
return;
|
||
|
cch = GetDateFormat( LOCALE_USER_DEFAULT, 0, NULL, DATE_FORMAT, szTime, SIZE_OF_ARRAY( szTime ) );
|
||
|
// cch includes null terminator, change it to a space to separate from time.
|
||
|
szTime[ cch - 1 ] = ' ';
|
||
|
|
||
|
// Get time and format to characters
|
||
|
|
||
|
GetTimeFormat( LOCALE_USER_DEFAULT, NULL, NULL, TIME_FORMAT, szTime + cch, SIZE_OF_ARRAY( szTime ) - cch );
|
||
|
|
||
|
lstrcpy( lpDate, ( LPTSTR )szTime );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
// Routine Description:
|
||
|
// This routine splits the input parameters into 2 substrings and returns it.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// szInput [in] : Input string.
|
||
|
// szFirstString [in/out] : First Output string containing the path of the
|
||
|
// file.
|
||
|
// szSecondString [in/out]: The second output containing the paramters.
|
||
|
//
|
||
|
// Return Value :
|
||
|
// A BOOL value indicating TRUE on success else FALSE
|
||
|
// on failure
|
||
|
******************************************************************************/
|
||
|
BOOL ProcessFilePath( LPTSTR szInput, LPTSTR szFirstString, LPTSTR szSecondString )
|
||
|
{
|
||
|
|
||
|
_TCHAR *pszTok = NULL ;
|
||
|
_TCHAR *pszSep = NULL ;
|
||
|
|
||
|
_TCHAR szTmpString[MAX_RES_STRING] = NULL_STRING;
|
||
|
_TCHAR szTmpInStr[MAX_RES_STRING] = NULL_STRING;
|
||
|
_TCHAR szTmpOutStr[MAX_RES_STRING] = NULL_STRING;
|
||
|
_TCHAR szTmpString1[MAX_RES_STRING] = NULL_STRING;
|
||
|
DWORD dwCnt = 0 ;
|
||
|
DWORD dwLen = 0 ;
|
||
|
|
||
|
#ifdef _WIN64
|
||
|
INT64 dwPos ;
|
||
|
#else
|
||
|
DWORD dwPos ;
|
||
|
#endif
|
||
|
|
||
|
//checking if the input parameters are NULL and if so
|
||
|
// return FAILURE. This condition will not come
|
||
|
// but checking for safety sake.
|
||
|
|
||
|
if( ( szInput == NULL ) || ( _tcslen( szInput ) == 0 ) )
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
_tcscpy( szTmpString, szInput );
|
||
|
_tcscpy( szTmpString1, szInput );
|
||
|
_tcscpy( szTmpInStr, szInput );
|
||
|
|
||
|
// check for first double quote (")
|
||
|
if ( szTmpInStr[0] == SINGLE_QUOTE_CHAR )
|
||
|
{
|
||
|
// trim the first double quote
|
||
|
StrTrim( szTmpInStr, SINGLE_QUOTE_STRING );
|
||
|
|
||
|
// check for end double quote
|
||
|
pszSep = _tcschr( szTmpInStr, SINGLE_QUOTE_CHAR ) ;
|
||
|
|
||
|
// get the position
|
||
|
dwPos = pszSep - szTmpInStr + 1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// check for the space
|
||
|
pszSep = _tcschr( szTmpInStr, CHAR_SPACE ) ;
|
||
|
|
||
|
// get the position
|
||
|
dwPos = pszSep - szTmpInStr;
|
||
|
|
||
|
}
|
||
|
|
||
|
if ( pszSep != NULL )
|
||
|
{
|
||
|
szTmpInStr[dwPos] = NULL_CHAR;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_tcscpy( szFirstString, szTmpString );
|
||
|
_tcscpy( szSecondString, NULL_STRING );
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
// intialize the variable
|
||
|
dwCnt = 0 ;
|
||
|
|
||
|
// get the length of the string
|
||
|
dwLen = _tcslen ( szTmpString );
|
||
|
|
||
|
// check for end of string
|
||
|
while ( ( dwPos <= dwLen ) && szTmpString[dwPos++] != NULL_CHAR )
|
||
|
{
|
||
|
szTmpOutStr[dwCnt++] = szTmpString[dwPos];
|
||
|
}
|
||
|
|
||
|
// trim the executable and arguments
|
||
|
StrTrim( szTmpInStr, SINGLE_QUOTE_STRING );
|
||
|
StrTrim( szTmpInStr, STRING_SPACE );
|
||
|
|
||
|
_tcscpy( szFirstString, szTmpInStr );
|
||
|
_tcscpy( szSecondString, szTmpOutStr );
|
||
|
|
||
|
// return success
|
||
|
return TRUE;
|
||
|
}
|