[PRINTING] Replace all my custom marshalling code by calls to the newly implemented...
[reactos.git] / win32ss / printing / base / spoolsv / printprocessors.c
1 /*
2 * PROJECT: ReactOS Print Spooler Service
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Functions related to Print Processors
5 * COPYRIGHT: Copyright 2015-2018 Colin Finck (colin@reactos.org)
6 */
7
8 #include "precomp.h"
9 #include <marshalling/printprocessors.h>
10
11 DWORD
12 _RpcAddPrintProcessor(WINSPOOL_HANDLE pName, WCHAR* pEnvironment, WCHAR* pPathName, WCHAR* pPrintProcessorName)
13 {
14 UNIMPLEMENTED;
15 return ERROR_INVALID_FUNCTION;
16 }
17
18 DWORD
19 _RpcDeletePrintProcessor(WINSPOOL_HANDLE pName, WCHAR* pEnvironment, WCHAR* pPrintProcessorName)
20 {
21 UNIMPLEMENTED;
22 return ERROR_INVALID_FUNCTION;
23 }
24
25 DWORD
26 _RpcEnumPrintProcessorDatatypes(WINSPOOL_HANDLE pName, WCHAR* pPrintProcessorName, DWORD Level, BYTE* pDatatypes, DWORD cbBuf, DWORD* pcbNeeded, DWORD* pcReturned)
27 {
28 DWORD dwErrorCode;
29 PBYTE pDatatypesAligned;
30
31 dwErrorCode = RpcImpersonateClient(NULL);
32 if (dwErrorCode != ERROR_SUCCESS)
33 {
34 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode);
35 return dwErrorCode;
36 }
37
38 pDatatypesAligned = AlignRpcPtr(pDatatypes, &cbBuf);
39
40 if (EnumPrintProcessorDatatypesW(pName, pPrintProcessorName, Level, pDatatypesAligned, cbBuf, pcbNeeded, pcReturned))
41 {
42 // Replace absolute pointer addresses in the output by relative offsets.
43 MarshallDownStructuresArray(pDatatypesAligned, *pcReturned, DatatypesInfo1Marshalling.pInfo, DatatypesInfo1Marshalling.cbStructureSize, TRUE);
44 }
45 else
46 {
47 dwErrorCode = GetLastError();
48 }
49
50 RpcRevertToSelf();
51 UndoAlignRpcPtr(pDatatypes, pDatatypesAligned, cbBuf, pcbNeeded);
52
53 return dwErrorCode;
54 }
55
56 DWORD
57 _RpcEnumPrintProcessors(WINSPOOL_HANDLE pName, WCHAR* pEnvironment, DWORD Level, BYTE* pPrintProcessorInfo, DWORD cbBuf, DWORD* pcbNeeded, DWORD* pcReturned)
58 {
59 DWORD dwErrorCode;
60 PBYTE pPrintProcessorInfoAligned;
61
62 dwErrorCode = RpcImpersonateClient(NULL);
63 if (dwErrorCode != ERROR_SUCCESS)
64 {
65 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode);
66 return dwErrorCode;
67 }
68
69 pPrintProcessorInfoAligned = AlignRpcPtr(pPrintProcessorInfo, &cbBuf);
70
71 if (EnumPrintProcessorsW(pName, pEnvironment, Level, pPrintProcessorInfoAligned, cbBuf, pcbNeeded, pcReturned))
72 {
73 // Replace absolute pointer addresses in the output by relative offsets.
74 MarshallDownStructuresArray(pPrintProcessorInfoAligned, *pcReturned, PrintProcessorInfo1Marshalling.pInfo, PrintProcessorInfo1Marshalling.cbStructureSize, TRUE);
75 }
76 else
77 {
78 dwErrorCode = GetLastError();
79 }
80
81 RpcRevertToSelf();
82 UndoAlignRpcPtr(pPrintProcessorInfo, pPrintProcessorInfoAligned, cbBuf, pcbNeeded);
83
84 return dwErrorCode;
85 }
86
87 DWORD
88 _RpcGetPrintProcessorDirectory(WINSPOOL_HANDLE pName, WCHAR* pEnvironment, DWORD Level, BYTE* pPrintProcessorDirectory, DWORD cbBuf, DWORD* pcbNeeded)
89 {
90 DWORD dwErrorCode;
91
92 dwErrorCode = RpcImpersonateClient(NULL);
93 if (dwErrorCode != ERROR_SUCCESS)
94 {
95 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode);
96 return dwErrorCode;
97 }
98
99 if (!GetPrintProcessorDirectoryW(pName, pEnvironment, Level, pPrintProcessorDirectory, cbBuf, pcbNeeded))
100 dwErrorCode = GetLastError();
101
102 RpcRevertToSelf();
103 return dwErrorCode;
104 }