341 lines
6.4 KiB
C++
341 lines
6.4 KiB
C++
/**********************************************************************/
|
||
/** Microsoft Windows NT **/
|
||
/** Copyright(c) Microsoft Corp., 1997 **/
|
||
/**********************************************************************/
|
||
|
||
/*
|
||
registry.cxx
|
||
|
||
This module contains registry classes.
|
||
|
||
|
||
FILE HISTORY:
|
||
7/7/97 michth ported from metadata.
|
||
*/
|
||
extern "C" {
|
||
#include <nt.h>
|
||
#include <ntrtl.h>
|
||
#include <nturtl.h>
|
||
}
|
||
#include <dbgutil.h>
|
||
#include <apiutil.h>
|
||
#include <loadmd.hxx>
|
||
#include <loadadm.hxx>
|
||
#include <ole2.h>
|
||
#include <inetsvcs.h>
|
||
#include <buffer.hxx>
|
||
#include <registry.hxx>
|
||
|
||
MDRegKey::MDRegKey (
|
||
HKEY hKeyBase,
|
||
LPCTSTR pchSubKey,
|
||
REGSAM regSam,
|
||
LPCTSTR pchServerName
|
||
)
|
||
: m_hKey(NULL),
|
||
m_dwDisposition(0)
|
||
{
|
||
HKEY hkBase = NULL ;
|
||
DWORD err = ERROR_SUCCESS;
|
||
|
||
if ( pchServerName != NULL)
|
||
{
|
||
//
|
||
// This is a remote connection.
|
||
//
|
||
err = ::RegConnectRegistry((LPTSTR)pchServerName, hKeyBase, &hkBase);
|
||
if (err != ERROR_SUCCESS)
|
||
{
|
||
hkBase = NULL ;
|
||
SetLastError(err);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
hkBase = hKeyBase ;
|
||
}
|
||
|
||
if (err == ERROR_SUCCESS)
|
||
{
|
||
if ( pchSubKey )
|
||
{
|
||
err = ::RegOpenKeyEx( hkBase, pchSubKey, 0, regSam, & m_hKey ) ;
|
||
}
|
||
else
|
||
{
|
||
m_hKey = hkBase ;
|
||
hkBase = NULL ;
|
||
}
|
||
|
||
if ( hkBase && hkBase != hKeyBase )
|
||
{
|
||
::RegCloseKey( hkBase ) ;
|
||
}
|
||
}
|
||
|
||
if ( err != ERROR_SUCCESS)
|
||
{
|
||
m_hKey = NULL ;
|
||
}
|
||
SetLastError(err);
|
||
}
|
||
|
||
//
|
||
// Constructor creating a new key.
|
||
//
|
||
MDRegKey::MDRegKey (
|
||
LPCTSTR pchSubKey,
|
||
HKEY hKeyBase,
|
||
DWORD dwOptions,
|
||
REGSAM regSam,
|
||
LPSECURITY_ATTRIBUTES pSecAttr,
|
||
LPCTSTR pchServerName
|
||
)
|
||
: m_hKey(NULL),
|
||
m_dwDisposition(0)
|
||
{
|
||
HKEY hkBase = NULL ;
|
||
DWORD err = 0;
|
||
|
||
if (pchServerName != NULL)
|
||
{
|
||
//
|
||
// This is a remote connection.
|
||
//
|
||
err = ::RegConnectRegistry((LPTSTR)pchServerName, hKeyBase, & hkBase);
|
||
if (err != ERROR_SUCCESS)
|
||
{
|
||
hkBase = NULL;
|
||
SetLastError(err);
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
hkBase = hKeyBase ;
|
||
}
|
||
|
||
if (err == ERROR_SUCCESS)
|
||
{
|
||
LPCTSTR szEmpty = TEXT("") ;
|
||
|
||
err = ::RegCreateKeyEx( hkBase, pchSubKey, 0, (TCHAR *) szEmpty,
|
||
dwOptions, regSam, pSecAttr, &m_hKey, &m_dwDisposition );
|
||
}
|
||
if (err != ERROR_SUCCESS)
|
||
{
|
||
m_hKey = NULL ;
|
||
}
|
||
SetLastError(err);
|
||
}
|
||
|
||
MDRegKey::~MDRegKey()
|
||
{
|
||
if (m_hKey != NULL)
|
||
{
|
||
::RegCloseKey( m_hKey ) ;
|
||
}
|
||
}
|
||
|
||
DWORD
|
||
MDRegKey::QueryValue (
|
||
LPTSTR pchValueName,
|
||
DWORD * pdwType,
|
||
DWORD * pdwSize,
|
||
BUFFER *pbufData
|
||
)
|
||
{
|
||
DWORD dwReturn = ERROR_SUCCESS;
|
||
|
||
*pdwSize = pbufData->QuerySize();
|
||
|
||
dwReturn = ::RegQueryValueEx(*this, (LPTSTR) pchValueName,
|
||
0, pdwType, (PBYTE) pbufData->QueryPtr(), pdwSize);
|
||
|
||
if (dwReturn == ERROR_MORE_DATA) {
|
||
if (pbufData->Resize(*pdwSize)) {
|
||
*pdwSize = pbufData->QuerySize();
|
||
dwReturn = ::RegQueryValueEx(*this, (LPTSTR) pchValueName,
|
||
0, pdwType, (PBYTE)pbufData->QueryPtr(), pdwSize);
|
||
}
|
||
}
|
||
|
||
return dwReturn;
|
||
}
|
||
|
||
//
|
||
// Overloaded value setting members.
|
||
//
|
||
DWORD
|
||
MDRegKey::SetValue (
|
||
LPCTSTR pchValueName,
|
||
DWORD dwType,
|
||
DWORD dwSize,
|
||
PBYTE pbData
|
||
)
|
||
{
|
||
return ::RegSetValueEx( *this, pchValueName, 0, dwType,
|
||
pbData, dwSize );
|
||
}
|
||
|
||
|
||
DWORD
|
||
MDRegKey::DeleteValue (
|
||
LPCTSTR pchValueName
|
||
)
|
||
{
|
||
return ::RegDeleteValue( *this, (LPTSTR) pchValueName);
|
||
}
|
||
|
||
DWORD
|
||
MDRegKey::QueryKeyInfo (
|
||
MDREGKEY_KEY_INFO * pRegKeyInfo
|
||
)
|
||
{
|
||
DWORD err = 0 ;
|
||
|
||
pRegKeyInfo->dwClassNameSize = sizeof pRegKeyInfo->chBuff - 1 ;
|
||
|
||
err = ::RegQueryInfoKey(*this,
|
||
pRegKeyInfo->chBuff,
|
||
&pRegKeyInfo->dwClassNameSize,
|
||
NULL,
|
||
&pRegKeyInfo->dwNumSubKeys,
|
||
&pRegKeyInfo->dwMaxSubKey,
|
||
&pRegKeyInfo->dwMaxClass,
|
||
&pRegKeyInfo->dwMaxValues,
|
||
&pRegKeyInfo->dwMaxValueName,
|
||
&pRegKeyInfo->dwMaxValueData,
|
||
&pRegKeyInfo->dwSecDesc,
|
||
&pRegKeyInfo->ftKey
|
||
);
|
||
|
||
return err ;
|
||
}
|
||
|
||
//
|
||
// Iteration class
|
||
//
|
||
MDRegKeyIter::MDRegKeyIter (
|
||
MDRegKey & regKey
|
||
)
|
||
: m_rk_iter( regKey ),
|
||
m_p_buffer( NULL ),
|
||
m_cb_buffer( 0 )
|
||
{
|
||
DWORD err = 0 ;
|
||
|
||
MDRegKey::MDREGKEY_KEY_INFO regKeyInfo ;
|
||
|
||
Reset() ;
|
||
|
||
err = regKey.QueryKeyInfo( & regKeyInfo ) ;
|
||
|
||
if ( err == 0 )
|
||
{
|
||
m_cb_buffer = regKeyInfo.dwMaxSubKey + sizeof (DWORD) ;
|
||
m_p_buffer = new TCHAR [ m_cb_buffer ] ;
|
||
if (m_p_buffer == NULL) {
|
||
err = ERROR_NOT_ENOUGH_MEMORY ;
|
||
}
|
||
}
|
||
SetLastError(err);
|
||
}
|
||
|
||
MDRegKeyIter :: ~ MDRegKeyIter ()
|
||
{
|
||
delete [] m_p_buffer ;
|
||
}
|
||
|
||
//
|
||
// Get the name (and optional last write time) of the next key.
|
||
//
|
||
|
||
DWORD MDRegKeyIter::Next(
|
||
LPTSTR *ppszName,
|
||
FILETIME *pTime,
|
||
DWORD dwIndex
|
||
)
|
||
{
|
||
DWORD err = 0;
|
||
|
||
FILETIME ftDummy ;
|
||
DWORD dwNameSize = m_cb_buffer ;
|
||
|
||
if (dwIndex != 0xffffffff) {
|
||
m_dw_index = dwIndex;
|
||
}
|
||
|
||
err = ::RegEnumKeyEx( m_rk_iter, m_dw_index, m_p_buffer, & dwNameSize,
|
||
NULL, NULL, NULL, & ftDummy ) ;
|
||
|
||
if (err == ERROR_SUCCESS)
|
||
{
|
||
++m_dw_index;
|
||
|
||
if ( pTime )
|
||
{
|
||
*pTime = ftDummy ;
|
||
}
|
||
|
||
*ppszName = m_p_buffer;
|
||
}
|
||
|
||
return err;
|
||
}
|
||
|
||
MDRegValueIter::MDRegValueIter (
|
||
MDRegKey ®Key
|
||
)
|
||
: m_rk_iter(regKey),
|
||
m_p_buffer(NULL),
|
||
m_cb_buffer(0)
|
||
{
|
||
DWORD err = 0;
|
||
|
||
MDRegKey::MDREGKEY_KEY_INFO regKeyInfo ;
|
||
|
||
Reset() ;
|
||
|
||
err = regKey.QueryKeyInfo( & regKeyInfo ) ;
|
||
|
||
if (err == ERROR_SUCCESS)
|
||
{
|
||
m_cb_buffer = regKeyInfo.dwMaxValueName + sizeof (DWORD);
|
||
m_p_buffer = new TCHAR [ m_cb_buffer ] ;
|
||
if (m_p_buffer == NULL) {
|
||
err = ERROR_NOT_ENOUGH_MEMORY ;
|
||
}
|
||
}
|
||
SetLastError(err);
|
||
}
|
||
|
||
MDRegValueIter::~MDRegValueIter()
|
||
{
|
||
delete [] m_p_buffer;
|
||
}
|
||
|
||
DWORD
|
||
MDRegValueIter::Next (
|
||
LPTSTR * ppszName,
|
||
DWORD * pdwType
|
||
)
|
||
{
|
||
DWORD err = 0 ;
|
||
|
||
DWORD dwNameLength = m_cb_buffer ;
|
||
|
||
err = ::RegEnumValue(m_rk_iter, m_dw_index, m_p_buffer,
|
||
&dwNameLength, NULL, pdwType, NULL, NULL );
|
||
|
||
if ( err == ERROR_SUCCESS )
|
||
{
|
||
++m_dw_index;
|
||
|
||
*ppszName = m_p_buffer;
|
||
}
|
||
|
||
return err;
|
||
}
|
||
|