X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fwin32ss%2Fprinting%2Fbase%2Fwinspool%2Fjobs.c;h=890bab9481c870a37ebf4e70f37082739fb93465;hp=44425a2d1be37b57a15a9429bfbda6e12b80a3d3;hb=03bc6a133ee88ed1aac9e31d6ef016423abe2080;hpb=5df5a009e20968dbca3fc8083af9a41cabcf4d0a diff --git a/reactos/win32ss/printing/base/winspool/jobs.c b/reactos/win32ss/printing/base/winspool/jobs.c index 44425a2d1be..890bab9481c 100644 --- a/reactos/win32ss/printing/base/winspool/jobs.c +++ b/reactos/win32ss/printing/base/winspool/jobs.c @@ -7,54 +7,191 @@ #include "precomp.h" +static void +_MarshallUpJobInfo(PBYTE pJobInfo, DWORD Level) +{ + PJOB_INFO_1W pJobInfo1; + PJOB_INFO_2W pJobInfo2; + + // Replace absolute pointer addresses in the output by relative offsets. + if (Level == 1) + { + pJobInfo1 = (PJOB_INFO_1W)pJobInfo; + pJobInfo1->pDatatype = (PWSTR)((ULONG_PTR)pJobInfo1->pDatatype + (ULONG_PTR)pJobInfo1); + pJobInfo1->pDocument = (PWSTR)((ULONG_PTR)pJobInfo1->pDocument + (ULONG_PTR)pJobInfo1); + pJobInfo1->pMachineName = (PWSTR)((ULONG_PTR)pJobInfo1->pMachineName + (ULONG_PTR)pJobInfo1); + pJobInfo1->pPrinterName = (PWSTR)((ULONG_PTR)pJobInfo1->pPrinterName + (ULONG_PTR)pJobInfo1); + + if (pJobInfo1->pStatus) + pJobInfo1->pStatus = (PWSTR)((ULONG_PTR)pJobInfo1->pStatus + (ULONG_PTR)pJobInfo1); + + pJobInfo1->pUserName = (PWSTR)((ULONG_PTR)pJobInfo1->pUserName + (ULONG_PTR)pJobInfo1); + } + else if (Level == 2) + { + pJobInfo2 = (PJOB_INFO_2W)pJobInfo; + pJobInfo2->pDatatype = (PWSTR)((ULONG_PTR)pJobInfo2->pDatatype + (ULONG_PTR)pJobInfo2); + pJobInfo2->pDevMode = (PDEVMODEW)((ULONG_PTR)pJobInfo2->pDevMode + (ULONG_PTR)pJobInfo2); + pJobInfo2->pDocument = (PWSTR)((ULONG_PTR)pJobInfo2->pDocument + (ULONG_PTR)pJobInfo2); + pJobInfo2->pDriverName = (PWSTR)((ULONG_PTR)pJobInfo2->pDriverName + (ULONG_PTR)pJobInfo2); + pJobInfo2->pMachineName = (PWSTR)((ULONG_PTR)pJobInfo2->pMachineName + (ULONG_PTR)pJobInfo2); + pJobInfo2->pNotifyName = (PWSTR)((ULONG_PTR)pJobInfo2->pNotifyName + (ULONG_PTR)pJobInfo2); + pJobInfo2->pPrinterName = (PWSTR)((ULONG_PTR)pJobInfo2->pPrinterName + (ULONG_PTR)pJobInfo2); + pJobInfo2->pPrintProcessor = (PWSTR)((ULONG_PTR)pJobInfo2->pPrintProcessor + (ULONG_PTR)pJobInfo2); + + if (pJobInfo2->pParameters) + pJobInfo2->pParameters = (PWSTR)((ULONG_PTR)pJobInfo2->pParameters + (ULONG_PTR)pJobInfo2); + + if (pJobInfo2->pStatus) + pJobInfo2->pStatus = (PWSTR)((ULONG_PTR)pJobInfo2->pStatus + (ULONG_PTR)pJobInfo2); + + pJobInfo2->pUserName = (PWSTR)((ULONG_PTR)pJobInfo2->pUserName + (ULONG_PTR)pJobInfo2); + } +} + BOOL WINAPI -AddJob(HANDLE hPrinter, DWORD Level, LPBYTE pData, DWORD cbBuf, LPDWORD pcbNeeded) +AddJobA(HANDLE hPrinter, DWORD Level, PBYTE pData, DWORD cbBuf, PDWORD pcbNeeded) +{ + UNIMPLEMENTED; + return FALSE; +} + +BOOL WINAPI +AddJobW(HANDLE hPrinter, DWORD Level, PBYTE pData, DWORD cbBuf, PDWORD pcbNeeded) { - BOOL bReturnValue = FALSE; DWORD dwErrorCode; + PADDJOB_INFO_1W pAddJobInfo1; // Do the RPC call RpcTryExcept { dwErrorCode = _RpcAddJob(hPrinter, Level, pData, cbBuf, pcbNeeded); - if (dwErrorCode) - { - ERR("_RpcAddJob failed with error %lu!\n", dwErrorCode); - } - - bReturnValue = (dwErrorCode == ERROR_SUCCESS); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { - ERR("_RpcAddJob failed with exception code %lu!\n", RpcExceptionCode()); + dwErrorCode = RpcExceptionCode(); + ERR("_RpcAddJob failed with exception code %lu!\n", dwErrorCode); } RpcEndExcept; - return bReturnValue; + if (dwErrorCode == ERROR_SUCCESS) + { + // Replace relative offset addresses in the output by absolute pointers. + pAddJobInfo1 = (PADDJOB_INFO_1W)pData; + pAddJobInfo1->Path = (PWSTR)((ULONG_PTR)pAddJobInfo1->Path + (ULONG_PTR)pAddJobInfo1); + } + + SetLastError(dwErrorCode); + return (dwErrorCode == ERROR_SUCCESS); } BOOL WINAPI -GetJob(HANDLE hPrinter, DWORD JobId, DWORD Level, LPBYTE pJob, DWORD cbBuf, LPDWORD pcbNeeded) +EnumJobsA(HANDLE hPrinter, DWORD FirstJob, DWORD NoJobs, DWORD Level, PBYTE pJob, DWORD cbBuf, PDWORD pcbNeeded, PDWORD pcReturned) +{ + UNIMPLEMENTED; + return FALSE; +} + +BOOL WINAPI +EnumJobsW(HANDLE hPrinter, DWORD FirstJob, DWORD NoJobs, DWORD Level, PBYTE pJob, DWORD cbBuf, PDWORD pcbNeeded, PDWORD pcReturned) { - BOOL bReturnValue = FALSE; DWORD dwErrorCode; + DWORD i; + PBYTE p = pJob; // Do the RPC call RpcTryExcept { - dwErrorCode = _RpcGetJob(hPrinter, JobId, Level, pJob, cbBuf, pcbNeeded); - if (dwErrorCode) + dwErrorCode = _RpcEnumJobs(hPrinter, FirstJob, NoJobs, Level, pJob, cbBuf, pcbNeeded, pcReturned); + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + dwErrorCode = RpcExceptionCode(); + ERR("_RpcEnumJobs failed with exception code %lu!\n", dwErrorCode); + } + RpcEndExcept; + + if (dwErrorCode == ERROR_SUCCESS) + { + // Replace relative offset addresses in the output by absolute pointers. + for (i = 0; i < *pcReturned; i++) { - ERR("_RpcGetJob failed with error %lu!\n", dwErrorCode); + _MarshallUpJobInfo(p, Level); + + if (Level == 1) + p += sizeof(JOB_INFO_1W); + else if (Level == 2) + p += sizeof(JOB_INFO_2W); } + } - bReturnValue = (dwErrorCode == ERROR_SUCCESS); + SetLastError(dwErrorCode); + return (dwErrorCode == ERROR_SUCCESS); +} + +BOOL WINAPI +GetJobA(HANDLE hPrinter, DWORD JobId, DWORD Level, PBYTE pJob, DWORD cbBuf, PDWORD pcbNeeded) +{ + UNIMPLEMENTED; + return FALSE; +} + +BOOL WINAPI +GetJobW(HANDLE hPrinter, DWORD JobId, DWORD Level, PBYTE pJob, DWORD cbBuf, PDWORD pcbNeeded) +{ + DWORD dwErrorCode; + + // Do the RPC call + RpcTryExcept + { + dwErrorCode = _RpcGetJob(hPrinter, JobId, Level, pJob, cbBuf, pcbNeeded); + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + dwErrorCode = RpcExceptionCode(); + ERR("_RpcGetJob failed with exception code %lu!\n", dwErrorCode); + } + RpcEndExcept; + + if (dwErrorCode == ERROR_SUCCESS) + { + // Replace relative offset addresses in the output by absolute pointers. + _MarshallUpJobInfo(pJob, Level); + } + + SetLastError(dwErrorCode); + return (dwErrorCode == ERROR_SUCCESS); +} + +BOOL WINAPI +SetJobA(HANDLE hPrinter, DWORD JobId, DWORD Level, PBYTE pJobInfo, DWORD Command) +{ + UNIMPLEMENTED; + return FALSE; +} + +BOOL WINAPI +SetJobW(HANDLE hPrinter, DWORD JobId, DWORD Level, PBYTE pJobInfo, DWORD Command) +{ + DWORD dwErrorCode; + WINSPOOL_JOB_CONTAINER JobContainer; + + // pJobContainer->JobInfo is a union of pointers, so we can just set any element to our BYTE pointer. + JobContainer.Level = Level; + JobContainer.JobInfo.Level1 = (WINSPOOL_JOB_INFO_1*)pJobInfo; + + // Do the RPC call + RpcTryExcept + { + dwErrorCode = _RpcSetJob(hPrinter, JobId, &JobContainer, Command); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { - ERR("_RpcGetJob failed with exception code %lu!\n", RpcExceptionCode()); + dwErrorCode = RpcExceptionCode(); + ERR("_RpcSetJob failed with exception code %lu!\n", dwErrorCode); } RpcEndExcept; - return bReturnValue; + SetLastError(dwErrorCode); + return (dwErrorCode == ERROR_SUCCESS); }