| /* | |
| * Implementation of the Spooler-Service helper DLL | |
| * | |
| * Copyright 2006 Detlef Riekenberg | |
| * | |
| * 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 <stdarg.h> | |
| #include "windef.h" | |
| #include "winbase.h" | |
| #include "winerror.h" | |
| #include "winreg.h" | |
| #include "wingdi.h" | |
| #include "winspool.h" | |
| #include "ddk/winsplp.h" | |
| #include "spoolss.h" | |
| #include "wine/debug.h" | |
| WINE_DEFAULT_DEBUG_CHANNEL(spoolss); | |
| /* ################################ */ | |
| static HMODULE hwinspool; | |
| static const WCHAR winspooldrvW[] = {'w','i','n','s','p','o','o','l','.','d','r','v',0}; | |
| /****************************************************************************** | |
| * | |
| */ | |
| BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) | |
| { | |
| TRACE("(%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved); | |
| switch (fdwReason) { | |
| case DLL_WINE_PREATTACH: | |
| return FALSE; /* prefer native version */ | |
| case DLL_PROCESS_ATTACH: { | |
| DisableThreadLibraryCalls(hinstDLL); | |
| break; | |
| case DLL_PROCESS_DETACH: | |
| backend_unload_all(); | |
| break; | |
| } | |
| } | |
| return TRUE; | |
| } | |
| /****************************************************************** | |
| * AllocSplStr [SPOOLSS.@] | |
| * | |
| * Create a copy from the String on the Spooler-Heap | |
| * | |
| * PARAMS | |
| * pwstr [I] PTR to the String to copy | |
| * | |
| * RETURNS | |
| * Failure: NULL | |
| * Success: PTR to the copied String | |
| * | |
| */ | |
| LPWSTR WINAPI AllocSplStr(LPCWSTR pwstr) | |
| { | |
| LPWSTR res = NULL; | |
| DWORD len; | |
| TRACE("(%s)\n", debugstr_w(pwstr)); | |
| if (!pwstr) return NULL; | |
| len = (lstrlenW(pwstr) + 1) * sizeof(WCHAR); | |
| res = HeapAlloc(GetProcessHeap(), 0, len); | |
| if (res) lstrcpyW(res, pwstr); | |
| TRACE("returning %p\n", res); | |
| return res; | |
| } | |
| /****************************************************************** | |
| * BuildOtherNamesFromMachineName [SPOOLSS.@] | |
| */ | |
| BOOL WINAPI BuildOtherNamesFromMachineName(LPVOID * ptr1, LPVOID * ptr2) | |
| { | |
| FIXME("(%p, %p) stub\n", ptr1, ptr2); | |
| *ptr1 = NULL; | |
| *ptr2 = NULL; | |
| return FALSE; | |
| } | |
| /****************************************************************** | |
| * DllAllocSplMem [SPOOLSS.@] | |
| * | |
| * Allocate cleared memory from the spooler heap | |
| * | |
| * PARAMS | |
| * size [I] Number of bytes to allocate | |
| * | |
| * RETURNS | |
| * Failure: NULL | |
| * Success: PTR to the allocated memory | |
| * | |
| * NOTES | |
| * We use the process heap (Windows use a separate spooler heap) | |
| * | |
| */ | |
| LPVOID WINAPI DllAllocSplMem(DWORD size) | |
| { | |
| LPVOID res; | |
| res = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); | |
| TRACE("(%d) => %p\n", size, res); | |
| return res; | |
| } | |
| /****************************************************************** | |
| * DllFreeSplMem [SPOOLSS.@] | |
| * | |
| * Free the allocated spooler memory | |
| * | |
| * PARAMS | |
| * memory [I] PTR to the memory allocated by DllAllocSplMem | |
| * | |
| * RETURNS | |
| * Failure: FALSE | |
| * Success: TRUE | |
| * | |
| * NOTES | |
| * We use the process heap (Windows use a separate spooler heap) | |
| * | |
| */ | |
| BOOL WINAPI DllFreeSplMem(LPBYTE memory) | |
| { | |
| TRACE("(%p)\n", memory); | |
| return HeapFree(GetProcessHeap(), 0, memory); | |
| } | |
| /****************************************************************** | |
| * DllFreeSplStr [SPOOLSS.@] | |
| * | |
| * Free the allocated Spooler-String | |
| * | |
| * PARAMS | |
| * pwstr [I] PTR to the WSTR, allocated by AllocSplStr | |
| * | |
| * RETURNS | |
| * Failure: FALSE | |
| * Success: TRUE | |
| * | |
| */ | |
| BOOL WINAPI DllFreeSplStr(LPWSTR pwstr) | |
| { | |
| TRACE("(%s) PTR: %p\n", debugstr_w(pwstr), pwstr); | |
| return HeapFree(GetProcessHeap(), 0, pwstr); | |
| } | |
| /****************************************************************** | |
| * ImpersonatePrinterClient [SPOOLSS.@] | |
| */ | |
| BOOL WINAPI ImpersonatePrinterClient(HANDLE hToken) | |
| { | |
| FIXME("(%p) stub\n", hToken); | |
| return TRUE; | |
| } | |
| /****************************************************************** | |
| * InitializeRouter [SPOOLSS.@] | |
| */ | |
| BOOL WINAPI InitializeRouter(void) | |
| { | |
| TRACE("()\n"); | |
| return backend_load_all(); | |
| } | |
| /****************************************************************** | |
| * IsLocalCall [SPOOLSS.@] | |
| */ | |
| BOOL WINAPI IsLocalCall(void) | |
| { | |
| FIXME("() stub\n"); | |
| return TRUE; | |
| } | |
| /****************************************************************** | |
| * RevertToPrinterSelf [SPOOLSS.@] | |
| */ | |
| HANDLE WINAPI RevertToPrinterSelf(void) | |
| { | |
| FIXME("() stub\n"); | |
| return (HANDLE) 0xdead0947; | |
| } | |
| /****************************************************************** | |
| * SplInitializeWinSpoolDrv [SPOOLSS.@] | |
| * | |
| * Dynamic load "winspool.drv" and fill an array with some function-pointer | |
| * | |
| * PARAMS | |
| * table [I] array of function-pointer to fill | |
| * | |
| * RETURNS | |
| * Success: TRUE | |
| * Failure: FALSE | |
| * | |
| * NOTES | |
| * Native "spoolss.dll" from w2k fill the table with 11 Function-Pointer. | |
| * We implement the XP-Version (The table has only 9 Pointer) | |
| * | |
| */ | |
| BOOL WINAPI SplInitializeWinSpoolDrv(LPVOID * table) | |
| { | |
| DWORD res; | |
| TRACE("(%p)\n", table); | |
| hwinspool = LoadLibraryW(winspooldrvW); | |
| if (!hwinspool) return FALSE; | |
| table[0] = (void *) GetProcAddress(hwinspool, "OpenPrinterW"); | |
| table[1] = (void *) GetProcAddress(hwinspool, "ClosePrinter"); | |
| table[2] = (void *) GetProcAddress(hwinspool, "SpoolerDevQueryPrintW"); | |
| table[3] = (void *) GetProcAddress(hwinspool, "SpoolerPrinterEvent"); | |
| table[4] = (void *) GetProcAddress(hwinspool, "DocumentPropertiesW"); | |
| table[5] = (void *) GetProcAddress(hwinspool, (LPSTR) 212); /* LoadPrinterDriver */ | |
| table[6] = (void *) GetProcAddress(hwinspool, (LPSTR) 213); /* RefCntLoadDriver */ | |
| table[7] = (void *) GetProcAddress(hwinspool, (LPSTR) 214); /* RefCntUnloadDriver */ | |
| table[8] = (void *) GetProcAddress(hwinspool, (LPSTR) 215); /* ForceUnloadDriver */ | |
| for (res = 0; res < 9; res++) { | |
| if (table[res] == NULL) return FALSE; | |
| } | |
| return TRUE; | |
| } | |
| /****************************************************************** | |
| * SplIsUpgrade [SPOOLSS.@] | |
| */ | |
| BOOL WINAPI SplIsUpgrade(void) | |
| { | |
| FIXME("() stub\n"); | |
| return FALSE; | |
| } | |
| /****************************************************************** | |
| * SpoolerHasInitialized [SPOOLSS.@] | |
| */ | |
| BOOL WINAPI SpoolerHasInitialized(void) | |
| { | |
| FIXME("() stub\n"); | |
| return TRUE; | |
| } | |
| /****************************************************************** | |
| * SpoolerInit [SPOOLSS.@] | |
| */ | |
| BOOL WINAPI SpoolerInit(void) | |
| { | |
| FIXME("() stub\n"); | |
| return TRUE; | |
| } | |
| /****************************************************************** | |
| * WaitForSpoolerInitialization [SPOOLSS.@] | |
| */ | |
| BOOL WINAPI WaitForSpoolerInitialization(void) | |
| { | |
| FIXME("() stub\n"); | |
| return TRUE; | |
| } |