#include #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)); }