windows-nt/Source/XPSP1/NT/net/config/inc/ncreg.h
2020-09-26 16:20:57 +08:00

557 lines
13 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: N C R E G . H
//
// Contents: Common routines for dealing with the registry.
//
// Notes:
//
// Author: danielwe 24 Mar 1997
//
//----------------------------------------------------------------------------
#pragma once
#ifndef _NCREG_H_
#define _NCREG_H_
#include "ncstring.h"
// constants for HrRegQueryStringAsUlong
const int c_nBase10 = 10;
const int c_nBase16 = 16;
const int c_cchMaxRegKeyLengthWithNull = 257;
const DWORD KEY_READ_WRITE_DELETE = KEY_READ | KEY_WRITE | DELETE;
const DWORD KEY_READ_WRITE = KEY_READ | KEY_WRITE;
HRESULT
HrRegAddStringToMultiSz (
IN PCWSTR pszAddString,
IN HKEY hkeyRoot,
IN PCWSTR pszKeySubPath,
IN PCWSTR pszValueName,
IN DWORD dwFlags,
IN DWORD dwIndex);
HRESULT
HrRegAddStringToSz (
IN PCWSTR pszAddString,
IN HKEY hkeyRoot,
IN PCWSTR pszKeySubPath,
IN PCWSTR pszValueName,
IN WCHAR chDelimiter,
IN DWORD dwFlags,
IN DWORD dwStringIndex);
HRESULT
HrRegCopyHive (
IN HKEY hkeySrc,
IN HKEY hkeyDst);
HRESULT
HrRegCreateKeyEx (
IN HKEY hkey,
IN PCWSTR pszSubkey,
IN DWORD dwOptions,
IN REGSAM samDesired,
IN LPSECURITY_ATTRIBUTES lpSecurityAttributes,
OUT PHKEY phkResult,
OUT LPDWORD pdwDisposition);
HRESULT
HrRegDeleteKey (
IN HKEY hkey,
IN PCWSTR pszSubkey);
HRESULT
HrRegDeleteKeyTree (
IN HKEY hkeyParent,
IN PCWSTR pszRemoveKey);
HRESULT
HrRegDeleteValue (
IN HKEY hkey,
IN PCWSTR pszValueName);
HRESULT
HrRegEnumKey (
IN HKEY hkey,
IN DWORD dwIndex,
OUT PWSTR pszSubkeyName,
IN DWORD cchSubkeyName);
HRESULT
HrRegEnumKeyEx (
IN HKEY hkey,
IN DWORD dwIndex,
OUT PWSTR pszSubkeyName,
OUT LPDWORD pcchSubkeyName,
OUT PWSTR pszClass,
OUT LPDWORD pcchClass,
OUT FILETIME* pftLastWriteTime);
HRESULT
HrRegEnumValue (
HKEY hkey,
DWORD dwIndex,
PWSTR pszValueName,
LPDWORD pcbValueName,
LPDWORD pdwType,
LPBYTE pbData,
LPDWORD pcbData);
HRESULT
HrRegOpenKeyEx (
HKEY hkey,
PCWSTR pszSubkey,
REGSAM samDesired,
PHKEY phkResult);
HRESULT
HrRegOpenKeyBestAccess (
HKEY hkey,
PCWSTR pszSubkey,
PHKEY phkResult);
HRESULT
HrRegDuplicateKeyEx (
HKEY hkey,
REGSAM samDesired,
PHKEY phkResult);
HRESULT
HrRegQueryBinaryWithAlloc (
HKEY hkey,
PCWSTR pszValueName,
LPBYTE* ppbValue,
DWORD* pcbValue);
HRESULT
HrRegQueryDword (
HKEY hkey,
PCWSTR pszValueName,
LPDWORD pdwValue);
HRESULT
HrRegQueryExpandString (
HKEY hkey,
PCWSTR pszValueName,
tstring* pstrValue);
HRESULT
HrRegQueryInfoKey (
HKEY hkey,
PWSTR pszClass,
LPDWORD pcbClass,
LPDWORD pcSubKeys,
LPDWORD pcbMaxSubKeyLen,
LPDWORD pcbMaxClassLen,
LPDWORD pcValues,
LPDWORD pcbMaxValueNameLen,
LPDWORD pcbMaxValueLen,
LPDWORD pcbSecurityDescriptor,
PFILETIME pftLastWriteTime);
HRESULT
HrRegQueryStringAsUlong (
HKEY hkey,
PCWSTR pszValueName,
int nBase,
ULONG* pulValue);
HRESULT
HrRegQueryTypeString (
HKEY hkey,
PCWSTR pszValueName,
DWORD dwType,
tstring* pstr);
HRESULT
HrRegQueryTypeSzBuffer (
HKEY hkey,
PCWSTR pszValueName,
DWORD dwType,
PWSTR pszData,
DWORD* pcbData);
HRESULT
HrRegQueryValueEx (
HKEY hkey,
PCWSTR pszValueName,
LPDWORD pdwType,
LPBYTE pbData,
LPDWORD pcbData);
HRESULT
HrRegQueryValueWithAlloc (
HKEY hkey,
PCWSTR pszValueName,
LPDWORD pdwType,
LPBYTE* ppbBuffer,
LPDWORD pdwSize);
HRESULT HrRegGetKeySecurity (
HKEY hKey,
SECURITY_INFORMATION SecurityInformation,
PSECURITY_DESCRIPTOR pSecurityDescriptor,
LPDWORD lpcbSecurityDescriptor
);
HRESULT HrRegSetKeySecurity (
HKEY hKey,
SECURITY_INFORMATION SecurityInformation,
PSECURITY_DESCRIPTOR pSecurityDescriptor
);
template<class T>
HRESULT HrRegQueryColString( HKEY hkey, PCWSTR pszValueName, T* pcolstr );
inline
HRESULT
HrRegQueryString (
HKEY hkey,
PCWSTR pszValueName,
tstring* pstr)
{
return HrRegQueryTypeString (hkey, pszValueName, REG_SZ, pstr);
}
HRESULT
HrRegQueryTypeWithAlloc (
HKEY hkey,
PCWSTR pszValueName,
DWORD dwType,
LPBYTE* ppbValue,
DWORD* pcbValue);
inline
HRESULT
HrRegQueryBinaryWithAlloc (
HKEY hkey,
PCWSTR pszValueName,
LPBYTE* ppbValue,
DWORD* pcbValue)
{
return HrRegQueryTypeWithAlloc (hkey, pszValueName, REG_BINARY,
ppbValue, pcbValue);
}
inline
HRESULT
HrRegQueryMultiSzWithAlloc (
HKEY hkey,
PCWSTR pszValueName,
PWSTR* pszValue)
{
return HrRegQueryTypeWithAlloc (hkey, pszValueName, REG_MULTI_SZ,
(LPBYTE*)pszValue, NULL);
}
inline
HRESULT
HrRegQuerySzWithAlloc (
HKEY hkey,
PCWSTR pszValueName,
PWSTR* pszValue)
{
return HrRegQueryTypeWithAlloc (hkey, pszValueName, REG_SZ,
(LPBYTE*)pszValue, NULL);
}
inline
HRESULT
HrRegQueryExpandSzBuffer (
HKEY hkey,
PCWSTR pszValueName,
PWSTR pszData,
DWORD* pcbData)
{
return HrRegQueryTypeSzBuffer (hkey, pszValueName, REG_EXPAND_SZ,
pszData, pcbData);
}
inline
HRESULT
HrRegQuerySzBuffer (
HKEY hkey,
PCWSTR pszValueName,
PWSTR pszData,
DWORD* pcbData)
{
return HrRegQueryTypeSzBuffer (hkey, pszValueName, REG_SZ,
pszData, pcbData);
}
HRESULT HrRegSaveKey(HKEY hkey, PCWSTR szFileName,
LPSECURITY_ATTRIBUTES psa);
HRESULT HrRegSetValueEx (HKEY hkey,
PCWSTR szValueName,
DWORD dwType,
const BYTE *pbData,
DWORD cbData);
HRESULT HrRegRemoveStringFromSz( PCWSTR pszRemoveString,
HKEY hkeyRoot,
PCWSTR pszKeySubPath,
PCWSTR pszValueName,
WCHAR chDelimiter,
DWORD dwFlags );
HRESULT HrRegRemoveStringFromMultiSz (PCWSTR pszRemoveString,
HKEY hkeyRoot,
PCWSTR pszKeySubPath,
PCWSTR pszValueName,
DWORD dwFlags);
HRESULT HrRegRestoreKey(HKEY hkey, PCWSTR pszFileName, DWORD dwFlags);
HRESULT HrRegOpenAdapterKey(
PCWSTR pszComponentName,
BOOL fCreate,
HKEY* phkey);
//+---------------------------------------------------------------------------
//
// Function: HrRegSetColString
//
// Purpose: Sets a multi-sz in the registry using the collection of strings
//
// Arguments:
// hkey [in] The registry key.
// pszValueName [in] The name of the value to set.
// colstr [in] The collection of tstrings to set.
//
// Returns: S_OK or an HRESULT_FROM_WIN32 error code.
//
// Author: mikemi 30 Apr 1997
//
// Notes:
//
//---------------------------------------------------------------------------
template<class T>
HRESULT HrRegSetColString(HKEY hkey, PCWSTR pszValueName, const T& colstr);
HRESULT
HrRegSetBool (
IN HKEY hkey,
IN PCWSTR pszValueName,
IN BOOL fValue);
HRESULT
HrRegSetDword (
IN HKEY hkey,
IN PCWSTR pszValueName,
IN DWORD dwValue);
HRESULT
HrRegSetGuidAsSz (
IN HKEY hkey,
IN PCWSTR pszValueName,
IN const GUID& guid);
//+---------------------------------------------------------------------------
//
// Function: HrRegSetMultiSz
//
// Purpose: Sets a multi-sz in the registry. Assures that its type and
// size are correct. Easier to read than HrRegSetValueEx
// with 5 parameters. Type safe (no LPBYTE stuff).
//
// Arguments:
// hkey [in] The registry key.
// pszValueName [in] The name of the value to set.
// pszValue [in] The multi-sz to set.
//
// Returns: S_OK or an HRESULT_FROM_WIN32 error code.
//
// Author: shaunco 1 Apr 1997
//
// Notes:
//
inline HRESULT HrRegSetMultiSz (HKEY hkey, PCWSTR pszValueName, PCWSTR pszValue)
{
return HrRegSetValueEx (
hkey,
pszValueName,
REG_MULTI_SZ,
(LPBYTE)pszValue,
(CchOfMultiSzAndTermSafe (pszValue) * sizeof(WCHAR)));
}
//+---------------------------------------------------------------------------
//
// Function: HrRegSetSz, HrRegSetString
//
// Purpose: Sets a string in the registry. Assures that its type and
// size are correct. Easier to read than HrRegSetValueEx
// with 5 parameters. Type safe (no LPBYTE stuff).
//
// Arguments:
// hkey [in] The registry key.
// pszValueName [in] The name of the value to set.
// pszValue, str [in] The string to set.
//
// Returns: S_OK or an HRESULT_FROM_WIN32 error code.
//
// Author: shaunco 1 Apr 1997
//
// Notes:
//
inline HRESULT HrRegSetSz (HKEY hkey, PCWSTR pszValueName, PCWSTR pszValue)
{
return HrRegSetValueEx (hkey, pszValueName, REG_SZ,
(LPBYTE)pszValue,
CbOfSzAndTermSafe (pszValue));
}
inline HRESULT HrRegSetString (HKEY hkey, PCWSTR pszValueName, const tstring& str)
{
return HrRegSetSz (hkey, pszValueName, str.c_str());
}
//+---------------------------------------------------------------------------
//
// Function: HrRegSetBinary
//
// Purpose: Sets a binary value into the registry. Assures the type is
// correct.
//
// Arguments:
// hkey [in] The registry key.
// pszValueName [in] The name of the value to set.
// pbData [in] Buffer containing binary data to write.
// cbData [in] Size of buffer in bytes.
//
// Returns: S_OK or an HRESULT_FROM_WIN32 error code.
//
// Author: danielwe 16 Apr 1997
//
// Notes:
//
inline HRESULT HrRegSetBinary(HKEY hkey, PCWSTR pszValueName,
const BYTE *pbData, DWORD cbData)
{
return HrRegSetValueEx(hkey, pszValueName, REG_BINARY,
pbData, cbData);
}
//+---------------------------------------------------------------------------
//
// Function: HrRegSetSzAsUlong
//
// Purpose: Writes the given ulong to the given registry value as a
// REG_SZ.
//
// Arguments:
// hkey [in] See Win32 docs.
// pszValueName [in] See Win32 docs.
// ulValue [in] The value to write as a string
// nBase [in] The radix to convert the ulong from
//
// Returns: S_OK or an HRESULT_FROM_WIN32 error code.
//
// Author: billbe 14 Jun 1997
//
// Notes:
//
inline
HRESULT
HrRegSetSzAsUlong (
IN HKEY hkey,
IN PCWSTR pszValueName,
IN ULONG ulValue,
IN int nBase)
{
WCHAR szBuffer[20];
// convert the value to a string using the specified base
_ultow(ulValue, szBuffer, nBase);
return HrRegSetSz(hkey, pszValueName, szBuffer);
}
//
// Data structures
//
const HKEY HKLM_SVCS = (HKEY)(INT_PTR)(int)(0x80000007);
const DWORD REG_MIN = REG_QWORD;
const DWORD REG_CREATE = (REG_MIN + 1);
const DWORD REG_BOOL = (REG_MIN + 2);
const DWORD REG_IP = (REG_MIN + 3);
const DWORD REG_FILE = (REG_MIN + 4);
const DWORD REG_HEX = (REG_MIN + 5);
struct VALUETABLE
{
// Name of value key
PCWSTR pszValueName;
// Data and offset location
DWORD dwType;
INT cbOffset;
// Default values
BYTE* pbDefault;
};
struct REGBATCH
{
// Location of the registry entry
HKEY hkey;
PCWSTR pszSubkey;
PCWSTR pszValueName;
// Data and offset location
DWORD dwType;
INT cbOffset;
// Default values
BYTE* pbDefault;
};
VOID
RegReadValues (
IN INT crvc,
IN const REGBATCH* arb,
OUT const BYTE* pbUserData,
IN REGSAM samDesired);
HRESULT
HrRegWriteValues (
IN INT crvc,
IN const REGBATCH* arb,
IN const BYTE* pbUserData,
IN DWORD dwOptions,
IN REGSAM samDesired);
HRESULT
HrRegWriteValueTable(
IN HKEY hkeyRoot,
IN INT cvt,
IN const VALUETABLE* avt,
IN const BYTE* pbUserData,
IN DWORD dwOptions,
IN REGSAM samDesired);
VOID
RegSafeCloseKey (
IN HKEY hkey);
#endif // _NCREG_H_