Jacek Caban : winemac: Directly use ntdll in setup_options.
Alexandre Julliard
julliard at winehq.org
Tue May 17 15:37:22 CDT 2022
Module: wine
Branch: master
Commit: 718db04398ac7247a946467b0e17284a33436da0
URL: https://source.winehq.org/git/wine.git/?a=commit;h=718db04398ac7247a946467b0e17284a33436da0
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri May 13 14:23:14 2022 +0200
winemac: Directly use ntdll in setup_options.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winemac.drv/macdrv.h | 17 ++++++
dlls/winemac.drv/macdrv_main.c | 127 +++++++++++++++++++++++++++++++++++------
2 files changed, 125 insertions(+), 19 deletions(-)
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
index d13a2277e61..bded3500bee 100644
--- a/dlls/winemac.drv/macdrv.h
+++ b/dlls/winemac.drv/macdrv.h
@@ -293,4 +293,21 @@ extern void macdrv_im_set_text(const macdrv_event *event) DECLSPEC_HIDDEN;
extern void macdrv_sent_text_input(const macdrv_event *event) DECLSPEC_HIDDEN;
extern BOOL query_ime_char_rect(macdrv_query* query) DECLSPEC_HIDDEN;
+/* string helpers */
+
+static inline void ascii_to_unicode(WCHAR *dst, const char *src, size_t len)
+{
+ while (len--) *dst++ = (unsigned char)*src++;
+}
+
+static inline UINT asciiz_to_unicode(WCHAR *dst, const char *src)
+{
+ WCHAR *p = dst;
+ while ((*p++ = *src++));
+ return (p - dst) * sizeof(WCHAR);
+}
+
+/* FIXME: remove once we use unixlib */
+#define wcsrchr strrchrW
+
#endif /* __WINE_MACDRV_H */
diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c
index fff72589417..fccd588c271 100644
--- a/dlls/winemac.drv/macdrv_main.c
+++ b/dlls/winemac.drv/macdrv_main.c
@@ -28,6 +28,7 @@
#include "winuser.h"
#include "winreg.h"
#include "wine/server.h"
+#include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(macdrv);
@@ -102,16 +103,97 @@ const char* debugstr_cf(CFTypeRef t)
}
+static HKEY reg_open_key(HKEY root, const WCHAR *name, ULONG name_len)
+{
+ UNICODE_STRING nameW = { name_len, name_len, (WCHAR *)name };
+ OBJECT_ATTRIBUTES attr;
+ HANDLE ret;
+
+ attr.Length = sizeof(attr);
+ attr.RootDirectory = root;
+ attr.ObjectName = &nameW;
+ attr.Attributes = 0;
+ attr.SecurityDescriptor = NULL;
+ attr.SecurityQualityOfService = NULL;
+
+ return NtOpenKeyEx(&ret, MAXIMUM_ALLOWED, &attr, 0) ? 0 : ret;
+}
+
+
+static HKEY open_hkcu_key(const char *name)
+{
+ WCHAR bufferW[256];
+ static HKEY hkcu;
+
+ if (!hkcu)
+ {
+ char buffer[256];
+ DWORD_PTR sid_data[(sizeof(TOKEN_USER) + SECURITY_MAX_SID_SIZE) / sizeof(DWORD_PTR)];
+ DWORD i, len = sizeof(sid_data);
+ SID *sid;
+
+ if (NtQueryInformationToken(GetCurrentThreadEffectiveToken(), TokenUser, sid_data, len, &len))
+ return 0;
+
+ sid = ((TOKEN_USER *)sid_data)->User.Sid;
+ len = sprintf(buffer, "\\Registry\\User\\S-%u-%u", sid->Revision,
+ MAKELONG(MAKEWORD(sid->IdentifierAuthority.Value[5],
+ sid->IdentifierAuthority.Value[4]),
+ MAKEWORD(sid->IdentifierAuthority.Value[3],
+ sid->IdentifierAuthority.Value[2])));
+ for (i = 0; i < sid->SubAuthorityCount; i++)
+ len += sprintf(buffer + len, "-%u", sid->SubAuthority[i]);
+
+ ascii_to_unicode(bufferW, buffer, len);
+ hkcu = reg_open_key(NULL, bufferW, len * sizeof(WCHAR));
+ }
+
+ return reg_open_key(hkcu, bufferW, asciiz_to_unicode(bufferW, name) - sizeof(WCHAR));
+}
+
+
+static ULONG query_reg_value(HKEY hkey, const WCHAR *name, KEY_VALUE_PARTIAL_INFORMATION *info, ULONG size)
+{
+ UNICODE_STRING str;
+
+ RtlInitUnicodeString(&str, name);
+ if (NtQueryValueKey(hkey, &str, KeyValuePartialInformation, info, size, &size))
+ return 0;
+
+ return size - FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data);
+}
+
+
/***********************************************************************
* get_config_key
*
* Get a config key from either the app-specific or the default config
*/
static inline DWORD get_config_key(HKEY defkey, HKEY appkey, const char *name,
- char *buffer, DWORD size)
+ WCHAR *buffer, DWORD size)
{
- if (appkey && !RegQueryValueExA(appkey, name, 0, NULL, (LPBYTE)buffer, &size)) return 0;
- if (defkey && !RegQueryValueExA(defkey, name, 0, NULL, (LPBYTE)buffer, &size)) return 0;
+ WCHAR nameW[128];
+ char buf[2048];
+ KEY_VALUE_PARTIAL_INFORMATION *info = (void *)buf;
+
+ asciiz_to_unicode(nameW, name);
+
+ if (appkey && query_reg_value(appkey, nameW, info, sizeof(buf)))
+ {
+ size = min(info->DataLength, size - sizeof(WCHAR));
+ memcpy(buffer, info->Data, size);
+ buffer[size / sizeof(WCHAR)] = 0;
+ return 0;
+ }
+
+ if (defkey && query_reg_value(defkey, nameW, info, sizeof(buf)))
+ {
+ size = min(info->DataLength, size - sizeof(WCHAR));
+ memcpy(buffer, info->Data, size);
+ buffer[size / sizeof(WCHAR)] = 0;
+ return 0;
+ }
+
return ERROR_FILE_NOT_FOUND;
}
@@ -123,36 +205,41 @@ static inline DWORD get_config_key(HKEY defkey, HKEY appkey, const char *name,
*/
static void setup_options(void)
{
- char buffer[MAX_PATH + 16];
+ static const WCHAR macdriverW[] = {'\\','M','a','c',' ','D','r','i','v','e','r',0};
+ WCHAR buffer[MAX_PATH + 16], *p, *appname;
HKEY hkey, appkey = 0;
DWORD len;
/* @@ Wine registry key: HKCU\Software\Wine\Mac Driver */
- if (RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Mac Driver", &hkey)) hkey = 0;
+ hkey = open_hkcu_key("Software\\Wine\\Mac Driver");
/* open the app-specific key */
- len = GetModuleFileNameA(0, buffer, MAX_PATH);
+ appname = NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer;
+ if ((p = wcsrchr(appname, '/'))) appname = p + 1;
+ if ((p = wcsrchr(appname, '\\'))) appname = p + 1;
+ len = lstrlenW(appname);
+
if (len && len < MAX_PATH)
{
HKEY tmpkey;
- char *p, *appname = buffer;
- if ((p = strrchr(appname, '/'))) appname = p + 1;
- if ((p = strrchr(appname, '\\'))) appname = p + 1;
- strcat(appname, "\\Mac Driver");
+ memcpy(buffer, appname, len * sizeof(WCHAR));
+ memcpy(buffer + len, macdriverW, sizeof(macdriverW));
/* @@ Wine registry key: HKCU\Software\Wine\AppDefaults\app.exe\Mac Driver */
- if (!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\AppDefaults", &tmpkey))
+ if ((tmpkey = open_hkcu_key("Software\\Wine\\AppDefaults")))
{
- if (RegOpenKeyA(tmpkey, appname, &appkey)) appkey = 0;
- RegCloseKey(tmpkey);
+ appkey = reg_open_key(tmpkey, buffer, lstrlenW(buffer) * sizeof(WCHAR));
+ NtClose(tmpkey);
}
}
if (!get_config_key(hkey, appkey, "WindowsFloatWhenInactive", buffer, sizeof(buffer)))
{
- if (!strcmp(buffer, "none"))
+ static const WCHAR noneW[] = {'n','o','n','e',0};
+ static const WCHAR allW[] = {'a','l','l',0};
+ if (!lstrcmpW(buffer, noneW))
topmost_float_inactive = TOPMOST_FLOAT_INACTIVE_NONE;
- else if (!strcmp(buffer, "all"))
+ else if (!lstrcmpW(buffer, allW))
topmost_float_inactive = TOPMOST_FLOAT_INACTIVE_ALL;
else
topmost_float_inactive = TOPMOST_FLOAT_INACTIVE_NONFULLSCREEN;
@@ -206,9 +293,11 @@ static void setup_options(void)
if (!get_config_key(hkey, appkey, "OpenGLSurfaceMode", buffer, sizeof(buffer)))
{
- if (!strcmp(buffer, "transparent"))
+ static const WCHAR transparentW[] = {'t','r','a','n','s','p','a','r','e','n','t',0};
+ static const WCHAR behindW[] = {'b','e','h','i','n','d',0};
+ if (!lstrcmpW(buffer, transparentW))
gl_surface_mode = GL_SURFACE_IN_FRONT_TRANSPARENT;
- else if (!strcmp(buffer, "behind"))
+ else if (!lstrcmpW(buffer, behindW))
gl_surface_mode = GL_SURFACE_BEHIND;
else
gl_surface_mode = GL_SURFACE_IN_FRONT_OPAQUE;
@@ -222,8 +311,8 @@ static void setup_options(void)
if (!get_config_key(hkey, NULL, "RetinaMode", buffer, sizeof(buffer)))
retina_enabled = IS_OPTION_TRUE(buffer[0]);
- if (appkey) RegCloseKey(appkey);
- if (hkey) RegCloseKey(hkey);
+ if (appkey) NtClose(appkey);
+ if (hkey) NtClose(hkey);
}
More information about the wine-cvs
mailing list