286 lines
7.1 KiB
C++
286 lines
7.1 KiB
C++
#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;
|
|
|
|
|
|
|
|
}
|
|
|