Author: cfinck
Date: Tue May 12 14:43:25 2015
New Revision: 67693

URL: http://svn.reactos.org/svn/reactos?rev=67693&view=rev
Log:
- Add a dummy winspool.drv SpoolerInit doing an RPC call to a dummy 
RpcSpoolerInit, which itself passes the call to a dummy spoolss.dll SpoolerInit.
  This serves as an example to show how I expect most spooler functions to work.
- Implement the publicly exported and fundamental RevertToPrinterSelf and 
ImpersonatePrinterClient spoolss.dll functions.
- Fix WINSPOOL_HANDLE_bind.
- Fix build with GCC.

Added:
    
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/context.c
   (with props)
    
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/init.c
   (with props)
Modified:
    
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/CMakeLists.txt
    
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/main.c
    
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/spoolss.spec
    
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/CMakeLists.txt
    
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/precomp.h
    
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/rpcstubs.c
    
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/main.c
    
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/winspool.spec

Modified: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/CMakeLists.txt?rev=67693&r1=67692&r2=67693&view=diff
==============================================================================
--- 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/CMakeLists.txt
   [iso-8859-1] (original)
+++ 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/CMakeLists.txt
   [iso-8859-1] Tue May 12 14:43:25 2015
@@ -2,6 +2,7 @@
 spec2def(spoolss spoolss.spec ADD_IMPORTLIB)
 
 list(APPEND SOURCE
+    context.c
     main.c
     precomp.h)
 
@@ -13,6 +14,6 @@
 
 set_module_type(spoolss win32dll UNICODE)
 target_link_libraries(spoolss wine)
-add_importlibs(spoolss kernel32 msvcrt ntdll)
+add_importlibs(spoolss msvcrt kernel32 advapi32 ntdll)
 add_pch(spoolss precomp.h SOURCE)
 add_cd_file(TARGET spoolss DESTINATION reactos/system32 FOR all)

Added: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/context.c
URL: 
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/context.c?rev=67693
==============================================================================
--- 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/context.c
        (added)
+++ 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/context.c
        [iso-8859-1] Tue May 12 14:43:25 2015
@@ -0,0 +1,62 @@
+/*
+ * PROJECT:     ReactOS Spooler Router
+ * LICENSE:     GNU LGPL v2.1 or any later version as published by the Free 
Software Foundation
+ * PURPOSE:     Functions related to switching between security contexts
+ * COPYRIGHT:   Copyright 2015 Colin Finck <co...@reactos.org>
+ */
+
+#include "precomp.h"
+
+/**
+ * @see RevertToPrinterSelf
+ */
+BOOL WINAPI
+ImpersonatePrinterClient(HANDLE hToken)
+{
+    if (!hToken)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
+        return FALSE;
+    }
+
+    if (!SetThreadToken(NULL, hToken))
+    {
+        ERR("SetThreadToken failed with error %u!\n", GetLastError());
+        CloseHandle(hToken);
+        return FALSE;
+    }
+
+    CloseHandle(hToken);
+    return TRUE;
+}
+
+/**
+ * RevertToPrinterSelf reverts the security context from the current user's 
context back to the process context.
+ * As spoolss.dll is used by spoolsv.exe, this is usually the SYSTEM security 
context.
+ *
+ * Unlike the traditional ImpersonateClient and then RevertToSelf approach, we 
do it the other way round here,
+ * because spoolss.dll is delay-loaded by spoolsv.exe in the current user's 
context. Use RevertToPrinterSelf then to
+ * return to the SYSTEM context for specific tasks.
+ */
+HANDLE WINAPI
+RevertToPrinterSelf()
+{
+    HANDLE hToken;
+
+    // Retrieve our current impersonation token
+    if (!OpenThreadToken(GetCurrentThread(), TOKEN_IMPERSONATE, TRUE, &hToken))
+    {
+        ERR("OpenThreadToken failed with error %u!\n", GetLastError());
+        return NULL;
+    }
+
+    // Tell the thread to stop impersonating
+    if (!SetThreadToken(NULL, NULL))
+    {
+        ERR("SetThreadToken failed with error %u!\n", GetLastError());
+        return NULL;
+    }
+
+    // Return the token required for reverting back to impersonation in 
ImpersonatePrinterClient
+    return hToken;
+}

Propchange: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/context.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/main.c
URL: 
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/main.c?rev=67693&r1=67692&r2=67693&view=diff
==============================================================================
--- 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/main.c
   [iso-8859-1] (original)
+++ 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/main.c
   [iso-8859-1] Tue May 12 14:43:25 2015
@@ -67,6 +67,13 @@
     return 0;
 }
 
