wine/dlls/winspool.drv/wspool.c

144 lines
3.9 KiB
C

/******************************************************************************
* Print Spooler Functions
*
*
* Copyright 1999 Thuy Nguyen
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "winspool.h"
#include "winreg.h"
#include "ddk/winsplp.h"
#include "wine/debug.h"
#include "wspool.h"
WINE_DEFAULT_DEBUG_CHANNEL(winspool);
/* ############################### */
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 };
/* ############################### */
HINSTANCE WINSPOOL_hInstance = NULL;
static HMODULE hlocalspl = NULL;
static BOOL (WINAPI *pInitializePrintProvidor)(LPPRINTPROVIDOR, DWORD, LPWSTR);
PRINTPROVIDOR * backend = NULL;
/******************************************************************************
* load_backend [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, winspool.drv use RPC to interact with the spooler service
* (spoolsv.exe with spoolss.dll) and the spooler router (spoolss.dll) interact
* with the correct printprovider (localspl.dll for the local system)
*
*/
BOOL load_backend(void)
{
static PRINTPROVIDOR mybackend;
DWORD res;
EnterCriticalSection(&backend_cs);
hlocalspl = LoadLibraryA("localspl.dll");
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 unload_backend(void)
{
EnterCriticalSection(&backend_cs);
backend = NULL;
FreeLibrary(hlocalspl);
LeaveCriticalSection(&backend_cs);
DeleteCriticalSection(&backend_cs);
}
/******************************************************************************
* DllMain
*
* Winspool entry point.
*
*/
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID lpReserved)
{
switch (reason)
{
case DLL_PROCESS_ATTACH: {
WINSPOOL_hInstance = hInstance;
DisableThreadLibraryCalls(hInstance);
WINSPOOL_LoadSystemPrinters();
break;
}
case DLL_PROCESS_DETACH:
unload_backend();
break;
}
return TRUE;
}