- Add spoolss from Wine
authorDmitry Chapyshev <dmitry@reactos.org>
Sat, 3 Jan 2009 11:18:58 +0000 (11:18 +0000)
committerDmitry Chapyshev <dmitry@reactos.org>
Sat, 3 Jan 2009 11:18:58 +0000 (11:18 +0000)
svn path=/trunk/; revision=38527

reactos/baseaddress.rbuild
reactos/boot/bootdata/packages/reactos.dff
reactos/dll/win32/spoolss/spoolss.rbuild [new file with mode: 0644]
reactos/dll/win32/spoolss/spoolss.spec [new file with mode: 0644]
reactos/dll/win32/spoolss/spoolss_main.c [new file with mode: 0644]
reactos/dll/win32/win32.rbuild
reactos/media/doc/README.WINE

index 55967b5..3f7239b 100644 (file)
   <property name="BASEADDRESS_COREDLL" value="0x73d80000" />
   <property name="BASEADDRESS_KSUSER" value="0x73ea0000" />
   <property name="BASEADDRESS_ICMP" value="0x741f0000" />
+  <property name="BASEADDRESS_SPOOLSS" value="0x742a0000" />
   <property name="BASEADDRESS_QUARTZ" value="0x747d0000" />
   <property name="BASEADDRESS_USERENV" value="0x74850000" />
   <property name="BASEADDRESS_WS2_32" value="0x74aa0000" />
index 225ef4e..b7c61af 100644 (file)
@@ -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 (file)
index 0000000..d105a73
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<group>
+<module name="spoolss" type="win32dll" baseaddress="${BASEADDRESS_SPOOLSS}" installbase="system32" installname="spoolss.dll" allowwarnings="true">
+       <importlibrary definition="spoolss.spec" />
+       <include base="spoolss">.</include>
+       <include base="ReactOS">include/reactos/wine</include>
+       <define name="__WINESRC__" />
+       <file>spoolss_main.c</file>
+       <library>wine</library>
+       <library>winspool</library>
+       <library>kernel32</library>
+       <library>ntdll</library>
+</module>
+</group>
diff --git a/reactos/dll/win32/spoolss/spoolss.spec b/reactos/dll/win32/spoolss/spoolss.spec
new file mode 100644 (file)
index 0000000..da5ee04
--- /dev/null
@@ -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 (file)
index 0000000..cc4487c
--- /dev/null
@@ -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 <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 "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;
+}
index dbeda42..a46576f 100644 (file)
 <directory name="snmpapi">
        <xi:include href="snmpapi/snmpapi.rbuild" />
 </directory>
+<directory name="spoolss">
+       <xi:include href="spoolss/spoolss.rbuild" />
+</directory>
 <directory name="stdole2.tlb">
        <xi:include href="stdole2.tlb/stdole2.rbuild" />
 </directory>
index 864ac1c..18a8c7f 100644 (file)
@@ -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