+DWORD WINAPI
+SpoolerInit()
+{
+    // Nothing to do here yet
+    return ERROR_SUCCESS;
+}
+
 BOOL WINAPI
 StartPagePrinter(HANDLE hPrinter)
 {

Modified: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/spoolss.spec
URL: 
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/spoolss.spec?rev=67693&r1=67692&r2=67693&view=diff
==============================================================================
--- 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/spoolss.spec
     [iso-8859-1] (original)
+++ 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolss/spoolss.spec
     [iso-8859-1] Tue May 12 14:43:25 2015
@@ -89,7 +89,7 @@
 @ stdcall GetPrintProcessorDirectoryW(wstr wstr long ptr long ptr)
 @ stub GetServerPolicy
 @ stub GetShrinkedSize
-@ stub ImpersonatePrinterClient
+@ stdcall ImpersonatePrinterClient(long)
 @ stdcall InitializeRouter(long)
 @ stub IsNamedPipeRpcCall
 @ stub LoadDriver
@@ -122,7 +122,7 @@
 @ stub ReplyOpenPrinter
 @ stub ReplyPrinterChangeNotification
 @ stub ResetPrinterW
-@ stub RevertToPrinterSelf
+@ stdcall RevertToPrinterSelf()
 @ stub RouterAllocBidiMem
 @ stub RouterAllocBidiResponseContainer
 @ stub RouterAllocPrinterNotifyInfo
@@ -161,7 +161,7 @@
 @ stub SpoolerFindNextPrinterChangeNotification
 @ stub SpoolerFreePrinterNotifyInfo
 @ stub SpoolerHasInitialized
-@ stub SpoolerInit
+@ stdcall SpoolerInit()
 @ stdcall StartDocPrinterW(long long ptr)
 @ stdcall StartPagePrinter(long)
 @ stub UndoAlignKMPtr

Modified: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/CMakeLists.txt?rev=67693&r1=67692&r2=67693&view=diff
==============================================================================
--- 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/CMakeLists.txt
   [iso-8859-1] (original)
+++ 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/CMakeLists.txt
   [iso-8859-1] Tue May 12 14:43:25 2015
@@ -3,6 +3,7 @@
 add_rpc_files(server ${REACTOS_SOURCE_DIR}/include/reactos/idl/winspool.idl)
 
 list(APPEND SOURCE
+    init.c
     main.c
     rpcserver.c
     rpcstubs.c
@@ -12,7 +13,7 @@
 add_executable(spoolsv ${SOURCE} spoolsv.rc)
 set_module_type(spoolsv win32cui UNICODE)
 target_link_libraries(spoolsv wine)
-add_importlibs(spoolsv advapi32 kernel32 msvcrt ntdll rpcrt4)
 add_delay_importlibs(spoolsv spoolss)
+add_importlibs(spoolsv msvcrt kernel32 advapi32 ntdll rpcrt4)
 add_pch(spoolsv precomp.h SOURCE)
 add_cd_file(TARGET spoolsv DESTINATION reactos/system32 FOR all)

Added: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/init.c
URL: 
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/init.c?rev=67693
==============================================================================
--- 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/init.c
   (added)
+++ 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/init.c
   [iso-8859-1] Tue May 12 14:43:25 2015
@@ -0,0 +1,33 @@
+/*
+ * PROJECT:     ReactOS Print Spooler Service
+ * LICENSE:     GNU GPLv2 or any later version as published by the Free 
Software Foundation
+ * PURPOSE:     Various initialization functions
+ * COPYRIGHT:   Copyright 2015 Colin Finck <co...@reactos.org>
+ */
+
+#include "precomp.h"
+
+DWORD
+_RpcSpoolerInit()
+{
+    DWORD ErrorCode;
+
+    // Call SpoolerInit in the security context of the client.
+    // This delay-loads spoolss.dll in the user context and all further calls 
to functions in spoolss.dll will be done in the user context as well.
+    ErrorCode = RpcImpersonateClient(NULL);
+    if (ErrorCode != ERROR_SUCCESS)
+    {
+        ERR("RpcImpersonateClient failed with status %u!\n", ErrorCode);
+        return ErrorCode;
+    }
+
+    ErrorCode = SpoolerInit();
+    if (ErrorCode != ERROR_SUCCESS)
+    {
+        ERR("SpoolerInit failed with status %u!\n", ErrorCode);
+        RpcRevertToSelf();
+        return ErrorCode;
+    }
+
+    return RpcRevertToSelf();
+}

Propchange: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/init.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/precomp.h
URL: 
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/precomp.h?rev=67693&r1=67692&r2=67693&view=diff
==============================================================================
--- 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/precomp.h
        [iso-8859-1] (original)
+++ 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/precomp.h
        [iso-8859-1] Tue May 12 14:43:25 2015
@@ -19,4 +19,7 @@
 // rpcserver.c
 extern DWORD WINAPI RpcThreadProc(LPVOID lpParameter);
 
+// Undocumented spoolss
+DWORD WINAPI SpoolerInit();
+
 #endif

Modified: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/rpcstubs.c
URL: 
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/rpcstubs.c?rev=67693&r1=67692&r2=67693&view=diff
==============================================================================
--- 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/rpcstubs.c
       [iso-8859-1] (original)
+++ 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/spoolsv/rpcstubs.c
       [iso-8859-1] Tue May 12 14:43:25 2015
@@ -449,13 +449,6 @@
 }
 
 DWORD
-_RpcSpoolerInit()
-{
-    UNIMPLEMENTED;
-    return ERROR_INVALID_FUNCTION;
-}
-
-DWORD
 _RpcResetPrinterEx()
 {
     UNIMPLEMENTED;

Modified: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/main.c
URL: 
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/main.c?rev=67693&r1=67692&r2=67693&view=diff
==============================================================================
--- 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/main.c
  [iso-8859-1] (original)
+++ 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/main.c
  [iso-8859-1] Tue May 12 14:43:25 2015
@@ -15,7 +15,7 @@
     RPC_STATUS Status;
 
     // Get us a string binding handle from the supplied connection information
-    Status = RpcStringBindingComposeW(NULL, L"ncacn_np", wszStringBinding, 
L"\\pipe\\spoolss", NULL, &wszStringBinding);
+    Status = RpcStringBindingComposeW(NULL, L"ncacn_np", wszName, 
L"\\pipe\\spoolss", NULL, &wszStringBinding);
     if (Status != RPC_S_OK)
     {
         ERR("RpcStringBindingComposeW failed with status %u!\n", Status);
@@ -209,8 +209,8 @@
         if (pDefault->pDevMode)
         {
             // Fixed size strings, so no additional memory needs to be 
allocated
-            MultiByteToWideChar(CP_ACP, 0, pDefault->pDevMode->dmDeviceName, 
-1, wDevMode.dmDeviceName, sizeof(wDevMode.dmDeviceName) / sizeof(WCHAR));
-            MultiByteToWideChar(CP_ACP, 0, pDefault->pDevMode->dmFormName, -1, 
wDevMode.dmFormName, sizeof(wDevMode.dmFormName) / sizeof(WCHAR));
+            MultiByteToWideChar(CP_ACP, 0, 
(LPCSTR)pDefault->pDevMode->dmDeviceName, -1, wDevMode.dmDeviceName, 
sizeof(wDevMode.dmDeviceName) / sizeof(WCHAR));
+            MultiByteToWideChar(CP_ACP, 0, 
(LPCSTR)pDefault->pDevMode->dmFormName, -1, wDevMode.dmFormName, 
sizeof(wDevMode.dmFormName) / sizeof(WCHAR));
 
             // Use CopyMemory to copy over several structure values in one step
             CopyMemory(&wDevMode.dmSpecVersion, 
&pDefault->pDevMode->dmSpecVersion, (ULONG_PTR)&wDevMode.dmCollate - 
(ULONG_PTR)&wDevMode.dmSpecVersion + sizeof(wDevMode.dmCollate));
@@ -272,6 +272,32 @@
     return ReturnValue;
 }
 
+BOOL WINAPI
+SpoolerInit()
+{
+    BOOL ReturnValue = FALSE;
+    DWORD ErrorCode;
+
+    // Nothing to initialize here yet, but pass this call to the Spool Service 
as well.
+    RpcTryExcept
+    {
+        ErrorCode = _RpcSpoolerInit();
+        if (ErrorCode)
+        {
+            ERR("_RpcSpoolerInit failed with error %u!\n", ErrorCode);
+        }
+
+        ReturnValue = (ErrorCode == ERROR_SUCCESS);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        ERR("_RpcSpoolerInit failed with exception code %u!\n", 
RpcExceptionCode());
+    }
+    RpcEndExcept;
+
+    return ReturnValue;
+}
+
 DWORD WINAPI
 StartDocPrinterW(HANDLE hPrinter, DWORD Level, LPBYTE pDocInfo)
 {

Modified: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/winspool.spec
URL: 
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/winspool.spec?rev=67693&r1=67692&r2=67693&view=diff
==============================================================================
--- 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/winspool.spec
   [iso-8859-1] (original)
+++ 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/winspool.spec
   [iso-8859-1] Tue May 12 14:43:25 2015
@@ -157,7 +157,7 @@
 @ stub SetPrinterW
 @ stub SplDriverUnloadComplete
 @ stub SpoolerDevQueryPrintW
-@ stub SpoolerInit
+@ stdcall SpoolerInit()
 @ stub SpoolerPrinterEvent
 @ stub StartDocDlgA
 @ stub StartDocDlgW


Reply via email to