6e2fbd28e0634620e7d0defe7efdee0f0e6d7565
[reactos.git] / reactos / win32ss / printing / base / spoolsv / ports.c
1 /*
2 * PROJECT: ReactOS Print Spooler Service
3 * LICENSE: GNU GPLv2 or any later version as published by the Free Software Foundation
4 * PURPOSE: Functions related to Ports
5 * COPYRIGHT: Copyright 2015-2017 Colin Finck <colin@reactos.org>
6 */
7
8 #include "precomp.h"
9
10 static void
11 _MarshallDownPortInfo(PBYTE* ppPortInfo, DWORD Level)
12 {
13 // Replace absolute pointer addresses in the output by relative offsets.
14 if (Level == 1)
15 {
16 PPORT_INFO_1W pPortInfo1 = (PPORT_INFO_1W)(*ppPortInfo);
17
18 pPortInfo1->pName = (PWSTR)((ULONG_PTR)pPortInfo1->pName - (ULONG_PTR)pPortInfo1);
19
20 *ppPortInfo += sizeof(PORT_INFO_1W);
21 }
22 else if (Level == 2)
23 {
24 PPORT_INFO_2W pPortInfo2 = (PPORT_INFO_2W)(*ppPortInfo);
25
26 pPortInfo2->pPortName = (PWSTR)((ULONG_PTR)pPortInfo2->pPortName - (ULONG_PTR)pPortInfo2);
27 pPortInfo2->pDescription = (PWSTR)((ULONG_PTR)pPortInfo2->pDescription - (ULONG_PTR)pPortInfo2);
28 pPortInfo2->pMonitorName = (PWSTR)((ULONG_PTR)pPortInfo2->pMonitorName - (ULONG_PTR)pPortInfo2);
29
30 *ppPortInfo += sizeof(PORT_INFO_2W);
31 }
32 else if (Level == 3)
33 {
34 PPORT_INFO_3W pPortInfo3 = (PPORT_INFO_3W)(*ppPortInfo);
35
36 pPortInfo3->pszStatus = (PWSTR)((ULONG_PTR)pPortInfo3->pszStatus - (ULONG_PTR)pPortInfo3);
37
38 *ppPortInfo += sizeof(PORT_INFO_3W);
39 }
40 }
41
42 DWORD
43 _RpcAddPort(WINSPOOL_HANDLE pName, ULONG_PTR hWnd, WCHAR* pMonitorName)
44 {
45 UNIMPLEMENTED;
46 return ERROR_INVALID_FUNCTION;
47 }
48
49 DWORD
50 _RpcAddPortEx(WINSPOOL_HANDLE pName, WINSPOOL_PORT_CONTAINER* pPortContainer, WINSPOOL_PORT_VAR_CONTAINER* pPortVarContainer, WCHAR* pMonitorName)
51 {
52 UNIMPLEMENTED;
53 return ERROR_INVALID_FUNCTION;
54 }
55
56 DWORD
57 _RpcConfigurePort(WINSPOOL_HANDLE pName, ULONG_PTR hWnd, WCHAR* pPortName)
58 {
59 UNIMPLEMENTED;
60 return ERROR_INVALID_FUNCTION;
61 }
62
63 DWORD
64 _RpcDeletePort(WINSPOOL_HANDLE pName, ULONG_PTR hWnd, WCHAR* pPortName)
65 {
66 UNIMPLEMENTED;
67 return ERROR_INVALID_FUNCTION;
68 }
69
70 DWORD
71 _RpcEnumPorts(WINSPOOL_HANDLE pName, DWORD Level, BYTE* pPort, DWORD cbBuf, DWORD* pcbNeeded, DWORD* pcReturned)
72 {
73 DWORD dwErrorCode;
74 PBYTE pPortAligned;
75
76 dwErrorCode = RpcImpersonateClient(NULL);
77 if (dwErrorCode != ERROR_SUCCESS)
78 {
79 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode);
80 return dwErrorCode;
81 }
82
83 pPortAligned = AlignRpcPtr(pPort, &cbBuf);
84
85 if (EnumPortsW(pName, Level, pPortAligned, cbBuf, pcbNeeded, pcReturned))
86 {
87 // Replace absolute pointer addresses in the output by relative offsets.
88 DWORD i;
89 PBYTE p = pPortAligned;
90
91 for (i = 0; i < *pcReturned; i++)
92 _MarshallDownPortInfo(&p, Level);
93 }
94 else
95 {
96 dwErrorCode = GetLastError();
97 }
98
99 RpcRevertToSelf();
100 UndoAlignRpcPtr(pPort, pPortAligned, cbBuf, pcbNeeded);
101
102 return dwErrorCode;
103 }
104
105 DWORD
106 _RpcSetPort(WINSPOOL_HANDLE pName, WCHAR* pPortName, WINSPOOL_PORT_CONTAINER* pPortContainer)
107 {
108 UNIMPLEMENTED;
109 return ERROR_INVALID_FUNCTION;
110 }