[PATCH 2/2] d2d1: Introduce a registry key to limit the maximum supported factory version.

Henri Verbeet hverbeet at codeweavers.com
Mon Jan 22 06:10:46 CST 2018


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/d2d1/Makefile.in    |  2 +-
 dlls/d2d1/d2d1_private.h |  6 ++++
 dlls/d2d1/factory.c      | 76 +++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 82 insertions(+), 2 deletions(-)

diff --git a/dlls/d2d1/Makefile.in b/dlls/d2d1/Makefile.in
index 51b9627..20d3f26 100644
--- a/dlls/d2d1/Makefile.in
+++ b/dlls/d2d1/Makefile.in
@@ -1,6 +1,6 @@
 MODULE    = d2d1.dll
 IMPORTLIB = d2d1
-IMPORTS   = d3d10_1 dxguid uuid gdi32 user32
+IMPORTS   = d3d10_1 dxguid uuid gdi32 user32 advapi32
 DELAYIMPORTS = dwrite
 
 C_SRCS = \
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 3b21bc1..f876cbf 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -52,6 +52,12 @@ enum d2d_shape_type
     D2D_SHAPE_TYPE_COUNT,
 };
 
+struct d2d_settings
+{
+    unsigned int max_version_factory;
+};
+extern struct d2d_settings d2d_settings DECLSPEC_HIDDEN;
+
 struct d2d_clip_stack
 {
     D2D1_RECT_F *stack;
diff --git a/dlls/d2d1/factory.c b/dlls/d2d1/factory.c
index da2b892..f202332 100644
--- a/dlls/d2d1/factory.c
+++ b/dlls/d2d1/factory.c
@@ -22,8 +22,14 @@
 #define D2D1_INIT_GUID
 #include "d2d1_private.h"
 
+WINE_DECLARE_DEBUG_CHANNEL(winediag);
 WINE_DEFAULT_DEBUG_CHANNEL(d2d);
 
+struct d2d_settings d2d_settings =
+{
+    ~0u,    /* No ID2D1Factory version limit by default. */
+};
+
 struct d2d_factory
 {
     ID2D1Factory1 ID2D1Factory1_iface;
@@ -62,7 +68,7 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_QueryInterface(ID2D1Factory1 *iface
 {
     TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
 
-    if (IsEqualGUID(iid, &IID_ID2D1Factory1)
+    if ((IsEqualGUID(iid, &IID_ID2D1Factory1) && d2d_settings.max_version_factory >= 1)
             || IsEqualGUID(iid, &IID_ID2D1Factory)
             || IsEqualGUID(iid, &IID_IUnknown))
     {
@@ -537,3 +543,71 @@ void WINAPI D2D1MakeRotateMatrix(float angle, D2D1_POINT_2F center, D2D1_MATRIX_
     matrix->_31 = center.x - center.x * cos_theta + center.y * sin_theta;
     matrix->_32 = center.y - center.x * sin_theta - center.y * cos_theta;
 }
+
+static BOOL get_config_key_dword(HKEY default_key, HKEY application_key, const char *name, DWORD *value)
+{
+    DWORD type, data, size;
+
+    size = sizeof(data);
+    if (application_key && !RegQueryValueExA(application_key,
+            name, 0, &type, (BYTE *)&data, &size) && type == REG_DWORD)
+        goto success;
+
+    size = sizeof(data);
+    if (default_key && !RegQueryValueExA(default_key,
+            name, 0, &type, (BYTE *)&data, &size) && type == REG_DWORD)
+        goto success;
+
+    return FALSE;
+
+success:
+    *value = data;
+    return TRUE;
+}
+
+static void d2d_settings_init(void)
+{
+    HKEY default_key, tmp_key, application_key = NULL;
+    char buffer[MAX_PATH + 10];
+    DWORD len;
+
+    if (RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Direct2D", &default_key))
+        default_key = NULL;
+
+    len = GetModuleFileNameA(0, buffer, MAX_PATH);
+    if (len && len < MAX_PATH)
+    {
+        char *p, *appname = buffer;
+
+        if ((p = strrchr(appname, '/')))
+            appname = p + 1;
+        if ((p = strrchr(appname, '\\')))
+            appname = p + 1;
+        strcat(appname, "\\Direct2D");
+
+        if (!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\AppDefaults", &tmp_key))
+        {
+            if (RegOpenKeyA(tmp_key, appname, &application_key))
+                application_key = NULL;
+            RegCloseKey(tmp_key);
+        }
+    }
+
+    if (!default_key && !application_key)
+        return;
+
+    if (get_config_key_dword(default_key, application_key, "max_version_factory", &d2d_settings.max_version_factory))
+        ERR_(winediag)("Limiting maximum Direct2D factory version to %#x.\n", d2d_settings.max_version_factory);
+
+    if (application_key)
+        RegCloseKey(application_key);
+    if (default_key)
+        RegCloseKey(default_key);
+}
+
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, void *reserved)
+{
+    if (reason == DLL_PROCESS_ATTACH)
+        d2d_settings_init();
+    return TRUE;
+}
-- 
2.1.4




More information about the wine-devel mailing list