|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1998
//
// File: RegSettingsIO.cxx
//
// Contents: Register Settings IO functions
//
// Written by Lyle Corbin
//
//----------------------------------------------------------------------------
#include "headers.hxx"
#include "RegSettingsIO.h"
const WCHAR *g_szRegistry = L"Software\\Microsoft\\MTScript";
HRESULT RegSettingsIO(const WCHAR *szRegistry, BOOL fSave, const REGKEYINFORMATION *aKeyValues, int cKeyValues, BYTE *pBase) { LONG lRet; HKEY hKeyRoot = NULL; HKEY hKeySub = NULL; int i; DWORD dwType; DWORD dwSize; DWORD dwDisposition;
DWORD dwDataBuf[MAX_REG_VALUE_LENGTH]; BYTE * bDataBuf = (BYTE*) dwDataBuf;
BYTE * pbData; BOOL fWriteReg = fSave; WCHAR * pch;
const REGKEYINFORMATION * prki; lRet = RegCreateKeyEx(HKEY_CURRENT_USER, g_szRegistry, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKeyRoot, &dwDisposition);
if( lRet != ERROR_SUCCESS ) return S_FALSE;
if (dwDisposition == REG_CREATED_NEW_KEY) { //
// The key didn't exist. Write out the default values.
//
fWriteReg = TRUE; }
for (i = 0; i < cKeyValues; i++) { prki = &aKeyValues[i];
switch (prki->rkiType) { case RKI_KEY: if (!prki->pszName) { hKeySub = hKeyRoot; } else { if (hKeySub && (hKeySub != hKeyRoot)) { RegCloseKey(hKeySub); hKeySub = NULL;
fWriteReg = fSave; }
pch = prki->pszName;
lRet = RegCreateKeyEx(hKeyRoot, pch, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKeySub, &dwDisposition);
if (lRet != ERROR_SUCCESS) { // We couldn't get this key, skip it.
i++; while (i < cKeyValues && aKeyValues[i].rkiType != RKI_KEY) { i++; }
i--; // Account for the fact that continue will increment i again.
hKeySub = NULL; continue; } else if (dwDisposition == REG_CREATED_NEW_KEY) { //
// The key didn't exist. Write out the default values.
//
fWriteReg = TRUE; } } break;
case RKI_BOOL: Assert(hKeySub);
if (fWriteReg) { RegSetValueEx(hKeySub, prki->pszName, 0, REG_DWORD, (BYTE*)((BYTE *)pBase + prki->cbOffset), sizeof(BOOL)); } else { dwSize = MAX_REG_VALUE_LENGTH;
lRet = RegQueryValueEx(hKeySub, prki->pszName, 0, &dwType, bDataBuf, &dwSize);
if (lRet == ERROR_SUCCESS) { pbData = (BYTE*)((BYTE *)pBase + prki->cbOffset);
if (dwType == REG_DWORD) { *pbData = (*(DWORD*)bDataBuf != 0); } else if (dwType == REG_SZ) { TCHAR ch = *(TCHAR *)bDataBuf;
if (ch == _T('1') || ch == _T('y') || ch == _T('Y')) { *pbData = TRUE; } else { *pbData = FALSE; } } else if (dwType == REG_BINARY) { *pbData = (*(BYTE*)bDataBuf != 0); }
// Can't convert other types. Just leave it the default.
} } break;
case RKI_DWORD: Assert(hKeySub);
if (fWriteReg) { RegSetValueEx(hKeySub, prki->pszName, 0, REG_DWORD, (BYTE*)((BYTE *)pBase + prki->cbOffset), sizeof(DWORD)); } else { dwSize = sizeof(DWORD);
lRet = RegQueryValueEx(hKeySub, prki->pszName, 0, &dwType, bDataBuf, &dwSize);
if (lRet == ERROR_SUCCESS && (dwType == REG_BINARY || dwType == REG_DWORD)) { *(DWORD*)((BYTE *)pBase + prki->cbOffset) = *(DWORD*)bDataBuf; } } break;
case RKI_STRING: case RKI_EXPANDSZ: Assert(hKeySub);
{ CStr *pstr = ((CStr *)((BYTE *)pBase + prki->cbOffset));
if (fWriteReg) { //
// Only write it out if there is a value there. That way
// we get the default next time we load even if it may
// evaluate differently (e.g. location of this exe
// changes).
//
RegSetValueEx(hKeySub, prki->pszName, 0, (prki->rkiType == RKI_STRING) ? REG_SZ : REG_EXPAND_SZ, (BYTE*)((pstr->Length() > 0) ? (LPTSTR)*pstr : L""), (pstr->Length()+1) * sizeof(TCHAR)); } else { dwSize = 0;
// get the size of string
lRet = RegQueryValueEx(hKeySub, prki->pszName, 0, &dwType, NULL, &dwSize);
if (lRet == ERROR_SUCCESS && dwSize - sizeof(TCHAR) > 0) { // Set already adds 1 for a terminating NULL, and
// dwSize is including it as well.
pstr->Set(NULL, (dwSize / sizeof(TCHAR)) - 1);
lRet = RegQueryValueEx(hKeySub, prki->pszName, 0, &dwType, (BYTE*)(LPTSTR)*pstr, &dwSize);
if (lRet != ERROR_SUCCESS || (dwType != REG_SZ && dwType != REG_EXPAND_SZ)) { pstr->Free(); }
if (dwType == REG_EXPAND_SZ) { CStr cstrExpand;
dwSize = ExpandEnvironmentStrings(*pstr, NULL, 0);
// Set already adds 1 for a terminating NULL, and
// dwSize is including it as well.
cstrExpand.Set(NULL, dwSize - 1);
dwSize = ExpandEnvironmentStrings(*pstr, cstrExpand, dwSize + 1);
pstr->TakeOwnership(cstrExpand); }
pstr->TrimTrailingWhitespace(); } } }
break;
default: AssertSz(FALSE, "Unrecognized RKI Type"); break; } }
if (hKeySub && (hKeySub != hKeyRoot)) RegCloseKey(hKeySub);
RegCloseKey( hKeyRoot );
return S_OK; }
|