Module: wine Branch: master Commit: 76204941b815a8095f8d99bdca4862faec6a1fa6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=76204941b815a8095f8d99bdca...
Author: Detlef Riekenberg wine.dev@web.de Date: Wed Jul 2 00:16:46 2008 +0200
spoolss: Implement InitializeRouter.
---
dlls/spoolss/spoolss.spec | 2 +- dlls/spoolss/spoolss_main.c | 101 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 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..cc4487c 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)