Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-1999 Microsoft Corporation
//
// Module Name:
// RegistryValueName.cpp
//
// Abstract:
// Implementation of the CRegistryValueName class.
//
// Author:
// Vijayendra Vasu (vvasu) February 5, 1999
//
// Revision History:
// None.
//
/////////////////////////////////////////////////////////////////////////////
#define UNICODE 1
#define _UNICODE 1
#include "clusrtlp.h"
#include <string.h>
#include <tchar.h>
#include "RegistryValueName.h"
/////////////////////////////////////////////////////////////////////////////
// Type Definitions
/////////////////////////////////////////////////////////////////////////////
#define REGISTRY_SEPARATOR_CHAR L'\\'
#define REGISTRY_SEPARATOR_STRING L"\\"
/////////////////////////////////////////////////////////////////////////////
//++
//
// CRegistryValueName::ScInit
//
// Routine Description:
// Initialize the class.
//
// Arguments:
// pszOldName [IN] Old value name.
// pszOldKeyName [IN] Old key name.
//
// Return Value:
// ERROR_NOT_ENOUGH_MEMORY Error allocating memory.
//
//--
/////////////////////////////////////////////////////////////////////////////
DWORD CRegistryValueName::ScInit( IN LPCWSTR pszOldName, IN LPCWSTR pszOldKeyName ) { DWORD _sc = ERROR_SUCCESS; DWORD _cbBufSize; LPWSTR _pszBackslashPointer;
// Dummy do to avoid goto
do { if ( pszOldName == NULL ) { FreeBuffers(); m_pszKeyName = pszOldKeyName; break; } // if: no value name specified
//
// Look for a backslash in the name.
//
_pszBackslashPointer = ::wcsrchr( pszOldName, REGISTRY_SEPARATOR_CHAR ); if ( _pszBackslashPointer == NULL ) { //
// The name does not contain a backslash.
// No memory allocation need be made.
//
FreeBuffers(); m_pszName = pszOldName; m_pszKeyName = pszOldKeyName; break; } // if: no backslash found
//
// Copy all characters after the last backslash into m_pszName.
//
_cbBufSize = ( ::lstrlenW( _pszBackslashPointer + 1 ) + 1 ) * sizeof( *m_pszName );
//
// Don't allocate memory if the existing buffer is already big enough to hold
// the required string.
//
if ( _cbBufSize > m_cbNameBufferSize ) { if ( m_cbNameBufferSize > 0 ) { ::LocalFree( const_cast< LPWSTR >( m_pszName ) ); m_cbNameBufferSize = 0; }
m_pszName = static_cast< LPWSTR >( ::LocalAlloc( LMEM_FIXED, _cbBufSize ) ); if ( m_pszName == NULL ) { FreeBuffers(); _sc = ERROR_NOT_ENOUGH_MEMORY; break; } // if: error allocating memory
else { m_cbNameBufferSize = _cbBufSize; }
} // if: the existing buffer is not big enough
//
// Copy everything past the last backslash to the name buffer.
//
::lstrcpyW( const_cast< LPWSTR >( m_pszName ), _pszBackslashPointer + 1 );
//
// Everything before the last backslash is part of the key name path.
// Append it to the specified key name.
//
{ DWORD _cchNewKeyNameLength = 0;
if ( pszOldKeyName != NULL ) { _cchNewKeyNameLength = lstrlenW( pszOldKeyName ); } // if: key name specified
_cchNewKeyNameLength += static_cast< DWORD >( _pszBackslashPointer - pszOldName );
//
// nNewKeyNameLength is zero if pszOldKeyName is NULL and pszBackslashPointer
// is the same as pszOldName (that is the backslash is the first character
// of pszOldName). In this case, m_pszKeyName is to remain NULL.
//
if ( _cchNewKeyNameLength != 0 ) { //
// Allocate space for m_pszKeyName, the appended backslash character,
// and the terminating '\0'.
//
_cbBufSize = _cchNewKeyNameLength * sizeof( *m_pszKeyName ) + sizeof( REGISTRY_SEPARATOR_CHAR ) + sizeof( L'\0' ); //
// Don't allocate memory if the existing buffer is already big enough to hold
// the required string.
//
if ( _cbBufSize > m_cbKeyNameBufferSize ) { if ( m_cbKeyNameBufferSize > 0 ) { ::LocalFree( const_cast< LPWSTR >( m_pszKeyName ) ); m_cbKeyNameBufferSize = 0; }
m_pszKeyName = static_cast< LPWSTR >( ::LocalAlloc( LMEM_FIXED, _cbBufSize ) ); if ( m_pszKeyName == NULL ) { FreeBuffers(); _sc = ERROR_NOT_ENOUGH_MEMORY; break; } // if: error allocating memory
else { m_cbKeyNameBufferSize = _cbBufSize; }
} // if: the existing buffer is not big enough
if ( pszOldKeyName != NULL ) { //
// Copy the old key name if it exists into the new buffer and
// append a backslash character to it.
//
::lstrcpyW( const_cast< LPWSTR >( m_pszKeyName ), pszOldKeyName ); ::lstrcatW( const_cast< LPWSTR >( m_pszKeyName ), REGISTRY_SEPARATOR_STRING ); } // if: key name specified
else { *(const_cast< LPWSTR >( m_pszKeyName )) = L'\0'; } // if: no key name specified
//
// Concatenate all the characters of pszOldName upto (but not including)
// the first backslash character.
//
::wcsncat( const_cast< LPWSTR >( m_pszKeyName ), pszOldName, static_cast< DWORD >( _pszBackslashPointer - pszOldName ) );
} // if: cchNewKeyNameLength != 0
}
} while( FALSE ); // Dummy do-while
return _sc;
} //*** CRegistryValueName::ScInit()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CRegistryValueName::FreeBuffers
//
// Routine Description:
// Cleanup our allocations.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CRegistryValueName::FreeBuffers( void ) { if ( m_cbNameBufferSize > 0 ) { ::LocalFree( const_cast< LPWSTR >( m_pszName ) ); m_cbNameBufferSize = 0; }
if ( m_cbKeyNameBufferSize > 0 ) { ::LocalFree( const_cast< LPWSTR >( m_pszKeyName ) ); m_cbKeyNameBufferSize = 0; }
m_pszName = NULL; m_pszKeyName = NULL;
} //*** CRegistryValueName::FreeBuffers()
|