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.
 
 
 
 
 
 

184 lines
4.6 KiB

#include <windows.h>
#include "debug.h"
#include "reg.h"
extern "C" HANDLE hHeap;
//------------------------------------------------------------------------------
//
//
// Registry helpers
//
//
//------------------------------------------------------------------------------
LONG RegQueryBinaryValue(IN HKEY hkey, IN PCTSTR pValueName, OUT PBYTE *ppValue, OUT ULONG *pcbValue)
{
LONG result;
DWORD typeValue;
DWORD cbValue = 0;
BOOL f;
result = RegQueryValueEx(hkey, pValueName, 0, &typeValue, NULL, &cbValue);
if (ERROR_SUCCESS == result)
{
if (REG_BINARY == typeValue)
{
PBYTE pValue;
pValue = (PBYTE)HeapAlloc(hHeap, 0, cbValue);
if (pValue)
{
result = RegQueryValueEx(hkey, pValueName, 0, &typeValue, (PBYTE)pValue, &cbValue);
if (ERROR_SUCCESS == result)
{
if (REG_BINARY == typeValue)
{
*ppValue = pValue;
*pcbValue = cbValue;
} else {
result = ERROR_FILE_NOT_FOUND;
f = HeapFree(hHeap, 0, pValue);
ASSERT(f);
}
} else {
f = HeapFree(hHeap, 0, pValue);
ASSERT(f);
}
} else {
result = ERROR_OUTOFMEMORY;
}
} else {
result = ERROR_FILE_NOT_FOUND;
}
}
return result;
}
LONG RegQuerySzValue(HKEY hkey, PCTSTR pValueName, PTSTR *ppstrValue)
{
LONG result;
DWORD typeValue;
DWORD cbstrValue = 0;
BOOL f;
result = RegQueryValueEx(hkey, pValueName, 0, &typeValue, NULL, &cbstrValue);
if (ERROR_SUCCESS == result)
{
if (REG_SZ == typeValue)
{
PTSTR pstrValue;
pstrValue = (PTSTR)HeapAlloc(hHeap, 0, cbstrValue);
if (pstrValue)
{
result = RegQueryValueEx(hkey, pValueName, 0, &typeValue, (PBYTE)pstrValue, &cbstrValue);
if (ERROR_SUCCESS == result)
{
if (REG_SZ == typeValue)
{
*ppstrValue = pstrValue;
} else {
result = ERROR_FILE_NOT_FOUND;
f = HeapFree(hHeap, 0, pstrValue);
ASSERT(f);
}
} else {
f = HeapFree(hHeap, 0, pstrValue);
ASSERT(f);
}
} else {
result = ERROR_OUTOFMEMORY;
}
} else {
result = ERROR_FILE_NOT_FOUND;
}
}
return result;
}
LONG RegQueryMultiSzValue(HKEY hkey, PCTSTR pValueName, PTSTR *ppstrValue)
{
LONG result;
DWORD typeValue;
DWORD cbstrValue = 0;
BOOL f;
result = RegQueryValueEx(hkey, pValueName, 0, &typeValue, NULL, &cbstrValue);
if (ERROR_SUCCESS == result)
{
if (REG_MULTI_SZ == typeValue)
{
PTSTR pstrValue;
pstrValue = (PTSTR)HeapAlloc(hHeap, 0, cbstrValue);
if (pstrValue)
{
result = RegQueryValueEx(hkey, pValueName, 0, &typeValue, (PBYTE)pstrValue, &cbstrValue);
if (ERROR_SUCCESS == result)
{
if (REG_MULTI_SZ == typeValue)
{
*ppstrValue = pstrValue;
} else {
result = ERROR_FILE_NOT_FOUND;
f = HeapFree(hHeap, 0, pstrValue);
ASSERT(f);
}
} else {
f = HeapFree(hHeap, 0, pstrValue);
ASSERT(f);
}
} else {
result = ERROR_OUTOFMEMORY;
}
} else {
result = ERROR_FILE_NOT_FOUND;
}
}
return result;
}
LONG RegQueryDwordValue(HKEY hkey, PCTSTR pValueName, PDWORD pdwValue)
{
DWORD cbdwValue;
LONG result;
cbdwValue = sizeof(*pdwValue);
result = RegQueryValueEx(hkey, pValueName, 0, NULL, (PBYTE)pdwValue, &cbdwValue);
return result;
}
LONG RegSetSzValue(HKEY hkey, PCTSTR pValueName, PCTSTR pstrValue)
{
DWORD cbstrValue = (lstrlen(pstrValue) + 1) * sizeof(pstrValue[0]);
return RegSetValueEx(hkey, pValueName, 0, REG_SZ, (PBYTE)pstrValue, cbstrValue);
}
LONG RegSetMultiSzValue(HKEY hkey, PCTSTR pValueName, PCTSTR pstrValue)
{
PCTSTR pstr;
DWORD cch;
DWORD cchValue;
DWORD cbValue;
pstr = pstrValue;
cchValue = 0;
do {
cch = lstrlen(pstr);
cchValue += cch+1;
pstr += cch+1;
} while (cch > 0);
cbValue = cchValue * sizeof(TCHAR);
return RegSetValueEx(hkey, pValueName, 0, REG_MULTI_SZ, (PBYTE)pstrValue, cbValue);
}
LONG RegSetBinaryValue(IN HKEY hkey, IN PCTSTR pValueName, IN PBYTE pValue, IN ULONG cbValue)
{
return RegSetValueEx(hkey, pValueName, 0, REG_BINARY, (PBYTE)pValue, cbValue);
}
LONG RegSetDwordValue(HKEY hkey, PCTSTR pValueName, DWORD dwValue)
{
return RegSetValueEx(hkey, pValueName, 0, REG_DWORD, (PBYTE)&dwValue, sizeof(dwValue));
}