Serge Gautherie : kernelbase: Handle RegGetValue() RRF_SUBKEY_WOW64??KEY flags.
Alexandre Julliard
julliard at winehq.org
Fri Mar 27 16:14:38 CDT 2020
Module: wine
Branch: master
Commit: 7c0ba9007a6a54c8429745a81038678bdfc2ff13
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7c0ba9007a6a54c8429745a81038678bdfc2ff13
Author: Serge Gautherie <winehq-git_serge_180711 at gautherie.fr>
Date: Sat Mar 21 16:21:29 2020 +0100
kernelbase: Handle RegGetValue() RRF_SUBKEY_WOW64??KEY flags.
Signed-off-by: Serge Gautherie <winehq-git_serge_180711 at gautherie.fr>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernelbase/registry.c | 22 ++++++++++++++++++++--
include/winreg.h | 3 +++
2 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/dlls/kernelbase/registry.c b/dlls/kernelbase/registry.c
index f8afb94f8d..d1588d0b26 100644
--- a/dlls/kernelbase/registry.c
+++ b/dlls/kernelbase/registry.c
@@ -1699,13 +1699,22 @@ LSTATUS WINAPI RegGetValueW( HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue,
if (pvData && !pcbData)
return ERROR_INVALID_PARAMETER;
+
if ((dwFlags & RRF_RT_REG_EXPAND_SZ) && !(dwFlags & RRF_NOEXPAND) &&
((dwFlags & RRF_RT_ANY) != RRF_RT_ANY))
return ERROR_INVALID_PARAMETER;
+ if ((dwFlags & RRF_WOW64_MASK) == RRF_WOW64_MASK)
+ return ERROR_INVALID_PARAMETER;
+
if (pszSubKey && pszSubKey[0])
{
- ret = RegOpenKeyExW(hKey, pszSubKey, 0, KEY_QUERY_VALUE, &hKey);
+ REGSAM samDesired = KEY_QUERY_VALUE;
+
+ if (dwFlags & RRF_WOW64_MASK)
+ samDesired |= (dwFlags & RRF_SUBKEY_WOW6432KEY) ? KEY_WOW64_32KEY : KEY_WOW64_64KEY;
+
+ ret = RegOpenKeyExW(hKey, pszSubKey, 0, samDesired, &hKey);
if (ret != ERROR_SUCCESS) return ret;
}
@@ -1795,13 +1804,22 @@ LSTATUS WINAPI RegGetValueA( HKEY hKey, LPCSTR pszSubKey, LPCSTR pszValue,
if (pvData && !pcbData)
return ERROR_INVALID_PARAMETER;
+
if ((dwFlags & RRF_RT_REG_EXPAND_SZ) && !(dwFlags & RRF_NOEXPAND) &&
((dwFlags & RRF_RT_ANY) != RRF_RT_ANY))
return ERROR_INVALID_PARAMETER;
+ if ((dwFlags & RRF_WOW64_MASK) == RRF_WOW64_MASK)
+ return ERROR_INVALID_PARAMETER;
+
if (pszSubKey && pszSubKey[0])
{
- ret = RegOpenKeyExA(hKey, pszSubKey, 0, KEY_QUERY_VALUE, &hKey);
+ REGSAM samDesired = KEY_QUERY_VALUE;
+
+ if (dwFlags & RRF_WOW64_MASK)
+ samDesired |= (dwFlags & RRF_SUBKEY_WOW6432KEY) ? KEY_WOW64_32KEY : KEY_WOW64_64KEY;
+
+ ret = RegOpenKeyExA(hKey, pszSubKey, 0, samDesired, &hKey);
if (ret != ERROR_SUCCESS) return ret;
}
diff --git a/include/winreg.h b/include/winreg.h
index c00379150a..00bc8c02dc 100644
--- a/include/winreg.h
+++ b/include/winreg.h
@@ -81,6 +81,9 @@ typedef LONG LSTATUS;
#define RRF_RT_DWORD (RRF_RT_REG_BINARY | RRF_RT_REG_DWORD)
#define RRF_RT_QWORD (RRF_RT_REG_BINARY | RRF_RT_REG_QWORD)
#define RRF_RT_ANY 0xffff
+#define RRF_SUBKEY_WOW6464KEY (1 << 16)
+#define RRF_SUBKEY_WOW6432KEY (1 << 17)
+#define RRF_WOW64_MASK (RRF_SUBKEY_WOW6432KEY | RRF_SUBKEY_WOW6464KEY)
#define RRF_NOEXPAND (1 << 28)
#define RRF_ZEROONFAILURE (1 << 29)
More information about the wine-cvs
mailing list