Commit 76204941 authored by Detlef Riekenberg's avatar Detlef Riekenberg Committed by Alexandre Julliard

spoolss: Implement InitializeRouter.

parent ae24e21d
......@@ -73,7 +73,7 @@
@ stub GetPrinterDriverW
@ stub GetPrinterW
@ stdcall ImpersonatePrinterClient(long)
@ stub InitializeRouter
@ stdcall InitializeRouter()
@ stdcall IsLocalCall()
@ stub IsNamedPipeRpcCall
@ stub LoadDriver
......
......@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment