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