[PATCH 2/2] localspl: Support loading modern Print Monitors (InitializePrintMonitor2)

Detlef Riekenberg wine.dev at web.de
Mon Dec 5 11:12:05 CST 2016


This is a step for bug 3864

InitializePrintMonitor2 is required since XP

--
bye bye ... Detlef

Signed-off-by: Detlef Riekenberg <wine.dev at web.de>
---
 dlls/localspl/provider.c | 173 +++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 166 insertions(+), 7 deletions(-)

diff --git a/dlls/localspl/provider.c b/dlls/localspl/provider.c
index f359b73..add4fc8 100644
--- a/dlls/localspl/provider.c
+++ b/dlls/localspl/provider.c
@@ -1,7 +1,7 @@
 /*
  * Implementation of the Local Printprovider
  *
- * Copyright 2006-2009 Detlef Riekenberg
+ * Copyright 2006-2009, 2015-2016 Detlef Riekenberg
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -66,6 +66,9 @@ typedef struct {
     LPWSTR          dllname;
     PMONITORUI      monitorUI;
     LPMONITOR       monitor;
+    LPMONITOR2      monitor2;
+    MONITORINIT     monitorinit;
+    HANDLE          hmonitor;
     HMODULE         hdll;
     DWORD           refcount;
     DWORD           dwMonitorSize;
@@ -310,6 +313,135 @@ static LPCWSTR get_basename_from_name(LPCWSTR name)
     return name;
 }
 
+
+/******************************************************************
+ * fpCreateKey for MONITORREG [internal]
+ *
+ */
+static LONG WINAPI fpCreateKey(HANDLE rootkey, LPCWSTR name, DWORD options, REGSAM access,
+                    PSECURITY_ATTRIBUTES sa, PHANDLE resultkey, PDWORD disposition, HANDLE spooler)
+{
+
+    TRACE("%p_CreateKey(%p, %s, ...)\n", spooler, rootkey, debugstr_w(name));
+    return RegCreateKeyExW(rootkey, name, 0, NULL, options, access, sa, (PHKEY)resultkey, disposition);
+
+}
+
+/******************************************************************
+ * fpOpenKey for MONITORREG [internal]
+ *
+ */
+static LONG WINAPI fpOpenKey(HANDLE rootkey, LPCWSTR name, REGSAM access, PHANDLE resultkey, HANDLE spooler)
+{
+    TRACE("%p_OpenKey(%p, %s, ...)\n", spooler, rootkey, debugstr_w(name));
+    return RegOpenKeyExW(rootkey, name, 0, access, (PHKEY)resultkey);
+}
+
+/******************************************************************
+ * fpCloseKey for MONITORREG [internal]
+ *
+ */
+static LONG WINAPI fpCloseKey(HANDLE key, HANDLE spooler)
+{
+    TRACE("%p_CLoseKey(%p)\n", spooler, key);
+    return RegCloseKey(key);
+}
+
+/******************************************************************
+ * fpDeleteKey for MONITORREG [internal]
+ *
+ */
+static LONG WINAPI fpDeleteKey(HANDLE key, LPCWSTR name, HANDLE spooler)
+{
+    TRACE("%p_DeleteKey(%p, %s)\n", spooler, key, debugstr_w(name));
+    return RegDeleteKeyW(key, name);
+}
+
+/******************************************************************
+ * fpEnumKey for MONITORREG [internal]
+ *
+ */
+static LONG WINAPI fpEnumKey(HANDLE key, DWORD index, LPWSTR res_name, PDWORD len, PFILETIME plastwritetime, HANDLE spooler)
+{
+    TRACE("%p_EnumKey(%p, %d, ...)\n", spooler, key, index);
+    return RegEnumKeyExW(key, index, res_name, len, 0, NULL, NULL, plastwritetime);
+}
+
+/******************************************************************
+ * fpQueryInfoKey for MONITORREG [internal]
+ *
+ */
+static LONG WINAPI fpQueryInfoKey(HANDLE key, PDWORD pcSubKeys, PDWORD pcbKey,
+    PDWORD pcValues, PDWORD pcbValue, PDWORD pcbData,
+    PDWORD pcbSecurityDescriptor, PFILETIME plastwritetime, HANDLE spooler)
+{
+    TRACE("%p_QueryInfoKey(%p, ...)\n", spooler, key);
+    return RegQueryInfoKeyW(key, NULL, NULL, 0, pcSubKeys, pcbKey, NULL,
+            pcValues, pcbValue, pcbData, pcbSecurityDescriptor, plastwritetime);
+}
+
+/******************************************************************
+ * fpSetValue for MONITORREG [internal]
+ *
+ */
+static LONG WINAPI fpSetValue(HANDLE key, LPCWSTR name, DWORD type, const BYTE* data, DWORD len, HANDLE spooler)
+{
+    TRACE("%p_SetValue(%p, %s, %d, %p, %d)\n", spooler, key, debugstr_w(name), type, data, len);
+    return RegSetValueExW(key, name, 0, type, data, len);
+}
+
+/******************************************************************
+ * fpDeleteValue for MONITORREG [internal]
+ *
+ */
+static LONG WINAPI fpDeleteValue(HANDLE key, LPCWSTR name, HANDLE spooler)
+{
+    TRACE("%p_DeleteValue(%p, %s)\n", spooler, key, debugstr_w(name));
+    return RegDeleteValueW(key, name);
+}
+
+/******************************************************************
+ * fpEnumValue for MONITORREG [internal]
+ *
+ */
+static LONG WINAPI fpEnumValue(HANDLE key, DWORD index, LPWSTR res_value, PDWORD pcbValue, PDWORD pType, PBYTE data, PDWORD pcbData, HANDLE spooler)
+{
+    TRACE("%p_EnumValue(%p, %d, ...)\n", spooler, key, index);
+    return RegEnumValueW(key, index, res_value, pcbValue, NULL, pType, data, pcbData);
+}
+
+/******************************************************************
+ * fpQueryValue for MONITORREG [internal]
+ *
+ */
+static LONG WINAPI fpQueryValue(HANDLE key, LPCWSTR res_value, PDWORD type, PBYTE data, PDWORD len, HANDLE spooler)
+{
+    TRACE("%p_QueryValue(%p, ...)\n", spooler, key);
+    return RegQueryValueExW(key, res_value, 0, type, data, len);
+}
+
+/*****************************************************
+ *  setup_monitorreg [internal]
+ */
+MONITORREG * setup_monitorreg(void)
+{
+    static MONITORREG monitorreg = {
+        sizeof(MONITORREG),
+        fpCreateKey,
+        fpOpenKey,
+        fpCloseKey,
+        fpDeleteKey,
+        fpEnumKey,
+        fpQueryInfoKey,
+        fpSetValue,
+        fpDeleteValue,
+        fpEnumValue,
+        fpQueryValue
+    };
+
+    return &monitorreg;
+}
+
 /******************************************************************
  * monitor_unload [internal]
  *
@@ -326,6 +458,11 @@ static void monitor_unload(monitor_t * pm)
     if (pm->refcount) pm->refcount--;
 
     if (pm->refcount == 0) {
+        if (pm->monitor2 && pm->monitor2->pfnShutdown) {
+            TRACE("call pfnShutDown(%p)\n", pm->hmonitor);
+            pm->monitor2->pfnShutdown(pm->hmonitor);
+        }
+        RegCloseKey(pm->monitorinit.hckRegistryRoot);
         list_remove(&pm->entry);
         FreeLibrary(pm->hdll);
         heap_free(pm->name);
@@ -471,7 +608,32 @@ static monitor_t * monitor_load(LPCWSTR name, LPWSTR dllname)
             }
         }
 
-        if (pInitializePrintMonitor && regroot) {
+        if (pInitializePrintMonitor2 && regroot) {
+            HKEY rootkey;
+
+            pm->monitorinit.cbSize = sizeof(MONITORINIT);
+            pm->monitorinit.hSpooler = pm;
+
+            if (RegCreateKeyW(HKEY_LOCAL_MACHINE, regroot, &rootkey) != ERROR_SUCCESS) {
+                WARN("failed to create %s\n", debugstr_w(regroot));
+                goto cleanup;
+            }
+
+            TRACE("using %p for %s\n", rootkey, debugstr_w(regroot));
+
+            pm->monitorinit.hckRegistryRoot = rootkey;
+            pm->monitorinit.pMonitorReg = setup_monitorreg();
+            pm->monitorinit.bLocal = TRUE;
+            pm->monitorinit.pszServerName = NULL;
+
+            pm->monitor2 = pInitializePrintMonitor2(&pm->monitorinit, &pm->hmonitor);
+            TRACE("%p: LPMONITOR2 from %s,InitializePrintMonitor2(%p, %p)\n",
+                    pm->monitor2, debugstr_w(driver), &pm->monitorinit, &pm->hmonitor);
+
+        }
+
+
+        if (!pm->monitor2 && pInitializePrintMonitor && regroot) {
             pmonitorEx = pInitializePrintMonitor(regroot);
             TRACE("%p: LPMONITOREX from %s,InitializePrintMonitor(%s)\n",
                     pmonitorEx, debugstr_w(driver), debugstr_w(regroot));
@@ -487,10 +649,7 @@ static monitor_t * monitor_load(LPCWSTR name, LPWSTR dllname)
 
         }
 
-        if (!pm->monitor && regroot) {
-            if (pInitializePrintMonitor2 != NULL) {
-                FIXME("%s,InitializePrintMonitor2 not implemented\n", debugstr_w(driver));
-            }
+        if (!pm->monitor2 && !pm->monitor && regroot) {
             if (pInitializeMonitorEx != NULL) {
                 FIXME("%s,InitializeMonitorEx not implemented\n", debugstr_w(driver));
             }
@@ -498,7 +657,7 @@ static monitor_t * monitor_load(LPCWSTR name, LPWSTR dllname)
                 FIXME("%s,InitializeMonitor not implemented\n", debugstr_w(driver));
             }
         }
-        if (!pm->monitor && !pm->monitorUI) {
+        if (!pm->monitor2 && !pm->monitor && !pm->monitorUI) {
             monitor_unload(pm);
             SetLastError(ERROR_PROC_NOT_FOUND);
             pm = NULL;
-- 
2.7.4




More information about the wine-patches mailing list