From 1c312cc50196f86c8daf2dee5bd99451d01cbf06 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Sat, 3 Jan 2009 11:18:58 +0000 Subject: [PATCH] - Add spoolss from Wine svn path=/trunk/; revision=38527 --- reactos/baseaddress.rbuild | 1 + reactos/boot/bootdata/packages/reactos.dff | 1 + reactos/dll/win32/spoolss/spoolss.rbuild | 15 + reactos/dll/win32/spoolss/spoolss.spec | 151 +++++++++ reactos/dll/win32/spoolss/spoolss_main.c | 369 +++++++++++++++++++++ reactos/dll/win32/win32.rbuild | 3 + reactos/media/doc/README.WINE | 1 + 7 files changed, 541 insertions(+) create mode 100644 reactos/dll/win32/spoolss/spoolss.rbuild create mode 100644 reactos/dll/win32/spoolss/spoolss.spec create mode 100644 reactos/dll/win32/spoolss/spoolss_main.c diff --git a/reactos/baseaddress.rbuild b/reactos/baseaddress.rbuild index 55967b54751..3f7239bba51 100644 --- a/reactos/baseaddress.rbuild +++ b/reactos/baseaddress.rbuild @@ -110,6 +110,7 @@ + diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index 225ef4ee01d..b7c61af9925 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -341,6 +341,7 @@ dll\win32\shimgvw\shimgvw.dll 1 dll\win32\shlwapi\shlwapi.dll 1 dll\win32\smdll\smdll.dll 1 dll\win32\snmpapi\snmpapi.dll 1 +dll\win32\spoolss\spoolss.dll 1 dll\win32\stdole2.tlb\stdole2.tlb 1 dll\win32\stdole32.tlb\stdole32.tlb 1 dll\win32\sxs\sxs.dll 1 diff --git a/reactos/dll/win32/spoolss/spoolss.rbuild b/reactos/dll/win32/spoolss/spoolss.rbuild new file mode 100644 index 00000000000..d105a73c0a2 --- /dev/null +++ b/reactos/dll/win32/spoolss/spoolss.rbuild @@ -0,0 +1,15 @@ + + + + + + . + include/reactos/wine + + spoolss_main.c + wine + winspool + kernel32 + ntdll + + diff --git a/reactos/dll/win32/spoolss/spoolss.spec b/reactos/dll/win32/spoolss/spoolss.spec new file mode 100644 index 00000000000..da5ee0419f5 --- /dev/null +++ b/reactos/dll/win32/spoolss/spoolss.spec @@ -0,0 +1,151 @@ +@ stub AbortPrinter +@ stub AddFormW +@ stub AddJobW +@ stub AddMonitorW +@ stub AddPerMachineConnectionW +@ stub AddPortExW +@ stub AddPortW +@ stub AddPrintProcessorW +@ stub AddPrintProvidorW +@ stub AddPrinterConnectionW +@ stub AddPrinterDriverExW +@ stub AddPrinterDriverW +@ stub AddPrinterExW +@ stub AddPrinterW +@ stdcall AllocSplStr(wstr) +@ stub AppendPrinterNotifyInfoData +@ stdcall BuildOtherNamesFromMachineName(ptr ptr) +@ stub CallDrvDevModeConversion +@ stub CallRouterFindFirstPrinterChangeNotification +@ stub ClosePrinter +@ stub ClusterSplClose +@ stub ClusterSplIsAlive +@ stub ClusterSplOpen +@ stub ConfigurePortW +@ stub CreatePrinterIC +@ stub DbgGetPointers +@ stub DeleteFormW +@ stub DeleteMonitorW +@ stub DeletePerMachineConnectionW +@ stub DeletePortW +@ stub DeletePrintProcessorW +@ stub DeletePrintProvidorW +@ stub DeletePrinter +@ stub DeletePrinterConnectionW +@ stub DeletePrinterDataExW +@ stub DeletePrinterDataW +@ stub DeletePrinterDriverExW +@ stub DeletePrinterDriverW +@ stub DeletePrinterIC +@ stub DeletePrinterKeyW +@ stdcall DllAllocSplMem(long) +@ stdcall DllFreeSplMem(ptr) +@ stdcall DllFreeSplStr(wstr) +@ stub EndDocPrinter +@ stub EndPagePrinter +@ stub EnumFormsW +@ stub EnumJobsW +@ stub EnumMonitorsW +@ stub EnumPerMachineConnectionsW +@ stdcall EnumPortsW(wstr long ptr ptr ptr ptr) winspool.drv.EnumPortsW +@ stub EnumPrintProcessorDatatypesW +@ stub EnumPrintProcessorsW +@ stub EnumPrinterDataExW +@ stub EnumPrinterDataW +@ stub EnumPrinterDriversW +@ stub EnumPrinterKeyW +@ stub EnumPrintersW +@ stub FindClosePrinterChangeNotification +@ stub FlushPrinter +@ stub FormatPrinterForRegistryKey +@ stub FormatRegistryKeyForPrinter +@ stub FreeOtherNames +@ stub GetClientUserHandle +@ stub GetFormW +@ stub GetJobAttributes +@ stub GetJobW +@ stub GetNetworkId +@ stub GetPrintProcessorDirectoryW +@ stub GetPrinterDataExW +@ stub GetPrinterDataW +@ stub GetPrinterDriverDirectoryW +@ stub GetPrinterDriverExW +@ stub GetPrinterDriverW +@ stub GetPrinterW +@ stdcall ImpersonatePrinterClient(long) +@ stdcall InitializeRouter() +@ stdcall IsLocalCall() +@ stub IsNamedPipeRpcCall +@ stub LoadDriver +@ stub LoadDriverFiletoConvertDevmode +@ stub MIDL_user_allocate1 +@ stub MIDL_user_free1 +@ stub MarshallDownStructure +@ stub MarshallUpStructure +@ stub OldGetPrinterDriverW +@ stub OpenPrinterExW +@ stub OpenPrinterPortW +@ stub OpenPrinterW +@ stub PackStrings +@ stub PartialReplyPrinterChangeNotification +@ stub PlayGdiScriptOnPrinterIC +@ stub PrinterHandleRundown +@ stub PrinterMessageBoxW +@ stub ProvidorFindClosePrinterChangeNotification +@ stub ProvidorFindFirstPrinterChangeNotification +@ stub ReadPrinter +@ stub ReallocSplMem +@ stub ReallocSplStr +@ stub RemoteFindFirstPrinterChangeNotification +@ stub ReplyClosePrinter +@ stub ReplyOpenPrinter +@ stub ReplyPrinterChangeNotification +@ stub ResetPrinterW +@ stdcall RevertToPrinterSelf() +@ stub RouterAllocPrinterNotifyInfo +@ stub RouterFindFirstPrinterChangeNotification +@ stub RouterFindNextPrinterChangeNotification +@ stub RouterFreePrinterNotifyInfo +@ stub RouterRefreshPrinterChangeNotification +@ stub RouterReplyPrinter +@ stub ScheduleJob +@ stub SeekPrinter +@ stub SetAllocFailCount +@ stub SetFormW +@ stub SetJobW +@ stub SetPortW +@ stub SetPrinterDataExW +@ stub SetPrinterDataW +@ stub SetPrinterW +@ stub SplCloseSpoolFileHandle +@ stub SplCommitSpoolData +@ stub SplDriverUnloadComplete +@ stub SplGetSpoolFileInfo +@ stdcall SplInitializeWinSpoolDrv(ptr) +@ stdcall SplIsUpgrade() +@ stub SplProcessPnPEvent +@ stub SplReadPrinter +@ stub SplRegisterForDeviceEvents +@ stub SplStartPhase2Init +@ stub SplUnregisterForDeviceEvents +@ stub SpoolerFindClosePrinterChangeNotification +@ stub SpoolerFindFirstPrinterChangeNotification +@ stub SpoolerFindNextPrinterChangeNotification +@ stub SpoolerFreePrinterNotifyInfo +@ stdcall SpoolerHasInitialized() +@ stdcall SpoolerInit() +@ stub StartDocPrinterW +@ stub StartPagePrinter +@ stub UnloadDriver +@ stub UnloadDriverFile +@ stub UpdateBufferSize +@ stub UpdatePrinterRegAll +@ stub UpdatePrinterRegUser +@ stub WaitForPrinterChange +@ stdcall WaitForSpoolerInitialization() +@ stub WritePrinter +@ stub XcvDataW +@ stub bGetDevModePerUser +@ stub bSetDevModePerUser +@ stub pszDbgAllocMsgA +@ stub vDbgLogError diff --git a/reactos/dll/win32/spoolss/spoolss_main.c b/reactos/dll/win32/spoolss/spoolss_main.c new file mode 100644 index 00000000000..cc4487c9fc8 --- /dev/null +++ b/reactos/dll/win32/spoolss/spoolss_main.c @@ -0,0 +1,369 @@ +/* + * 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 + +#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) +{ + 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(); + 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(); +} + +/****************************************************************** + * 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; +} diff --git a/reactos/dll/win32/win32.rbuild b/reactos/dll/win32/win32.rbuild index dbeda426b7f..a46576f2135 100644 --- a/reactos/dll/win32/win32.rbuild +++ b/reactos/dll/win32/win32.rbuild @@ -355,6 +355,9 @@ + + + diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 864ac1c9bec..18a8c7f3053 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -98,6 +98,7 @@ reactos/dll/win32/shell32 # Forked at Wine-20071011 reactos/dll/win32/shdocvw # Synced to Wine-0_9_5 reactos/dll/win32/shfolder # Autosync reactos/dll/win32/shlwapi # Autosync +reactos/dll/win32/spoolss # Autosync reactos/dll/win32/stdole2.tlb # Autosync reactos/dll/win32/sxs # Autosync reactos/dll/win32/tapi32 # Autosync