#include "precomp.h" #include "global.h" #include "PolData.h" /* static */ void CPolicyData::FlushCachedInfData( HANDLE hFile ) { std::list< std::string >::iterator I = ms_CachedInfData . begin(); DWORD cbWritten; while( I != ms_CachedInfData . end() ) { if( !WriteFile( hFile, ( *I ) . c_str(), lstrlen( ( *I ) . c_str() ), &cbWritten, NULL ) ) { assert( 0 ); ErrorMessage(); return; } I++; } ms_CachedInfData . erase( ms_CachedInfData . begin(), ms_CachedInfData . end() ); } /* static */ std::list< std::string > CPolicyData::ms_CachedInfData; CPolicyData::CPolicyData( eKeyType KeyType, const char* szKeyName, const char* szValueName, DWORD dwVal ) { m_KeyType = KeyType; m_ValueType = ValueType_DWORD; m_dwVal = dwVal; m_szKeyName = MakeCopyOfString( szKeyName ); m_szValueName = MakeCopyOfString( szValueName ); } CPolicyData::CPolicyData( eKeyType KeyType, const char* szKeyName, const char* szValueName, const char* szVal ) { m_KeyType = KeyType; m_ValueType = ValueType_String; m_szVal = MakeCopyOfString( szVal ); m_szKeyName = MakeCopyOfString( szKeyName ); m_szValueName = MakeCopyOfString( szValueName ); } CPolicyData::CPolicyData( eValueType ValType, eKeyType KeyType, const char* szKeyName, const char* szValueName, const char* szVal ) { m_KeyType = KeyType; m_ValueType = ValType; m_szVal = MakeCopyOfString( szVal ); m_szKeyName = MakeCopyOfString( szKeyName ); m_szValueName = MakeCopyOfString( szValueName ); } CPolicyData::CPolicyData( eKeyType KeyType, const char* szKeyName, const char* szValueName, const OpDelete& r ) { m_KeyType = KeyType; m_ValueType = ValueType_Delete; m_szKeyName = MakeCopyOfString( szKeyName ); m_szValueName = MakeCopyOfString( szValueName ); } CPolicyData::CPolicyData( const CPolicyData& r ) : m_ValueType ( ValueType_NotInitialized ) { *this = r; } CPolicyData::~CPolicyData( void ) { _KillHeapData(); } CPolicyData& CPolicyData::operator=( const CPolicyData& r ) { _KillHeapData(); m_KeyType = r . m_KeyType; switch( m_ValueType = r . m_ValueType ) { case ValueType_BinaryAsString: case ValueType_String: m_szVal = MakeCopyOfString( r . m_szVal ); break; case ValueType_DWORD: m_dwVal = r.m_dwVal; break; } m_szKeyName = MakeCopyOfString( r . m_szKeyName ); m_szValueName = MakeCopyOfString( r . m_szValueName ); return *this; } #define KEYSIZE 1000 BOOL CPolicyData::SaveToINFFile( HANDLE hFile ) { DWORD cbWritten; static char szLastKey[ KEYSIZE ] = ""; // We have to save the key name first char szKey[ KEYSIZE ]; switch( m_KeyType ) { case eKeyType_HKEY_CURRENT_USER: strcpy( szKey, "HKCU," ); break; case eKeyType_HKEY_LOCAL_MACHINE: strcpy( szKey, "HKLM," ); break; default: assert( 0 ); break; } strcat( szKey, "\"" ); strcat( szKey, m_szKeyName ); strcat( szKey, "\",\"" ); strcat( szKey, m_szValueName ); strcat( szKey, "\"" ); switch( m_ValueType ) { case ValueType_String: // 0 is FLG_ADDREG_TYPE_SZ strcat( szKey, ",0,\"" ); if( NULL == m_szVal ) { strcat( szKey, "" ); } else { strcat( szKey, m_szVal ); } strcat( szKey, "\"" ); break; case ValueType_DWORD: // 1 is FLG_ADDREG_TYPE_BINARY // NOTE that DWORDs are 4 byte BINARY values. This works on // all platforms. The later FLG_ADDREG_TYPE_DWORD isn't // supported on Win95. strcat( szKey, ",1," ); sprintf( szKey + lstrlen( szKey ), "%x, %x, %x, %x", LOBYTE( LOWORD( m_dwVal ) ), HIBYTE( LOWORD( m_dwVal ) ), LOBYTE( HIWORD( m_dwVal ) ), HIBYTE( HIWORD( m_dwVal ) )); break; case ValueType_BinaryAsString: // 1 is FLG_ADDREG_TYPE_BINARY strcat( szKey, ",1," ); strcat( szKey, m_szVal ); break; case ValueType_Delete: strcat( szKey, "\r\n" ); ms_CachedInfData . push_back( szKey ); return TRUE; default: assert( 0 ); break; } strcat( szKey, "\r\n" ); RETFAIL( WriteFile( hFile, szKey, lstrlen( szKey ), &cbWritten, NULL ) ); return TRUE; } // This will break if the following occurs: // Same key name as the last call in this process // but a new file.... BOOL CPolicyData::SaveToREGFile( HANDLE hFile ) { DWORD cbWritten; static char szLastKey[ KEYSIZE ] = ""; // We have to save the key name first char szKey[ KEYSIZE ]; strcpy( szKey, "[" ); switch( m_KeyType ) { case eKeyType_HKEY_CURRENT_USER: strcat( szKey, "HKEY_CURRENT_USER\\" ); break; case eKeyType_HKEY_LOCAL_MACHINE: strcat( szKey, "HKEY_LOCAL_MACHINE\\" ); break; default: assert( 0 ); break; } strcat( szKey, m_szKeyName ); strcat( szKey, "]\n" ); if( strcmp( szLastKey, szKey ) ) { // We hawe to save the key first if it is different // From the last one RETFAIL( WriteFile( hFile, szKey, lstrlen( szKey ), &cbWritten, NULL ) ); strcpy( szLastKey, szKey ); } char szVal[ KEYSIZE ]; strcpy( szVal, "\"" ); strcat( szVal, m_szValueName ); strcat( szVal, "\"=" ); switch( m_ValueType ) { case ValueType_String: if( NULL == m_szVal ) { strcat( szVal, "\"\"\n" ); } else { strcat( szVal, "\"" ); strcat( szVal, m_szVal ); strcat( szVal, "\"\n" ); } break; case ValueType_DWORD: strcat( szVal, "dword:" ); sprintf( szVal + lstrlen( szVal ), "%x", m_dwVal ); strcat( szVal, "\n" ); break; case ValueType_BinaryAsString: strcat( szVal, "hex:" ); strcat( szVal, m_szVal ); strcat( szVal, "\n" ); break; case ValueType_Delete: strcat( szVal, "-\n" ); break; default: assert( 0 ); break; } RETFAIL( WriteFile( hFile, szVal, lstrlen( szVal ), &cbWritten, NULL ) ); return TRUE; } void CPolicyData::_KillHeapData( void ) { if( ( ValueType_String == m_ValueType ) || ( ValueType_BinaryAsString == m_ValueType ) ) { delete [] m_szVal; m_szVal = NULL; m_ValueType = ValueType_NotInitialized; } delete [] m_szKeyName; m_szKeyName = NULL; delete m_szValueName; m_szValueName = NULL; }