#ifndef __HELPERFUNCS_CPP #define __HELPERFUNCS_CPP /* * Class: * * WmiAllocator * * Description: * * Provides abstraction above heap allocation functions * * Version: * * Initial * * Last Changed: * * See Source Depot for change history * */ #include #include #include #include #include #include /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ #if 0 WmiStatusCode WmiHelper :: InitializeCriticalSection ( CRITICAL_SECTION *a_CriticalSection ) { SetStructuredExceptionHandler t_StructuredException ; WmiStatusCode t_StatusCode = e_StatusCode_Success ; try { :: InitializeCriticalSection ( a_CriticalSection ) ; } catch ( Structured_Exception & t_StructuredException ) { if ( t_StructuredException.GetExceptionCode () == STATUS_NO_MEMORY ) { t_StatusCode = e_StatusCode_OutOfMemory ; } else { t_StatusCode = e_StatusCode_Unknown ; #ifdef DBG assert ( FALSE ) ; #endif } } catch ( ... ) { t_StatusCode = e_StatusCode_Unknown ; #ifdef DBG assert ( FALSE ) ; #endif } return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ WmiStatusCode WmiHelper :: DeleteCriticalSection ( CRITICAL_SECTION *a_CriticalSection ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; :: DeleteCriticalSection ( a_CriticalSection ) ; return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ WmiStatusCode WmiHelper :: EnterCriticalSection ( CRITICAL_SECTION *a_CriticalSection , BOOL a_WaitCritical ) { SetStructuredExceptionHandler t_StructuredException ; WmiStatusCode t_StatusCode = e_StatusCode_Success ; BOOL t_Do ; do { try { :: EnterCriticalSection ( a_CriticalSection ) ; t_Do = FALSE ; } catch ( Structured_Exception & t_StructuredException ) { t_Do = a_WaitCritical ; if ( t_Do ) { Sleep ( 1000 ) ; } if ( t_StructuredException.GetExceptionCode () == STATUS_NO_MEMORY ) { t_StatusCode = e_StatusCode_OutOfMemory ; } else { t_StatusCode = e_StatusCode_Unknown ; #ifdef DBG assert ( FALSE ) ; #endif t_Do = FALSE ; } } catch ( ... ) { #ifdef DBG assert ( FALSE ) ; #endif t_Do = FALSE ; t_StatusCode = e_StatusCode_Unknown ; } } while ( t_Do ) ; return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ WmiStatusCode WmiHelper :: LeaveCriticalSection ( CRITICAL_SECTION *a_CriticalSection ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; :: LeaveCriticalSection ( a_CriticalSection ) ; return t_StatusCode ; } #endif WmiStatusCode WmiHelper :: InitializeCriticalSection ( CriticalSection *a_CriticalSection ) { return a_CriticalSection->valid() ? e_StatusCode_Success : e_StatusCode_OutOfMemory; } WmiStatusCode WmiHelper :: DeleteCriticalSection ( CriticalSection *a_CriticalSection ) { return e_StatusCode_Success ; } WmiStatusCode WmiHelper :: EnterCriticalSection ( CriticalSection *a_CriticalSection, BOOL a_WaitCritical ) { if (a_CriticalSection->valid()) { if (a_CriticalSection->acquire()) return e_StatusCode_Success; if (a_WaitCritical == FALSE ) return e_StatusCode_OutOfMemory; while (!a_CriticalSection->acquire()) Sleep(1000); return e_StatusCode_Success; } else return e_StatusCode_OutOfMemory ; } WmiStatusCode WmiHelper :: LeaveCriticalSection ( CriticalSection *a_CriticalSection ) { a_CriticalSection->release(); return e_StatusCode_Success ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ WmiStatusCode WmiHelper :: DuplicateString ( WmiAllocator &a_Allocator , const wchar_t *a_String , wchar_t *&a_DuplicatedString ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; if ( a_String ) { t_StatusCode = a_Allocator.New ( ( void ** ) & a_DuplicatedString , sizeof ( wchar_t ) * ( wcslen ( a_String ) + 1) ) ; if ( t_StatusCode == e_StatusCode_Success ) { StringCbCopyW ( a_DuplicatedString , sizeof ( wchar_t ) * ( wcslen ( a_String ) + 1) , a_String ) ; } } return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ WmiStatusCode WmiHelper :: CreateUnNamedEvent ( HANDLE &a_Event , BOOL a_ManualReset , BOOL a_InitialState ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; a_Event = CreateEvent ( NULL , a_ManualReset , a_InitialState , NULL ) ; if ( ! a_Event ) { t_StatusCode = e_StatusCode_OutOfResources ; } return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ WmiStatusCode WmiHelper :: CreateNamedEvent ( wchar_t *a_Name , HANDLE &a_Event , BOOL a_ManualReset , BOOL a_InitialState ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; if ( t_StatusCode == e_StatusCode_Success ) { a_Event = CreateEvent ( NULL , a_ManualReset , a_InitialState , a_Name ) ; if ( a_Event == NULL ) { if ( GetLastError () == ERROR_ALREADY_EXISTS ) { a_Event = OpenEvent ( EVENT_ALL_ACCESS , FALSE , a_Name ) ; if ( a_Event == NULL ) { t_StatusCode = e_StatusCode_Unknown ; } } else { t_StatusCode = e_StatusCode_OutOfResources ; } } } return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ WmiStatusCode WmiHelper :: DuplicateHandle ( HANDLE a_Handle , HANDLE &a_DuplicatedHandle ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; HANDLE t_ProcessHandle = GetCurrentProcess (); BOOL t_Status = :: DuplicateHandle ( t_ProcessHandle , a_Handle , t_ProcessHandle , & a_DuplicatedHandle , 0 , FALSE , DUPLICATE_SAME_ACCESS ) ; if ( ! t_Status ) { t_StatusCode = e_StatusCode_OutOfResources ; } return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ WmiStatusCode WmiHelper :: ConcatenateStrings ( ULONG a_ArgCount , BSTR *a_AllocatedString , ... ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; va_list t_VarArgList ; va_start ( t_VarArgList , a_AllocatedString ); ULONG t_AllocatedStringLength = 0 ; ULONG t_ArgIndex = 0 ; while ( t_ArgIndex < a_ArgCount ) { LPWSTR t_CurrentArg = va_arg ( t_VarArgList , LPWSTR ) ; if ( t_CurrentArg ) { t_AllocatedStringLength = t_AllocatedStringLength + wcslen ( t_CurrentArg ) ; } t_ArgIndex ++ ; } va_end ( t_VarArgList ) ; va_start ( t_VarArgList , a_AllocatedString ); *a_AllocatedString = SysAllocStringLen ( NULL , t_AllocatedStringLength + 1 ) ; size_t allocatedBufferSize = t_AllocatedStringLength + 1; if ( *a_AllocatedString ) { t_ArgIndex = 0 ; t_AllocatedStringLength = 0 ; while ( t_ArgIndex < a_ArgCount ) { LPWSTR t_CurrentArg = va_arg ( t_VarArgList , LPWSTR ) ; if ( t_CurrentArg ) { HRESULT hr = StringCchCopyW ( & ( ( * a_AllocatedString ) [ t_AllocatedStringLength ] ) , allocatedBufferSize -t_AllocatedStringLength, t_CurrentArg ) ; t_AllocatedStringLength = t_AllocatedStringLength + wcslen ( t_CurrentArg ) ; } t_ArgIndex ++ ; } ( ( *a_AllocatedString ) [ t_AllocatedStringLength ] ) = NULL ; } else { t_StatusCode = e_StatusCode_OutOfMemory ; } va_end ( t_VarArgList ) ; return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ WmiStatusCode WmiHelper :: ConcatenateStrings_Wchar ( ULONG a_ArgCount , wchar_t **a_AllocatedString , ... ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; va_list t_VarArgList ; va_start ( t_VarArgList , a_AllocatedString ); ULONG t_AllocatedStringLength = 0 ; ULONG t_ArgIndex = 0 ; while ( t_ArgIndex < a_ArgCount ) { LPWSTR t_CurrentArg = va_arg ( t_VarArgList , LPWSTR ) ; if ( t_CurrentArg ) { t_AllocatedStringLength = t_AllocatedStringLength + wcslen ( t_CurrentArg ) ; } t_ArgIndex ++ ; } va_end ( t_VarArgList ) ; va_start ( t_VarArgList , a_AllocatedString ); *a_AllocatedString = new wchar_t [ t_AllocatedStringLength + 1 ] ; size_t allocatedBufferSize = t_AllocatedStringLength + 1; if ( *a_AllocatedString ) { t_ArgIndex = 0 ; t_AllocatedStringLength = 0 ; while ( t_ArgIndex < a_ArgCount ) { LPWSTR t_CurrentArg = va_arg ( t_VarArgList , LPWSTR ) ; if ( t_CurrentArg ) { HRESULT hr = StringCchCopyW ( & ( ( * a_AllocatedString ) [ t_AllocatedStringLength ] ) , allocatedBufferSize -t_AllocatedStringLength, t_CurrentArg ) ; t_AllocatedStringLength = t_AllocatedStringLength + wcslen ( t_CurrentArg ) ; } t_ArgIndex ++ ; } ( ( *a_AllocatedString ) [ t_AllocatedStringLength ] ) = NULL ; } else { t_StatusCode = e_StatusCode_OutOfMemory ; } va_end ( t_VarArgList ) ; return t_StatusCode ; } #endif __HELPERFUNCS_CPP