94 lines
2.0 KiB
C
94 lines
2.0 KiB
C
#include "stdafx.h"
|
|
#include "Registry.h"
|
|
#include "VersionInfo.h"
|
|
#include <malloc.h>
|
|
|
|
static ALWAYS_INLINE REGSAM GetWow64Flag(REGSAM options) {
|
|
#ifdef _WIN64
|
|
return options;
|
|
#else
|
|
if (AtLeastWinXP2002()) {
|
|
return options;
|
|
}
|
|
|
|
// Filter out WOW64 keys, which are not supported on Windows 2000
|
|
return options & ~(KEY_WOW64_64KEY | KEY_WOW64_32KEY);
|
|
#endif
|
|
}
|
|
|
|
HRESULT GetRegistryString(HKEY key, LPCWSTR subkeyPath, LPCWSTR valueName, REGSAM options, LPWSTR *data, LPDWORD size) {
|
|
HKEY subkey;
|
|
HRESULT hr = HRESULT_FROM_WIN32(RegOpenKeyEx(key, subkeyPath, 0, GetWow64Flag(KEY_READ | options), &subkey));
|
|
if (!SUCCEEDED(hr)) {
|
|
goto end;
|
|
}
|
|
|
|
if (data) {
|
|
DWORD length = 512 * sizeof(WCHAR);
|
|
LPWSTR buffer = (LPWSTR)LocalAlloc(LPTR, length);
|
|
if (!buffer) {
|
|
hr = E_OUTOFMEMORY;
|
|
goto end;
|
|
}
|
|
|
|
LSTATUS status;
|
|
do {
|
|
status = RegQueryValueEx(subkey, valueName, NULL, NULL, (BYTE *)buffer, &length);
|
|
if (status == ERROR_MORE_DATA) {
|
|
length += 256 * sizeof(WCHAR);
|
|
LPWSTR newBuffer = (LPWSTR)LocalReAlloc(buffer, length, LMEM_MOVEABLE);
|
|
if (!newBuffer) {
|
|
LocalFree(buffer);
|
|
hr = E_OUTOFMEMORY;
|
|
goto end;
|
|
}
|
|
|
|
buffer = newBuffer;
|
|
} else if (status != ERROR_SUCCESS) {
|
|
hr = HRESULT_FROM_WIN32(status);
|
|
LocalFree(buffer);
|
|
goto end;
|
|
}
|
|
} while (status == ERROR_MORE_DATA);
|
|
|
|
*data = buffer;
|
|
|
|
if (size) {
|
|
*size = length / sizeof(WCHAR);
|
|
}
|
|
}
|
|
|
|
end:
|
|
if (subkey) {
|
|
RegCloseKey(subkey);
|
|
}
|
|
if (!SUCCEEDED(hr)) {
|
|
if (data) {
|
|
*data = NULL;
|
|
}
|
|
if (size) {
|
|
*size = 0;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
HRESULT GetRegistryDword(HKEY key, LPCWSTR subkeyPath, LPCWSTR valueName, REGSAM options, LPDWORD data) {
|
|
HKEY subkey;
|
|
HRESULT hr = HRESULT_FROM_WIN32(RegOpenKeyEx(key, subkeyPath, 0, GetWow64Flag(KEY_READ | options), &subkey));
|
|
if (!SUCCEEDED(hr)) {
|
|
goto end;
|
|
}
|
|
|
|
if (data) {
|
|
DWORD length = sizeof(DWORD);
|
|
hr = HRESULT_FROM_WIN32(RegQueryValueEx(subkey, valueName, NULL, NULL, (LPBYTE)data, &length));
|
|
}
|
|
|
|
end:
|
|
if (subkey) {
|
|
RegCloseKey(subkey);
|
|
}
|
|
return hr;
|
|
}
|