[PATCH] spoolss: Implement InitializeRouter

Detlef Riekenberg wine.dev at web.de
Tue Jul 1 17:16:46 CDT 2008


---
 dlls/spoolss/spoolss.spec   |    2 +-
 dlls/spoolss/spoolss_main.c |  102 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 103 insertions(+), 1 deletions(-)

diff --git a/dlls/spoolss/spoolss.spec b/dlls/spoolss/spoolss.spec
index 5645b2e..da5ee04 100644
--- a/dlls/spoolss/spoolss.spec
+++ b/dlls/spoolss/spoolss.spec
@@ -73,7 +73,7 @@
 @ stub GetPrinterDriverW
 @ stub GetPrinterW
 @ stdcall ImpersonatePrinterClient(long)
-@ stub InitializeRouter
+@ stdcall InitializeRouter()
 @ stdcall IsLocalCall()
 @ stub IsNamedPipeRpcCall
 @ stub LoadDriver
diff --git a/dlls/spoolss/spoolss_main.c b/dlls/spoolss/spoolss_main.c
index c701c0d..d5059cf 100644
--- a/dlls/spoolss/spoolss_main.c
+++ b/dlls/spoolss/spoolss_main.c
@@ -23,16 +23,104 @@
 #include "windef.h"
 #include "winbase.h"
 #include "winerror.h"
+#include "winreg.h"
+
+#include "wingdi.h"
+#include "winspool.h"
+#include "ddk/winsplp.h"
+
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(spoolss);
 
 /* ################################ */
 
+static CRITICAL_SECTION backend_cs;
+static CRITICAL_SECTION_DEBUG backend_cs_debug =
+{
+    0, 0, &backend_cs,
+    { &backend_cs_debug.ProcessLocksList, &backend_cs_debug.ProcessLocksList },
+      0, 0, { (DWORD_PTR)(__FILE__ ": backend_cs") }
+};
+static CRITICAL_SECTION backend_cs = { &backend_cs_debug, -1, 0, 0, 0, 0 };
+
+/* ################################ */
+
 static HMODULE hwinspool;
+static HMODULE hlocalspl;
+static BOOL (WINAPI *pInitializePrintProvidor)(LPPRINTPROVIDOR, DWORD, LPWSTR);
+
+static PRINTPROVIDOR * backend;
+
+/* ################################ */
+
+static const WCHAR localspldllW[] = {'l','o','c','a','l','s','p','l','.','d','l','l',0};
 static const WCHAR winspooldrvW[] = {'w','i','n','s','p','o','o','l','.','d','r','v',0};
 
+/******************************************************************************
+ * backend_load [internal]
+ *
+ * load and init our backend (the local printprovider: "localspl.dll")
+ *
+ * PARAMS
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE and RPC_S_SERVER_UNAVAILABLE
+ *
+ * NOTES
+ *  In windows, the spooler router (spoolss.dll) support multiple 
+ *  printprovider (localspl.dll for the local system)
+ *
+ */
+static BOOL backend_load(void)
+{
+    static PRINTPROVIDOR mybackend;
+    DWORD res;
+
+    if (backend) return TRUE;
+
+    EnterCriticalSection(&backend_cs);
+    hlocalspl = LoadLibraryW(localspldllW);
+    if (hlocalspl) {
+        pInitializePrintProvidor = (void *) GetProcAddress(hlocalspl, "InitializePrintProvidor");
+        if (pInitializePrintProvidor) {
+
+            /* native localspl does not clear unused entries */
+            memset(&mybackend, 0, sizeof(mybackend));
+            res = pInitializePrintProvidor(&mybackend, sizeof(mybackend), NULL);
+            if (res) {
+                backend = &mybackend;
+                LeaveCriticalSection(&backend_cs);
+                TRACE("backend: %p (%p)\n", backend, hlocalspl);
+                return TRUE;
+            }
+        }
+        FreeLibrary(hlocalspl);
+    }
+
+    LeaveCriticalSection(&backend_cs);
+
+    WARN("failed to load the backend: %u\n", GetLastError());
+    SetLastError(RPC_S_SERVER_UNAVAILABLE);
+    return FALSE;
+}
+
 /******************************************************************
+ * unload_backend [internal]
+ *
+ */
+static void backend_unload(void)
+{
+    EnterCriticalSection(&backend_cs);
+    if (backend) {
+        backend = NULL;
+        FreeLibrary(hlocalspl);
+    }
+    LeaveCriticalSection(&backend_cs);
+}
+
+/******************************************************************************
  *
  */
 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
@@ -45,6 +133,10 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
         case DLL_PROCESS_ATTACH: {
             DisableThreadLibraryCalls(hinstDLL);
             break;
+
+        case DLL_PROCESS_DETACH:
+            backend_unload();
+            break;
         }
     }
     return TRUE;
@@ -170,6 +262,15 @@ BOOL WINAPI ImpersonatePrinterClient(HANDLE hToken)
 }
 
 /******************************************************************
+ *   InitializeRouter   [SPOOLSS.@]
+ */
+BOOL WINAPI InitializeRouter(void)
+{
+    TRACE("()\n");
+    return backend_load();
+}
+
+/******************************************************************
  *   IsLocalCall    [SPOOLSS.@]
  */
 BOOL WINAPI IsLocalCall(void)
@@ -266,3 +367,4 @@ BOOL WINAPI WaitForSpoolerInitialization(void)
     FIXME("() stub\n");
     return TRUE;
 }
+
-- 
1.5.4.3


--=-iEGW2smM2I1YcGTSK+mz--




More information about the wine-patches mailing list