spoolss: Implement InitializeRouter.
This commit is contained in:
parent
ae24e21da1
commit
76204941b8
|
@ -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;
|
||||
|
@ -169,6 +261,15 @@ BOOL WINAPI ImpersonatePrinterClient(HANDLE hToken)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/******************************************************************
|
||||
* InitializeRouter [SPOOLSS.@]
|
||||
*/
|
||||
BOOL WINAPI InitializeRouter(void)
|
||||
{
|
||||
TRACE("()\n");
|
||||
return backend_load();
|
||||
}
|
||||
|
||||
/******************************************************************
|
||||
* IsLocalCall [SPOOLSS.@]
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue