Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

290 lines
9.1 KiB

//+---------------------------------------------------------------------------
//
// 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;
}