windows-nt/Source/XPSP1/NT/admin/cmdline/cmdevtgprov/general.cpp
2020-09-26 16:20:57 +08:00

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;
}