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 Colin Finck <colin@reactos.org>
11 _MarshallDownAddJobInfo(PADDJOB_INFO_1W pAddJobInfo1
)
13 // Replace absolute pointer addresses in the output by relative offsets.
14 pAddJobInfo1
->Path
= (PWSTR
)((ULONG_PTR
)pAddJobInfo1
->Path
- (ULONG_PTR
)pAddJobInfo1
);
18 _MarshallDownJobInfo(PBYTE pJobInfo
, DWORD Level
)
20 PJOB_INFO_1W pJobInfo1
;
21 PJOB_INFO_2W pJobInfo2
;
23 // Replace absolute pointer addresses in the output by relative offsets.
26 pJobInfo1
= (PJOB_INFO_1W
)pJobInfo
;
27 pJobInfo1
->pDatatype
= (PWSTR
)((ULONG_PTR
)pJobInfo1
->pDatatype
- (ULONG_PTR
)pJobInfo1
);
28 pJobInfo1
->pDocument
= (PWSTR
)((ULONG_PTR
)pJobInfo1
->pDocument
- (ULONG_PTR
)pJobInfo1
);
29 pJobInfo1
->pMachineName
= (PWSTR
)((ULONG_PTR
)pJobInfo1
->pMachineName
- (ULONG_PTR
)pJobInfo1
);
30 pJobInfo1
->pPrinterName
= (PWSTR
)((ULONG_PTR
)pJobInfo1
->pPrinterName
- (ULONG_PTR
)pJobInfo1
);
32 if (pJobInfo1
->pStatus
)
33 pJobInfo1
->pStatus
= (PWSTR
)((ULONG_PTR
)pJobInfo1
->pStatus
- (ULONG_PTR
)pJobInfo1
);
35 pJobInfo1
->pUserName
= (PWSTR
)((ULONG_PTR
)pJobInfo1
->pUserName
- (ULONG_PTR
)pJobInfo1
);
39 pJobInfo2
= (PJOB_INFO_2W
)pJobInfo
;
40 pJobInfo2
->pDatatype
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pDatatype
- (ULONG_PTR
)pJobInfo2
);
41 pJobInfo2
->pDevMode
= (PDEVMODEW
)((ULONG_PTR
)pJobInfo2
->pDevMode
- (ULONG_PTR
)pJobInfo2
);
42 pJobInfo2
->pDocument
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pDocument
- (ULONG_PTR
)pJobInfo2
);
43 pJobInfo2
->pDriverName
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pDriverName
- (ULONG_PTR
)pJobInfo2
);
44 pJobInfo2
->pMachineName
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pMachineName
- (ULONG_PTR
)pJobInfo2
);
45 pJobInfo2
->pNotifyName
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pNotifyName
- (ULONG_PTR
)pJobInfo2
);
46 pJobInfo2
->pPrinterName
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pPrinterName
- (ULONG_PTR
)pJobInfo2
);
47 pJobInfo2
->pPrintProcessor
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pPrintProcessor
- (ULONG_PTR
)pJobInfo2
);
49 if (pJobInfo2
->pParameters
)
50 pJobInfo2
->pParameters
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pParameters
- (ULONG_PTR
)pJobInfo2
);
52 if (pJobInfo2
->pStatus
)
53 pJobInfo2
->pStatus
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pStatus
- (ULONG_PTR
)pJobInfo2
);
55 pJobInfo2
->pUserName
= (PWSTR
)((ULONG_PTR
)pJobInfo2
->pUserName
- (ULONG_PTR
)pJobInfo2
);
60 _RpcAddJob(WINSPOOL_PRINTER_HANDLE hPrinter
, DWORD Level
, BYTE
* pAddJob
, DWORD cbBuf
, DWORD
* pcbNeeded
)
64 dwErrorCode
= RpcImpersonateClient(NULL
);
65 if (dwErrorCode
!= ERROR_SUCCESS
)
67 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode
);
71 AddJobW(hPrinter
, Level
, pAddJob
, cbBuf
, pcbNeeded
);
72 dwErrorCode
= GetLastError();
74 if (dwErrorCode
== ERROR_SUCCESS
)
75 _MarshallDownAddJobInfo((PADDJOB_INFO_1W
)pAddJob
);
82 _RpcEnumJobs(WINSPOOL_PRINTER_HANDLE hPrinter
, DWORD FirstJob
, DWORD NoJobs
, DWORD Level
, BYTE
* pJob
, DWORD cbBuf
, DWORD
* pcbNeeded
, DWORD
* pcReturned
)
88 dwErrorCode
= RpcImpersonateClient(NULL
);
89 if (dwErrorCode
!= ERROR_SUCCESS
)
91 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode
);
95 EnumJobsW(hPrinter
, FirstJob
, NoJobs
, Level
, pJob
, cbBuf
, pcbNeeded
, pcReturned
);
96 dwErrorCode
= GetLastError();
98 if (dwErrorCode
== ERROR_SUCCESS
)
100 // Replace absolute pointer addresses in the output by relative offsets.
101 for (i
= 0; i
< *pcReturned
; i
++)
103 _MarshallDownJobInfo(p
, Level
);
106 p
+= sizeof(JOB_INFO_1W
);
108 p
+= sizeof(JOB_INFO_2W
);
117 _RpcGetJob(WINSPOOL_PRINTER_HANDLE hPrinter
, DWORD JobId
, DWORD Level
, BYTE
* pJob
, DWORD cbBuf
, DWORD
* pcbNeeded
)
121 dwErrorCode
= RpcImpersonateClient(NULL
);
122 if (dwErrorCode
!= ERROR_SUCCESS
)
124 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode
);
128 GetJobW(hPrinter
, JobId
, Level
, pJob
, cbBuf
, pcbNeeded
);
129 dwErrorCode
= GetLastError();
131 if (dwErrorCode
== ERROR_SUCCESS
)
133 // Replace absolute pointer addresses in the output by relative offsets.
134 _MarshallDownJobInfo(pJob
, Level
);
142 _RpcScheduleJob(WINSPOOL_PRINTER_HANDLE hPrinter
, DWORD JobId
)
146 dwErrorCode
= RpcImpersonateClient(NULL
);
147 if (dwErrorCode
!= ERROR_SUCCESS
)
149 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode
);
153 ScheduleJob(hPrinter
, JobId
);
154 dwErrorCode
= GetLastError();
161 _RpcSetJob(WINSPOOL_PRINTER_HANDLE hPrinter
, DWORD JobId
, WINSPOOL_JOB_CONTAINER
* pJobContainer
, DWORD Command
)
165 dwErrorCode
= RpcImpersonateClient(NULL
);
166 if (dwErrorCode
!= ERROR_SUCCESS
)
168 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode
);
172 // pJobContainer->JobInfo is a union of pointers, so we can just convert any element to our BYTE pointer.
173 SetJobW(hPrinter
, JobId
, pJobContainer
->Level
, (PBYTE
)pJobContainer
->JobInfo
.Level1
, Command
);
174 dwErrorCode
= GetLastError();