Test
This commit is contained in:
93
shared/Registry.c
Normal file
93
shared/Registry.c
Normal file
@@ -0,0 +1,93 @@
|
||||
#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;
|
||||
}
|
Reference in New Issue
Block a user