|
|
/*++
Copyright (c) 1998-1999 Microsoft Corporation All rights reserved.
Module Name:
dbgreg.cxx
Abstract:
Debug Registry class
Author:
Steve Kiraly (SteveKi) 18-Jun-1998
Revision History:
--*/ #include "precomp.hxx"
#pragma hdrstop
#include "dbgloadl.hxx"
#include "dbgreg.hxx"
TDebugRegApis:: TDebugRegApis( VOID ) : m_Lib( _T("advapi32.dll") ), m_bValid( FALSE ), m_CreateKeyEx (NULL ), m_OpenKeyEx( NULL ), m_CloseKey( NULL ), m_QueryValueEx( NULL ), m_SetValueEx( NULL ), m_EnumKeyEx( NULL ), m_DeleteKey( NULL ) { if( m_Lib.bValid() ) { m_CreateKeyEx = reinterpret_cast<pfRegCreateKeyEx> ( m_Lib.pfnGetProc( "RegCreateKeyEx" SUFFIX ) ); m_OpenKeyEx = reinterpret_cast<pfRegOpenKeyEx> ( m_Lib.pfnGetProc( "RegOpenKeyEx" SUFFIX ) ); m_CloseKey = reinterpret_cast<pfRegCloseKey> ( m_Lib.pfnGetProc( "RegCloseKey" ) ); m_QueryValueEx = reinterpret_cast<pfRegQueryValueEx> ( m_Lib.pfnGetProc( "RegQueryValueEx" SUFFIX ) ); m_SetValueEx = reinterpret_cast<pfRegSetValueEx> ( m_Lib.pfnGetProc( "RegSetValueEx" SUFFIX ) ); m_EnumKeyEx = reinterpret_cast<pfRegEnumKeyEx> ( m_Lib.pfnGetProc( "RegEnumKeyEx" SUFFIX ) ); m_DeleteKey = reinterpret_cast<pfRegDeleteKey> ( m_Lib.pfnGetProc( "RegDeleteKey" SUFFIX ) ); m_DeleteValue = reinterpret_cast<pfRegDeleteValue> ( m_Lib.pfnGetProc( "RegDeleteValue" SUFFIX ) );
if( m_CreateKeyEx && m_OpenKeyEx && m_CloseKey && m_QueryValueEx && m_SetValueEx && m_EnumKeyEx && m_DeleteKey && m_DeleteValue ) { m_bValid = TRUE; } } }
BOOL TDebugRegApis:: bValid( VOID ) const { return m_bValid; }
TDebugRegistry:: TDebugRegistry( IN LPCTSTR pszSection, IN UINT ioFlags, IN HKEY hOpenedKey ) : m_strSection( pszSection ), m_hKey( NULL ), m_Status( ERROR_SUCCESS ) { DBG_ASSERT( pszSection ); DBG_ASSERT( hOpenedKey );
if( m_Reg.bValid() ) { DWORD dwDisposition = 0; UINT uAccessIndex = 0;
static DWORD adwAccess [] = { 0, KEY_READ, KEY_WRITE, KEY_ALL_ACCESS };
uAccessIndex = ioFlags & ( kRead | kWrite );
if( uAccessIndex ) { if( ioFlags & kCreate ) { m_Status = m_Reg.m_CreateKeyEx( hOpenedKey, m_strSection, 0, NULL, 0, adwAccess[ uAccessIndex ], NULL, &m_hKey, &dwDisposition ); }
if( ioFlags & kOpen ) { m_Status = m_Reg.m_OpenKeyEx( hOpenedKey, m_strSection, 0, adwAccess[ uAccessIndex ], &m_hKey ); } } } }
TDebugRegistry:: ~TDebugRegistry( VOID ) { if( m_hKey ) { m_Reg.m_CloseKey( m_hKey ); } }
BOOL TDebugRegistry:: bValid( VOID ) const { //
// A valid hKey and a valid section name is the class valid check.
//
return m_hKey != NULL && m_strSection.bValid() && m_Reg.bValid(); }
DWORD TDebugRegistry:: LastError( VOID ) const { return m_Status; }
BOOL TDebugRegistry:: bRead( IN LPCTSTR pValueName, IN OUT DWORD &dwValue ) { DBG_ASSERT( bValid() ); DBG_ASSERT( pValueName );
DWORD dwType = REG_DWORD; DWORD dwSize = sizeof( dwValue );
m_Status = m_Reg.m_QueryValueEx( m_hKey, pValueName, NULL, &dwType, reinterpret_cast<LPBYTE>( &dwValue ), &dwSize );
return m_Status == ERROR_SUCCESS && dwType == REG_DWORD; }
BOOL TDebugRegistry:: bRead( IN LPCTSTR pValueName, IN OUT BOOL &bValue ) { DBG_ASSERT( bValid() ); DBG_ASSERT( pValueName );
DWORD dwType = REG_DWORD; DWORD dwSize = sizeof( bValue );
m_Status = m_Reg.m_QueryValueEx( m_hKey, pValueName, NULL, &dwType, reinterpret_cast<LPBYTE>( &bValue ), &dwSize );
return m_Status == ERROR_SUCCESS && dwType == REG_DWORD; }
BOOL TDebugRegistry:: bRead( IN LPCTSTR pValueName, IN OUT TDebugString &strValue ) { DBG_ASSERT( bValid() ); DBG_ASSERT( pValueName );
TCHAR szBuffer[kHint]; DWORD dwType = REG_SZ; BOOL bStatus = FALSE; DWORD dwSize = sizeof( szBuffer );
m_Status = m_Reg.m_QueryValueEx( m_hKey, pValueName, NULL, &dwType, reinterpret_cast<LPBYTE>( szBuffer ), &dwSize );
if( m_Status == ERROR_MORE_DATA && dwType == REG_SZ && dwSize ) { LPTSTR pszBuff = INTERNAL_NEW TCHAR[ dwSize ];
if( pszBuff ) { m_Status = m_Reg.m_QueryValueEx( m_hKey, pValueName, NULL, &dwType, reinterpret_cast<LPBYTE>( pszBuff ), &dwSize ); } else { m_Status = ERROR_NOT_ENOUGH_MEMORY; }
if( m_Status == ERROR_SUCCESS ) { bStatus = strValue.bUpdate( pszBuff ); }
INTERNAL_DELETE [] pszBuff;
} else { if( m_Status == ERROR_SUCCESS && dwType == REG_SZ ) { bStatus = strValue.bUpdate( szBuffer ); } }
return bStatus; }
BOOL TDebugRegistry:: bRead( IN LPCTSTR pValueName, IN OUT PVOID pValue, IN DWORD cbSize, IN LPDWORD pcbNeeded OPTIONAL ) { DBG_ASSERT( bValid() ); DBG_ASSERT( pValueName ); DBG_ASSERT( pValue );
DWORD dwType = REG_BINARY; BOOL bStatus = FALSE; DWORD dwSize = cbSize;
m_Status = m_Reg.m_QueryValueEx( m_hKey, pValueName, NULL, &dwType, reinterpret_cast<LPBYTE>( pValue ), &dwSize );
if( m_Status == ERROR_MORE_DATA && pcbNeeded ) { *pcbNeeded = dwSize; }
return m_Status == ERROR_SUCCESS && dwType == REG_BINARY && dwSize == cbSize; }
BOOL TDebugRegistry:: bWrite( IN LPCTSTR pValueName, IN const DWORD dwValue ) { DBG_ASSERT( bValid() ); DBG_ASSERT( pValueName );
m_Status = m_Reg.m_SetValueEx( m_hKey, pValueName, 0, REG_DWORD, reinterpret_cast<const BYTE *>( &dwValue ), sizeof( dwValue ) );
return m_Status == ERROR_SUCCESS; }
BOOL TDebugRegistry:: bWrite( IN LPCTSTR pValueName, IN LPCTSTR pszValue ) { DBG_ASSERT( bValid() ); DBG_ASSERT( pValueName );
m_Status = m_Reg.m_SetValueEx( m_hKey, pValueName, 0, REG_SZ, reinterpret_cast<const BYTE *>( pszValue ), _tcslen( pszValue ) * sizeof( TCHAR ) + sizeof( TCHAR ) );
return m_Status == ERROR_SUCCESS; }
BOOL TDebugRegistry:: bWrite( IN LPCTSTR pValueName, IN const PVOID pValue, IN DWORD cbSize ) { DBG_ASSERT( bValid() ); DBG_ASSERT( pValueName ); DBG_ASSERT( pValue );
m_Status = m_Reg.m_SetValueEx( m_hKey, pValueName, 0, REG_BINARY, reinterpret_cast<const BYTE *>( pValue ), cbSize );
return m_Status == ERROR_SUCCESS; }
BOOL TDebugRegistry:: bRemove( IN LPCTSTR pValueName ) { DBG_ASSERT( bValid() ); DBG_ASSERT( pValueName );
m_Status = m_Reg.m_DeleteValue( m_hKey, pValueName );
return m_Status == ERROR_SUCCESS; }
BOOL TDebugRegistry:: bRemoveKey( IN LPCTSTR pKeyName ) { DBG_ASSERT( bValid() ); DBG_ASSERT( pKeyName );
m_Status = dwRecursiveRegDeleteKey( m_hKey, pKeyName );
return m_Status == ERROR_SUCCESS; }
DWORD TDebugRegistry:: dwRecursiveRegDeleteKey( IN HKEY hKey, IN LPCTSTR pszSubkey ) const { HKEY hSubkey = NULL;
DWORD dwStatus = m_Reg.m_OpenKeyEx( hKey, pszSubkey, 0, KEY_ALL_ACCESS, &hSubkey );
while ( dwStatus == ERROR_SUCCESS ) { TCHAR szSubkey[ MAX_PATH ]; DWORD cbSubkeySize = COUNTOF( szSubkey );
dwStatus = m_Reg.m_EnumKeyEx( hSubkey, 0, szSubkey, &cbSubkeySize, 0, 0, 0, 0 );
if( dwStatus == ERROR_NO_MORE_ITEMS ) break;
if( dwStatus != ERROR_SUCCESS ) return dwStatus;
dwStatus = dwRecursiveRegDeleteKey( hSubkey, szSubkey ); }
if( hSubkey ) { m_Reg.m_CloseKey( hSubkey ); }
dwStatus = m_Reg.m_DeleteKey( hKey, pszSubkey );
return dwStatus; }
|