mirror of
https://github.com/reactos/reactos.git
synced 2024-11-25 12:33:34 +08:00
210 lines
5.8 KiB
C
210 lines
5.8 KiB
C
#include "precomp.h"
|
|
#include "utils.h"
|
|
#include "regutils.h"
|
|
|
|
LRESULT
|
|
RegQueryRegistryKeys(IN HKEY hRootKey,
|
|
IN LPCWSTR KeyName,
|
|
IN PQUERY_REGISTRY_KEYS_TABLE QueryTable,
|
|
IN PVOID Context)
|
|
{
|
|
HKEY hSubKey = NULL;
|
|
|
|
if (RegOpenKeyExW(hRootKey, KeyName, 0, KEY_ENUMERATE_SUB_KEYS, &hSubKey) == ERROR_SUCCESS)
|
|
{
|
|
HKEY hEntryKey = NULL;
|
|
|
|
LRESULT lError = ERROR_SUCCESS;
|
|
DWORD dwIndex = 0;
|
|
WCHAR szValueName[MAX_VALUE_NAME] = L"";
|
|
DWORD dwValueLength = ARRAYSIZE(szValueName);
|
|
|
|
while ( (lError = RegEnumKeyExW(hSubKey, dwIndex, szValueName, &dwValueLength, NULL, NULL, NULL, NULL)) != ERROR_NO_MORE_ITEMS )
|
|
{
|
|
if ( (lError == ERROR_SUCCESS) && (RegOpenKeyExW(hSubKey, szValueName, 0, KEY_QUERY_VALUE, &hEntryKey) == ERROR_SUCCESS) )
|
|
{
|
|
PQUERY_REGISTRY_KEYS_TABLE pTable = QueryTable;
|
|
while (pTable && pTable->QueryRoutine)
|
|
{
|
|
pTable->QueryRoutine(hRootKey, KeyName, szValueName, hEntryKey, Context, pTable->EntryContext);
|
|
++pTable;
|
|
}
|
|
|
|
RegCloseKey(hEntryKey);
|
|
}
|
|
|
|
++dwIndex;
|
|
dwValueLength = ARRAYSIZE(szValueName);
|
|
szValueName[0] = L'\0';
|
|
}
|
|
|
|
RegCloseKey(hSubKey);
|
|
}
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
//
|
|
// Idea taken from RtlQueryRegistryValues (see DDK).
|
|
//
|
|
LRESULT
|
|
RegQueryRegistryValues(IN HKEY hRootKey,
|
|
IN LPCWSTR KeyName,
|
|
IN PQUERY_REGISTRY_VALUES_TABLE QueryTable,
|
|
IN PVOID Context)
|
|
{
|
|
LRESULT res = ERROR_SUCCESS;
|
|
HKEY hSubKey = NULL;
|
|
|
|
if ( (res = RegOpenKeyExW(hRootKey, KeyName, 0, KEY_QUERY_VALUE, &hSubKey)) == ERROR_SUCCESS )
|
|
{
|
|
DWORD dwIndex = 0, dwType = 0;
|
|
WCHAR szValueName[MAX_VALUE_NAME] = L"";
|
|
LPBYTE lpData = NULL;
|
|
DWORD dwValueLength = ARRAYSIZE(szValueName), dwDataLength = 0;
|
|
|
|
while (RegEnumValueW(hSubKey, dwIndex, szValueName, &dwValueLength, NULL, &dwType, NULL, &dwDataLength) != ERROR_NO_MORE_ITEMS)
|
|
{
|
|
++dwValueLength;
|
|
lpData = (LPBYTE)MemAlloc(0, dwDataLength);
|
|
|
|
if (RegEnumValueW(hSubKey, dwIndex, szValueName, &dwValueLength, NULL, &dwType, lpData, &dwDataLength) == ERROR_SUCCESS)
|
|
{
|
|
PQUERY_REGISTRY_VALUES_TABLE pTable = QueryTable;
|
|
while (pTable && pTable->QueryRoutine)
|
|
{
|
|
pTable->QueryRoutine(hRootKey, KeyName, szValueName, dwType, lpData, dwDataLength, Context, pTable->EntryContext);
|
|
++pTable;
|
|
}
|
|
}
|
|
|
|
MemFree(lpData); lpData = NULL;
|
|
|
|
++dwIndex;
|
|
dwValueLength = ARRAYSIZE(szValueName), dwDataLength = 0;
|
|
szValueName[0] = L'\0';
|
|
}
|
|
|
|
RegCloseKey(hSubKey);
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
LONG
|
|
RegGetDWORDValue(IN HKEY hKey,
|
|
IN LPCWSTR lpSubKey OPTIONAL,
|
|
IN LPCWSTR lpValue OPTIONAL,
|
|
OUT LPDWORD lpData OPTIONAL)
|
|
{
|
|
LONG lRet = ERROR_SUCCESS;
|
|
HKEY hEntryKey = NULL;
|
|
|
|
//
|
|
// Open the sub-key, if any. Otherwise,
|
|
// use the given registry key handle.
|
|
//
|
|
if (lpSubKey)
|
|
{
|
|
lRet = RegOpenKeyExW(hKey, lpSubKey, 0, KEY_QUERY_VALUE, &hEntryKey);
|
|
}
|
|
else
|
|
{
|
|
if (hKey != INVALID_HANDLE_VALUE)
|
|
{
|
|
// TODO: Ensure that hKey has the KEY_QUERY_VALUE right.
|
|
hEntryKey = hKey;
|
|
lRet = ERROR_SUCCESS;
|
|
}
|
|
else
|
|
{
|
|
lRet = ERROR_INVALID_HANDLE;
|
|
}
|
|
}
|
|
|
|
if (lRet == ERROR_SUCCESS)
|
|
{
|
|
DWORD dwType = 0,
|
|
dwRegData = 0,
|
|
dwBufSize = sizeof(dwRegData /* DWORD */);
|
|
|
|
lRet = RegQueryValueExW(hEntryKey, lpValue, NULL, &dwType, (LPBYTE)&dwRegData, &dwBufSize);
|
|
|
|
if (lRet == ERROR_SUCCESS)
|
|
{
|
|
if ( (dwType == REG_DWORD) && (dwBufSize == sizeof(DWORD)) )
|
|
{
|
|
if (lpData)
|
|
*lpData = dwRegData;
|
|
}
|
|
else
|
|
{
|
|
lRet = ERROR_UNSUPPORTED_TYPE;
|
|
}
|
|
}
|
|
else if (lRet == ERROR_MORE_DATA)
|
|
{
|
|
if (dwType != REG_DWORD)
|
|
{
|
|
lRet = ERROR_UNSUPPORTED_TYPE;
|
|
}
|
|
}
|
|
|
|
// Close the opened sub-key.
|
|
if (lpSubKey)
|
|
RegCloseKey(hEntryKey);
|
|
}
|
|
|
|
return lRet;
|
|
}
|
|
|
|
LONG
|
|
RegSetDWORDValue(IN HKEY hKey,
|
|
IN LPCWSTR lpSubKey OPTIONAL,
|
|
IN LPCWSTR lpValue OPTIONAL,
|
|
IN BOOL bCreateKeyIfDoesntExist,
|
|
IN DWORD dwData)
|
|
{
|
|
LONG lRet = ERROR_SUCCESS;
|
|
HKEY hEntryKey = NULL;
|
|
|
|
//
|
|
// Open (or create) the sub-key, if any.
|
|
// Otherwise, use the given registry key handle.
|
|
//
|
|
if (lpSubKey)
|
|
{
|
|
if (bCreateKeyIfDoesntExist)
|
|
lRet = RegCreateKeyExW(hKey, lpSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hEntryKey, NULL);
|
|
else
|
|
lRet = RegOpenKeyExW(hKey, lpSubKey, 0, KEY_SET_VALUE, &hEntryKey);
|
|
}
|
|
else
|
|
{
|
|
if (hKey != INVALID_HANDLE_VALUE)
|
|
{
|
|
// TODO: Ensure that hKey has the KEY_QUERY_VALUE right.
|
|
hEntryKey = hKey;
|
|
lRet = ERROR_SUCCESS;
|
|
}
|
|
else
|
|
{
|
|
lRet = ERROR_INVALID_HANDLE;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Opening successful, can set the value now.
|
|
//
|
|
if (lRet == ERROR_SUCCESS)
|
|
{
|
|
lRet = RegSetValueExW(hEntryKey, lpValue, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(dwData /* DWORD */));
|
|
|
|
// Close the opened (or created) sub-key.
|
|
if (lpSubKey)
|
|
RegCloseKey(hEntryKey);
|
|
}
|
|
|
|
return lRet;
|
|
}
|