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 Monitors 5 * COPYRIGHT: Copyright 2015-2018 Colin Finck (colin@reactos.org) 6 */ 7 8 #include "precomp.h" 9 #include <marshalling/monitors.h> 10 11 DWORD 12 _RpcAddMonitor(WINSPOOL_HANDLE pName, WINSPOOL_MONITOR_CONTAINER* pMonitorContainer) 13 { 14 DWORD dwErrorCode; 15 16 dwErrorCode = RpcImpersonateClient(NULL); 17 if (dwErrorCode != ERROR_SUCCESS) 18 { 19 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode); 20 return dwErrorCode; 21 } 22 23 if (!AddMonitorW(pName, pMonitorContainer->Level, (PBYTE)pMonitorContainer->MonitorInfo.pMonitorInfo2)) 24 dwErrorCode = GetLastError(); 25 26 RpcRevertToSelf(); 27 return dwErrorCode; 28 } 29 30 DWORD 31 _RpcDeleteMonitor(WINSPOOL_HANDLE pName, WCHAR* pEnvironment, WCHAR* pMonitorName) 32 { 33 DWORD dwErrorCode; 34 35 dwErrorCode = RpcImpersonateClient(NULL); 36 if (dwErrorCode != ERROR_SUCCESS) 37 { 38 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode); 39 return dwErrorCode; 40 } 41 42 if (!DeleteMonitorW( pName, pEnvironment, pMonitorName )) 43 dwErrorCode = GetLastError(); 44 45 RpcRevertToSelf(); 46 return dwErrorCode; 47 } 48 49 DWORD 50 _RpcEnumMonitors(WINSPOOL_HANDLE pName, DWORD Level, BYTE* pMonitor, DWORD cbBuf, DWORD* pcbNeeded, DWORD* pcReturned) 51 { 52 DWORD dwErrorCode; 53 PBYTE pMonitorAligned; 54 55 dwErrorCode = RpcImpersonateClient(NULL); 56 if (dwErrorCode != ERROR_SUCCESS) 57 { 58 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode); 59 return dwErrorCode; 60 } 61 62 pMonitorAligned = AlignRpcPtr(pMonitor, &cbBuf); 63 64 if(EnumMonitorsW(pName, Level, pMonitorAligned, cbBuf, pcbNeeded, pcReturned)) 65 { 66 // Replace absolute pointer addresses in the output by relative offsets. 67 ASSERT(Level >= 1 && Level <= 2); 68 MarshallDownStructuresArray(pMonitorAligned, *pcReturned, pMonitorInfoMarshalling[Level]->pInfo, pMonitorInfoMarshalling[Level]->cbStructureSize, TRUE); 69 } 70 else 71 { 72 dwErrorCode = GetLastError(); 73 } 74 75 RpcRevertToSelf(); 76 UndoAlignRpcPtr(pMonitor, pMonitorAligned, cbBuf, pcbNeeded); 77 78 return dwErrorCode; 79 } 80