422 lines
9.6 KiB
C
422 lines
9.6 KiB
C
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// REGISTRY.C
|
||
|
//
|
||
|
// Microsoft Confidential
|
||
|
// Copyright (cMicrosoft Corporation 1998
|
||
|
// All rights reserved
|
||
|
//
|
||
|
// Registry functions for the application to easily interface with the
|
||
|
// registry.
|
||
|
//
|
||
|
// 4/98 - Jason Cohen (JCOHEN)
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
// Include files
|
||
|
//
|
||
|
#include <windows.h>
|
||
|
#include "jcohen.h"
|
||
|
#include "registry.h"
|
||
|
|
||
|
|
||
|
BOOL RegExists(HKEY hKeyReg, LPTSTR lpKey, LPTSTR lpValue)
|
||
|
{
|
||
|
HKEY hOpenKey = NULL;
|
||
|
BOOL bExists = FALSE;
|
||
|
|
||
|
if (lpKey)
|
||
|
{
|
||
|
if (RegOpenKeyEx(hKeyReg, lpKey, 0, KEY_ALL_ACCESS, &hOpenKey) != ERROR_SUCCESS)
|
||
|
return bExists;
|
||
|
}
|
||
|
else
|
||
|
hOpenKey = hKeyReg;
|
||
|
|
||
|
if (lpValue)
|
||
|
bExists = (RegQueryValueEx(hOpenKey, lpValue, NULL, NULL, NULL, NULL) == ERROR_SUCCESS);
|
||
|
else
|
||
|
bExists = TRUE;
|
||
|
|
||
|
if (lpKey)
|
||
|
RegCloseKey(hOpenKey);
|
||
|
|
||
|
return bExists;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL RegDelete(HKEY hRootKey, LPTSTR lpSubKey, LPTSTR lpValue) {
|
||
|
|
||
|
BOOL bSuccess = FALSE;
|
||
|
|
||
|
if (lpValue) {
|
||
|
|
||
|
if (lpSubKey) {
|
||
|
|
||
|
HKEY hRegKey;
|
||
|
|
||
|
if (RegOpenKeyEx(hRootKey, lpSubKey, 0, KEY_ALL_ACCESS, &hRegKey) == ERROR_SUCCESS) {
|
||
|
|
||
|
bSuccess = (RegDeleteValue(hRegKey, lpValue) == ERROR_SUCCESS);
|
||
|
RegCloseKey(hRegKey);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
bSuccess = (RegDeleteValue(hRootKey, lpValue) == ERROR_SUCCESS);
|
||
|
|
||
|
}
|
||
|
else
|
||
|
bSuccess = (RegDeleteKey(hRootKey, lpSubKey) == ERROR_SUCCESS);
|
||
|
|
||
|
return bSuccess;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
LPTSTR RegGetString(HKEY hKeyReg, LPTSTR lpKey, LPTSTR lpValue) {
|
||
|
|
||
|
HKEY hOpenKey = NULL;
|
||
|
LPTSTR lpBuffer = NULL,
|
||
|
lpExpand = NULL;
|
||
|
DWORD dwSize = 0,
|
||
|
dwType;
|
||
|
|
||
|
// If the key is specified, we must open it. Otherwise we can
|
||
|
// just use the HKEY passed in.
|
||
|
//
|
||
|
if (lpKey)
|
||
|
{
|
||
|
// If the open key fails, return NULL because the value can't exist.
|
||
|
//
|
||
|
if (RegOpenKeyEx(hKeyReg, lpKey, 0, KEY_ALL_ACCESS, &hOpenKey) != ERROR_SUCCESS)
|
||
|
return NULL;
|
||
|
}
|
||
|
else
|
||
|
hOpenKey = hKeyReg;
|
||
|
|
||
|
// Now query the value to get the size to allocate. Make sure the date
|
||
|
// type is a string and that the malloc doesn't fail.
|
||
|
//
|
||
|
if ( ( RegQueryValueEx(hOpenKey, lpValue, NULL, &dwType, NULL, &dwSize) == ERROR_SUCCESS ) &&
|
||
|
( ( dwType == REG_SZ ) || ( dwType == REG_EXPAND_SZ ) ) &&
|
||
|
( lpBuffer = (LPTSTR) MALLOC(dwSize) ) )
|
||
|
{
|
||
|
// We know the value exists and we have the memory we need to query the value again.
|
||
|
//
|
||
|
if ( ( RegQueryValueEx(hOpenKey, lpValue, NULL, NULL, (LPBYTE) lpBuffer, &dwSize) == ERROR_SUCCESS ) &&
|
||
|
( ( dwType == REG_SZ ) || ( dwType == REG_EXPAND_SZ ) ) )
|
||
|
{
|
||
|
// We should expand it if it is supposed to be.
|
||
|
//
|
||
|
if ( dwType == REG_EXPAND_SZ )
|
||
|
{
|
||
|
if ( ( dwSize = ExpandEnvironmentStrings(lpBuffer, NULL, 0) ) &&
|
||
|
( lpExpand = (LPTSTR) MALLOC(dwSize) ) &&
|
||
|
( ExpandEnvironmentStrings(lpBuffer, lpExpand, dwSize) ) &&
|
||
|
( *lpExpand ) )
|
||
|
{
|
||
|
// The expand workd, so free the original buffer and return
|
||
|
// the expanded one.
|
||
|
//
|
||
|
FREE(lpBuffer);
|
||
|
lpBuffer = lpExpand;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// The expand failed see we should free everything up
|
||
|
// and return NULL.
|
||
|
//
|
||
|
FREE(lpExpand);
|
||
|
FREE(lpBuffer);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
// For some reason the query failed, that shouldn't happen
|
||
|
// but now we need to free and return NULL.
|
||
|
//
|
||
|
FREE(lpBuffer);
|
||
|
}
|
||
|
|
||
|
// If we opened a key, we must close it.
|
||
|
//
|
||
|
if (lpKey)
|
||
|
RegCloseKey(hOpenKey);
|
||
|
|
||
|
// Return the buffer allocated, or NULL if something failed.
|
||
|
//
|
||
|
return lpBuffer;
|
||
|
}
|
||
|
|
||
|
|
||
|
LPVOID RegGetBin(HKEY hKeyReg, LPTSTR lpKey, LPTSTR lpValue) {
|
||
|
|
||
|
HKEY hOpenKey = NULL;
|
||
|
LPVOID lpBuffer = NULL;
|
||
|
DWORD dwSize = 0,
|
||
|
dwType;
|
||
|
|
||
|
// If the key is specified, we must open it. Otherwise we can
|
||
|
// just use the HKEY passed in.
|
||
|
//
|
||
|
if (lpKey)
|
||
|
{
|
||
|
// If the open key fails, return NULL because the value can't exist.
|
||
|
//
|
||
|
if (RegOpenKeyEx(hKeyReg, lpKey, 0, KEY_ALL_ACCESS, &hOpenKey) != ERROR_SUCCESS)
|
||
|
return NULL;
|
||
|
}
|
||
|
else
|
||
|
hOpenKey = hKeyReg;
|
||
|
|
||
|
// Now query the value to get the size to allocate. Make sure the date
|
||
|
// type is a string and that the malloc doesn't fail.
|
||
|
//
|
||
|
if ( ( RegQueryValueEx(hOpenKey, lpValue, NULL, &dwType, NULL, &dwSize) == ERROR_SUCCESS ) &&
|
||
|
( dwType == REG_BINARY ) &&
|
||
|
( lpBuffer = MALLOC(dwSize) ) )
|
||
|
{
|
||
|
// We know the value exists and we have the memory we need to query the value again.
|
||
|
//
|
||
|
if ( ( RegQueryValueEx(hOpenKey, lpValue, NULL, NULL, (LPBYTE) lpBuffer, &dwSize) != ERROR_SUCCESS ) ||
|
||
|
( dwType != REG_BINARY ) )
|
||
|
// For some reason the query failed, that shouldn't happen
|
||
|
// but now we need to free and return NULL.
|
||
|
//
|
||
|
FREE(lpBuffer);
|
||
|
}
|
||
|
|
||
|
// If we opened a key, we must close it.
|
||
|
//
|
||
|
if (lpKey)
|
||
|
RegCloseKey(hOpenKey);
|
||
|
|
||
|
// Return the buffer allocated, or NULL if something failed.
|
||
|
//
|
||
|
return lpBuffer;
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD RegGetDword(HKEY hKeyReg, LPTSTR lpKey, LPTSTR lpValue) {
|
||
|
|
||
|
HKEY hOpenKey = NULL;
|
||
|
DWORD dwBuffer,
|
||
|
dwSize = sizeof(DWORD),
|
||
|
dwType;
|
||
|
|
||
|
|
||
|
if (lpKey) {
|
||
|
|
||
|
if (RegOpenKeyEx(hKeyReg, lpKey, 0, KEY_ALL_ACCESS, &hOpenKey) != ERROR_SUCCESS)
|
||
|
return 0;
|
||
|
|
||
|
}
|
||
|
else
|
||
|
hOpenKey = hKeyReg;
|
||
|
|
||
|
if ( (RegQueryValueEx(hOpenKey, lpValue, NULL, &dwType, (LPBYTE) &dwBuffer, &dwSize) != ERROR_SUCCESS) ||
|
||
|
(dwSize != sizeof(DWORD)) )
|
||
|
|
||
|
dwBuffer = 0;
|
||
|
|
||
|
if (lpKey)
|
||
|
RegCloseKey(hOpenKey);
|
||
|
|
||
|
return dwBuffer;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL RegSetString(HKEY hRootKey, LPTSTR lpSubKey, LPTSTR lpValue, LPTSTR lpData) {
|
||
|
|
||
|
BOOL bSuccess = FALSE;
|
||
|
|
||
|
if (lpSubKey) {
|
||
|
|
||
|
HKEY hRegKey;
|
||
|
DWORD dwBuffer;
|
||
|
|
||
|
if (RegCreateKeyEx(hRootKey, lpSubKey, 0, TEXT(""), 0, KEY_ALL_ACCESS, NULL, &hRegKey, &dwBuffer) == ERROR_SUCCESS) {
|
||
|
|
||
|
bSuccess = (RegSetValueEx(hRegKey, lpValue, 0, REG_SZ, (CONST BYTE *) lpData, lstrlen(lpData) + 1) == ERROR_SUCCESS);
|
||
|
RegCloseKey(hRegKey);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
|
||
|
bSuccess = (RegSetValueEx(hRootKey, lpValue, 0, REG_SZ, (CONST BYTE *) lpData, lstrlen(lpData) + 1) == ERROR_SUCCESS);
|
||
|
|
||
|
return bSuccess;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL RegSetDword(HKEY hRootKey, LPTSTR lpSubKey, LPTSTR lpValue, DWORD dwData) {
|
||
|
|
||
|
BOOL bSuccess = FALSE;
|
||
|
|
||
|
if (lpSubKey) {
|
||
|
|
||
|
HKEY hRegKey;
|
||
|
DWORD dwBuffer;
|
||
|
|
||
|
if (RegCreateKeyEx(hRootKey, lpSubKey, 0, TEXT(""), 0, KEY_ALL_ACCESS, NULL, &hRegKey, &dwBuffer) == ERROR_SUCCESS) {
|
||
|
|
||
|
bSuccess = (RegSetValueEx(hRegKey, lpValue, 0, REG_DWORD, (CONST BYTE *) &dwData, sizeof(dwData)) == ERROR_SUCCESS);
|
||
|
RegCloseKey(hRegKey);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
|
||
|
bSuccess = (RegSetValueEx(hRootKey, lpValue, 0, REG_SZ, (CONST BYTE *) &dwData, sizeof(dwData)) == ERROR_SUCCESS);
|
||
|
|
||
|
return bSuccess;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL RegCheck(HKEY hKeyRoot, LPTSTR lpKey, LPTSTR lpValue)
|
||
|
{
|
||
|
LPTSTR lpBuffer;
|
||
|
DWORD dwSize = 0,
|
||
|
dwType,
|
||
|
dwBuffer = 0;
|
||
|
HKEY hKeyReg;
|
||
|
BOOL bReturn = FALSE;
|
||
|
|
||
|
if (lpKey)
|
||
|
{
|
||
|
if (RegOpenKeyEx(hKeyRoot, lpKey, 0, KEY_ALL_ACCESS, &hKeyReg) != ERROR_SUCCESS)
|
||
|
return 0;
|
||
|
}
|
||
|
else
|
||
|
hKeyReg = hKeyRoot;
|
||
|
|
||
|
// Query for the value and allocate the memory for the
|
||
|
// value data if it is type REG_SZ.
|
||
|
//
|
||
|
if (RegQueryValueEx(hKeyReg, lpValue, NULL, &dwType, NULL, &dwSize) == ERROR_SUCCESS)
|
||
|
{
|
||
|
if (dwType == REG_SZ)
|
||
|
{
|
||
|
// It is a string value, must allocate a buffer for the string.
|
||
|
//
|
||
|
if (lpBuffer = (LPTSTR) MALLOC(dwSize))
|
||
|
{
|
||
|
if ( (RegQueryValueEx(hKeyReg, lpValue, NULL, NULL, (LPBYTE) lpBuffer, &dwSize) == ERROR_SUCCESS) &&
|
||
|
(*lpBuffer != '0') && (*lpBuffer) )
|
||
|
{
|
||
|
dwBuffer = 1;
|
||
|
}
|
||
|
FREE(lpBuffer);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Must be a DWORD or BIN value.
|
||
|
//
|
||
|
RegQueryValueEx(hKeyReg, lpValue, NULL, &dwType, (LPBYTE) &dwBuffer, &dwSize);
|
||
|
}
|
||
|
|
||
|
bReturn = (dwBuffer != 0);
|
||
|
}
|
||
|
|
||
|
if (lpKey)
|
||
|
RegCloseKey(hKeyReg);
|
||
|
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL RegEnumKeys(HKEY hKey, LPTSTR lpRegKey, REGENUMKEYPROC hCallBack, LPARAM lParam, BOOL bDelKeys)
|
||
|
{
|
||
|
TCHAR szKeyName[MAX_PATH + 1];
|
||
|
DWORD dwIndex = 0,
|
||
|
dwSize = sizeof(szKeyName);
|
||
|
HKEY hKeyReg,
|
||
|
hKeyEnum;
|
||
|
BOOL bReturn = TRUE;
|
||
|
|
||
|
// Open a key handle to the key to enumerate.
|
||
|
//
|
||
|
if ( ( lpRegKey == NULL ) ||
|
||
|
( RegOpenKeyEx(hKey, lpRegKey, 0, KEY_ALL_ACCESS, &hKeyReg) == ERROR_SUCCESS ) )
|
||
|
{
|
||
|
// Enumerate all the subkeys in this key.
|
||
|
//
|
||
|
while ( bReturn && ( RegEnumKeyEx(hKeyReg, dwIndex, szKeyName, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS ) )
|
||
|
{
|
||
|
if ( RegOpenKeyEx(hKeyReg, szKeyName, 0, KEY_ALL_ACCESS, &hKeyEnum) == ERROR_SUCCESS )
|
||
|
{
|
||
|
bReturn = hCallBack(hKeyEnum, szKeyName, lParam);
|
||
|
RegCloseKey(hKeyEnum);
|
||
|
}
|
||
|
if ( !bDelKeys || ( RegDeleteKey(hKeyReg, szKeyName) != ERROR_SUCCESS ) )
|
||
|
dwIndex++;
|
||
|
dwSize = sizeof(szKeyName);
|
||
|
}
|
||
|
if (lpRegKey)
|
||
|
RegCloseKey(hKeyReg);
|
||
|
}
|
||
|
else
|
||
|
bReturn = FALSE;
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL RegEnumValues(HKEY hKey, LPTSTR lpRegKey, REGENUMVALPROC hCallBack, LPARAM lParam, BOOL bDelValues) {
|
||
|
|
||
|
TCHAR szValueName[MAX_PATH + 1];
|
||
|
LPTSTR lpBuffer;
|
||
|
DWORD dwIndex = 0,
|
||
|
dwSize = sizeof(szValueName),
|
||
|
dwDataSize = 0,
|
||
|
dwType;
|
||
|
HKEY hKeyReg;
|
||
|
BOOL bReturn = TRUE;
|
||
|
|
||
|
|
||
|
// Open a key handle to the key to enumerate.
|
||
|
//
|
||
|
if ( (lpRegKey == NULL) ||
|
||
|
(RegOpenKeyEx(hKey, lpRegKey, 0, KEY_ALL_ACCESS, &hKeyReg) == ERROR_SUCCESS) ) {
|
||
|
|
||
|
// Enumerate all the values in this key.
|
||
|
//
|
||
|
while (bReturn && (RegEnumValue(hKeyReg, dwIndex, szValueName, &dwSize, NULL, &dwType, NULL, &dwDataSize) == ERROR_SUCCESS)) {
|
||
|
|
||
|
if ((dwType == REG_SZ) &&
|
||
|
(lpBuffer = (LPTSTR) MALLOC(dwDataSize))) {
|
||
|
|
||
|
if (RegQueryValueEx(hKeyReg, szValueName, NULL, NULL, (LPBYTE) lpBuffer, &dwDataSize) == ERROR_SUCCESS)
|
||
|
bReturn = hCallBack(szValueName, lpBuffer, lParam);
|
||
|
|
||
|
FREE(lpBuffer);
|
||
|
|
||
|
}
|
||
|
|
||
|
if ( !bDelValues || (RegDeleteValue(hKeyReg, szValueName) != ERROR_SUCCESS) )
|
||
|
dwIndex++;
|
||
|
|
||
|
dwSize = sizeof(szValueName);
|
||
|
dwDataSize = 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
if (lpRegKey)
|
||
|
RegCloseKey(hKeyReg);
|
||
|
|
||
|
}
|
||
|
else
|
||
|
bReturn = FALSE;
|
||
|
|
||
|
return bReturn;
|
||
|
}
|