2 * PROJECT: ReactOS Print Spooler Service
3 * LICENSE: GNU GPLv2 or any later version as published by the Free Software Foundation
4 * PURPOSE: Functions for managing print jobs
5 * COPYRIGHT: Copyright 2015-2017 Colin Finck <colin@reactos.org>
11 _MarshallDownAddJobInfo(PADDJOB_INFO_1W
* ppAddJobInfo1
)
13 // Replace absolute pointer addresses in the output by relative offsets.
14 PADDJOB_INFO_1W pAddJobInfo1
= *ppAddJobInfo1
;
15 pAddJobInfo1
->Path
= (PWSTR
)((ULONG_PTR
)pAddJobInfo1
->Path
- (ULONG_PTR
)pAddJobInfo1
);
17 *ppAddJobInfo1
+= sizeof(ADDJOB_INFO_1W
);
21 _MarshallDownJobInfo(PBYTE
* ppJobInfo
, DWORD Level
)
23 // Replace absolute pointer addresses in the output by relative offsets.
26 PJOB_INFO_1W pJobInfo1
= (PJOB_INFO_1W
)(*ppJobInfo
);
28 pJobInfo1
->pDatatype
= (PWSTR
)((ULONG_PTR
)pJobInfo1
->pDatatype
- (ULONG_PTR
)pJobInfo1
);
29 pJobInfo1
->pDocument
= (PWSTR
)((ULONG_PTR
)pJobInfo1
->pDocument
- (ULONG_PTR
)pJobInfo1
);
30 pJobInfo1
->pMachineName
= (PWSTR
)((ULONG_PTR
)pJobInfo1
->pMachineName
- (ULONG_PTR
)pJobInfo1
);
31 pJobInfo1
->pPrinterName
= (PWSTR
)((ULONG_PTR
)pJobInfo1
->pPrinterName
- (ULONG_PTR
)pJobInfo1
);
33 if (pJobInfo1
->pStatus
)
34 pJobInfo1
->pStatus
= (PWSTR
)((ULONG_PTR
)pJobInfo1
->pStatus
- (ULONG_PTR
)pJobInfo1
);
36 pJobInfo1
->pUserName
= (PWSTR
)((ULONG_PTR
)pJobInfo1
->pUserName
- (ULONG_PTR
)pJobInfo1
);
38 *ppJobInfo
+= sizeof(JOB_INFO_1W
);
42 PJOB_INFO_2W pJobInfo2
= (PJOB_INFO_2W
)(*ppJobInfo
);
44 pJobInfo2
->pDatatype
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pDatatype
- (ULONG_PTR
)pJobInfo2
);
45 pJobInfo2
->pDevMode
= (PDEVMODEW
)((ULONG_PTR
)pJobInfo2
->pDevMode
- (ULONG_PTR
)pJobInfo2
);
46 pJobInfo2
->pDocument
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pDocument
- (ULONG_PTR
)pJobInfo2
);
47 pJobInfo2
->pDriverName
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pDriverName
- (ULONG_PTR
)pJobInfo2
);
48 pJobInfo2
->pMachineName
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pMachineName
- (ULONG_PTR
)pJobInfo2
);
49 pJobInfo2
->pNotifyName
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pNotifyName
- (ULONG_PTR
)pJobInfo2
);
50 pJobInfo2
->pPrinterName
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pPrinterName
- (ULONG_PTR
)pJobInfo2
);
51 pJobInfo2
->pPrintProcessor
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pPrintProcessor
- (ULONG_PTR
)pJobInfo2
);
53 if (pJobInfo2
->pParameters
)
54 pJobInfo2
->pParameters
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pParameters
- (ULONG_PTR
)pJobInfo2
);
56 if (pJobInfo2
->pStatus
)
57 pJobInfo2
->pStatus
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pStatus
- (ULONG_PTR
)pJobInfo2
);
59 pJobInfo2
->pUserName
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pUserName
- (ULONG_PTR
)pJobInfo2
);
61 *ppJobInfo
+= sizeof(JOB_INFO_2W
);
66 _RpcAddJob(WINSPOOL_PRINTER_HANDLE hPrinter
, DWORD Level
, BYTE
* pAddJob
, DWORD cbBuf
, DWORD
* pcbNeeded
)
71 dwErrorCode
= RpcImpersonateClient(NULL
);
72 if (dwErrorCode
!= ERROR_SUCCESS
)
74 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode
);
78 pAddJobAligned
= AlignRpcPtr(pAddJob
, &cbBuf
);
80 if (AddJobW(hPrinter
, Level
, pAddJobAligned
, cbBuf
, pcbNeeded
))
82 PBYTE p
= pAddJobAligned
;
84 // Replace absolute pointer addresses in the output by relative offsets.
85 _MarshallDownAddJobInfo((PADDJOB_INFO_1W
*)&p
);
89 dwErrorCode
= GetLastError();
93 UndoAlignRpcPtr(pAddJob
, pAddJobAligned
, cbBuf
, pcbNeeded
);
99 _RpcEnumJobs(WINSPOOL_PRINTER_HANDLE hPrinter
, DWORD FirstJob
, DWORD NoJobs
, DWORD Level
, BYTE
* pJob
, DWORD cbBuf
, DWORD
* pcbNeeded
, DWORD
* pcReturned
)
104 dwErrorCode
= RpcImpersonateClient(NULL
);
105 if (dwErrorCode
!= ERROR_SUCCESS
)
107 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode
);
111 pJobAligned
= AlignRpcPtr(pJob
, &cbBuf
);
113 if (EnumJobsW(hPrinter
, FirstJob
, NoJobs
, Level
, pJobAligned
, cbBuf
, pcbNeeded
, pcReturned
))
116 PBYTE p
= pJobAligned
;
118 // Replace absolute pointer addresses in the output by relative offsets.
119 for (i
= 0; i
< *pcReturned
; i
++)
120 _MarshallDownJobInfo(&p
, Level
);
124 dwErrorCode
= GetLastError();
128 UndoAlignRpcPtr(pJob
, pJobAligned
, cbBuf
, pcbNeeded
);
134 _RpcGetJob(WINSPOOL_PRINTER_HANDLE hPrinter
, DWORD JobId
, DWORD Level
, BYTE
* pJob
, DWORD cbBuf
, DWORD
* pcbNeeded
)
139 dwErrorCode
= RpcImpersonateClient(NULL
);
140 if (dwErrorCode
!= ERROR_SUCCESS
)
142 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode
);
146 pJobAligned
= AlignRpcPtr(pJob
, &cbBuf
);
148 if (GetJobW(hPrinter
, JobId
, Level
, pJobAligned
, cbBuf
, pcbNeeded
))
150 PBYTE p
= pJobAligned
;
152 // Replace absolute pointer addresses in the output by relative offsets.
153 _MarshallDownJobInfo(&p
, Level
);
157 dwErrorCode
= GetLastError();
161 UndoAlignRpcPtr(pJob
, pJobAligned
, cbBuf
, pcbNeeded
);
167 _RpcScheduleJob(WINSPOOL_PRINTER_HANDLE hPrinter
, DWORD JobId
)
171 dwErrorCode
= RpcImpersonateClient(NULL
);
172 if (dwErrorCode
!= ERROR_SUCCESS
)
174 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode
);
178 if (!ScheduleJob(hPrinter
, JobId
))
179 dwErrorCode
= GetLastError();
186 _RpcSetJob(WINSPOOL_PRINTER_HANDLE hPrinter
, DWORD JobId
, WINSPOOL_JOB_CONTAINER
* pJobContainer
, DWORD Command
)
190 dwErrorCode
= RpcImpersonateClient(NULL
);
191 if (dwErrorCode
!= ERROR_SUCCESS
)
193 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode
);
197 // pJobContainer->JobInfo is a union of pointers, so we can just convert any element to our BYTE pointer.
198 if (!SetJobW(hPrinter
, JobId
, pJobContainer
->Level
, (PBYTE
)pJobContainer
->JobInfo
.Level1
, Command
))
199 dwErrorCode
= GetLastError();