windows-nt/Source/XPSP1/NT/ds/adsi/utils/registry.cxx
2020-09-26 16:20:57 +08:00

187 lines
4.1 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996.
//
// File: registry.cxx
//
// Contents: Registry utilities
//
// Classes:
//
// Functions:
//
// History: 23-May-1996 RamV (Ram Viswanathan) Created
//
//----------------------------------------------------------------------------
#include "procs.hxx"
#pragma hdrstop
//+---------------------------------------------------------------------------
//
// Function: SetKeyAndValue
//
// Synopsis: Used for setting a key value
//
//
// Arguments: pszRegLocation: where to look for/create key
// pszKey : name of the Key
// pszSubKey: name of the subkey
// pszValue : Value to set
//
// Returns: HRESULT
//
// Modifies:
//
// History: 5/21/1996 RamV Created.
//
//----------------------------------------------------------------------------
HRESULT
SetKeyAndValue(
LPTSTR pszRegLocation,
LPTSTR pszKey,
LPTSTR pszSubKey,
LPTSTR pszValue
)
{
HKEY hKey;
TCHAR szKey[MAX_PATH];
LONG lErrorCode;
HRESULT hr = S_OK;
_tcscpy(szKey, pszRegLocation);
if (pszSubKey != NULL){
_tcscpy(szKey, TEXT("\\"));
_tcscat(szKey, pszSubKey);
}
lErrorCode = RegCreateKeyEx(HKEY_CURRENT_USER,
szKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKey,
NULL);
if (lErrorCode != ERROR_SUCCESS){
return HRESULT_FROM_WIN32(lErrorCode);
}
if (pszValue != NULL){
lErrorCode = RegSetValueEx(hKey,
pszKey,
0,
REG_SZ,
(BYTE *)pszValue,
(_tcslen(pszValue)+1)*sizeof(TCHAR));
if(lErrorCode != ERROR_SUCCESS){
hr = HRESULT_FROM_WIN32(lErrorCode);
goto cleanup;
}
}
cleanup:
RegCloseKey(hKey);
return S_OK;
}
HRESULT
QueryKeyValue(
LPTSTR pszRegLocation,
LPTSTR pszKey,
LPTSTR * ppszValue
)
{
LONG lErrorCode;
TCHAR szKey[MAX_PATH];
DWORD dwDataLen;
DWORD dwType;
HKEY hKey = NULL;
HRESULT hr = S_OK;
dwDataLen = sizeof(TCHAR)* MAX_PATH;
*ppszValue = (LPTSTR)AllocADsMem( dwDataLen );
if(!*ppszValue){
hr = E_OUTOFMEMORY;
goto cleanup;
}
_tcscpy(szKey, pszRegLocation);
lErrorCode = RegOpenKeyEx(HKEY_CURRENT_USER,
szKey,
NULL,
KEY_READ,
&hKey);
if( lErrorCode != ERROR_SUCCESS){
hr = HRESULT_FROM_WIN32(lErrorCode);
goto cleanup;
}
lErrorCode = RegQueryValueEx(hKey,
pszKey,
NULL,
&dwType,
(LPBYTE)*ppszValue,
&dwDataLen);
if (lErrorCode == ERROR_MORE_DATA){
FreeADsMem(*ppszValue);
*ppszValue = NULL;
*ppszValue = (LPTSTR)AllocADsMem (dwDataLen);
if(!*ppszValue){
hr = E_OUTOFMEMORY;
goto cleanup;
}
lErrorCode = RegQueryValueEx(hKey,
pszKey,
NULL,
&dwType,
(LPBYTE)*ppszValue,
&dwDataLen);
hr = HRESULT_FROM_WIN32(lErrorCode);
BAIL_IF_ERROR(hr);
} else if (lErrorCode != ERROR_SUCCESS) {
hr = HRESULT_FROM_WIN32(lErrorCode);
FreeADsMem(*ppszValue);
*ppszValue = NULL;
}
cleanup:
if(hKey){
RegCloseKey(hKey);
}
RRETURN(hr);
}