[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