1 /*
2 * PROJECT: ReactOS Print Spooler Service
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Functions for managing print jobs
5 * COPYRIGHT: Copyright 2015-2018 Colin Finck (colin@reactos.org)
6 */
7
8 #include "precomp.h"
9 #include <marshalling/jobs.h>
10
11 DWORD
_RpcAddJob(WINSPOOL_PRINTER_HANDLE hPrinter,DWORD Level,BYTE * pAddJob,DWORD cbBuf,DWORD * pcbNeeded)12 _RpcAddJob(WINSPOOL_PRINTER_HANDLE hPrinter, DWORD Level, BYTE* pAddJob, DWORD cbBuf, DWORD* pcbNeeded)
13 {
14 DWORD dwErrorCode;
15 PBYTE pAddJobAligned;
16
17 dwErrorCode = RpcImpersonateClient(NULL);
18 if (dwErrorCode != ERROR_SUCCESS)
19 {
20 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode);
21 return dwErrorCode;
22 }
23
24 pAddJobAligned = AlignRpcPtr(pAddJob, &cbBuf);
25
26 if (AddJobW(hPrinter, Level, pAddJobAligned, cbBuf, pcbNeeded))
27 {
28 // Replace absolute pointer addresses in the output by relative offsets.
29 MarshallDownStructure(pAddJobAligned, AddJobInfo1Marshalling.pInfo, AddJobInfo1Marshalling.cbStructureSize, TRUE);
30 }
31 else
32 {
33 dwErrorCode = GetLastError();
34 }
35
36 RpcRevertToSelf();
37 UndoAlignRpcPtr(pAddJob, pAddJobAligned, cbBuf, pcbNeeded);
38
39 return dwErrorCode;
40 }
41
42 DWORD
_RpcEnumJobs(WINSPOOL_PRINTER_HANDLE hPrinter,DWORD FirstJob,DWORD NoJobs,DWORD Level,BYTE * pJob,DWORD cbBuf,DWORD * pcbNeeded,DWORD * pcReturned)43 _RpcEnumJobs(WINSPOOL_PRINTER_HANDLE hPrinter, DWORD FirstJob, DWORD NoJobs, DWORD Level, BYTE* pJob, DWORD cbBuf, DWORD* pcbNeeded, DWORD* pcReturned)
44 {
45 DWORD dwErrorCode;
46 PBYTE pJobAligned;
47
48 dwErrorCode = RpcImpersonateClient(NULL);
49 if (dwErrorCode != ERROR_SUCCESS)
50 {
51 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode);
52 return dwErrorCode;
53 }
54
55 pJobAligned = AlignRpcPtr(pJob, &cbBuf);
56
57 if (EnumJobsW(hPrinter, FirstJob, NoJobs, Level, pJobAligned, cbBuf, pcbNeeded, pcReturned))
58 {
59 // Replace absolute pointer addresses in the output by relative offsets for JOB_INFO_1W and JOB_INFO_2W.
60 if (Level <= 2)
61 {
62 ASSERT(Level >= 1);
63 MarshallDownStructuresArray(pJobAligned, *pcReturned, pJobInfoMarshalling[Level]->pInfo, pJobInfoMarshalling[Level]->cbStructureSize, TRUE);
64 }
65 }
66 else
67 {
68 dwErrorCode = GetLastError();
69 }
70
71 RpcRevertToSelf();
72 UndoAlignRpcPtr(pJob, pJobAligned, cbBuf, pcbNeeded);
73
74 return dwErrorCode;
75 }
76
77 DWORD
_RpcGetJob(WINSPOOL_PRINTER_HANDLE hPrinter,DWORD JobId,DWORD Level,BYTE * pJob,DWORD cbBuf,DWORD * pcbNeeded)78 _RpcGetJob(WINSPOOL_PRINTER_HANDLE hPrinter, DWORD JobId, DWORD Level, BYTE* pJob, DWORD cbBuf, DWORD* pcbNeeded)
79 {
80 DWORD dwErrorCode;
81 PBYTE pJobAligned;
82
83 dwErrorCode = RpcImpersonateClient(NULL);
84 if (dwErrorCode != ERROR_SUCCESS)
85 {
86 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode);
87 return dwErrorCode;
88 }
89
90 pJobAligned = AlignRpcPtr(pJob, &cbBuf);
91
92 if (GetJobW(hPrinter, JobId, Level, pJobAligned, cbBuf, pcbNeeded))
93 {
94 // Replace absolute pointer addresses in the output by relative offsets.
95 ASSERT(Level >= 1 && Level <= 2);
96 MarshallDownStructure(pJobAligned, pJobInfoMarshalling[Level]->pInfo, pJobInfoMarshalling[Level]->cbStructureSize, TRUE);
97 }
98 else
99 {
100 dwErrorCode = GetLastError();
101 }
102
103 RpcRevertToSelf();
104 UndoAlignRpcPtr(pJob, pJobAligned, cbBuf, pcbNeeded);
105
106 return dwErrorCode;
107 }
108
109 DWORD
_RpcScheduleJob(WINSPOOL_PRINTER_HANDLE hPrinter,DWORD JobId)110 _RpcScheduleJob(WINSPOOL_PRINTER_HANDLE hPrinter, DWORD JobId)
111 {
112 DWORD dwErrorCode;
113
114 dwErrorCode = RpcImpersonateClient(NULL);
115 if (dwErrorCode != ERROR_SUCCESS)
116 {
117 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode);
118 return dwErrorCode;
119 }
120
121 if (!ScheduleJob(hPrinter, JobId))
122 dwErrorCode = GetLastError();
123
124 RpcRevertToSelf();
125 return dwErrorCode;
126 }
127
128 DWORD
_RpcSetJob(WINSPOOL_PRINTER_HANDLE hPrinter,DWORD JobId,WINSPOOL_JOB_CONTAINER * pJobContainer,DWORD Command)129 _RpcSetJob(WINSPOOL_PRINTER_HANDLE hPrinter, DWORD JobId, WINSPOOL_JOB_CONTAINER* pJobContainer, DWORD Command)
130 {
131 DWORD dwErrorCode;
132
133 dwErrorCode = RpcImpersonateClient(NULL);
134 if (dwErrorCode != ERROR_SUCCESS)
135 {
136 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode);
137 return dwErrorCode;
138 }
139
140 // pJobContainer->JobInfo is a union of pointers, so we can just convert any element to our BYTE pointer.
141 if (!SetJobW(hPrinter, JobId, pJobContainer->Level, (PBYTE)pJobContainer->JobInfo.Level1, Command))
142 dwErrorCode = GetLastError();
143
144 RpcRevertToSelf();
145 return dwErrorCode;
146 }
147