2 * PROJECT: ReactOS Print Spooler Service
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Functions related to Ports
5 * COPYRIGHT: Copyright 2015-2017 Colin Finck (colin@reactos.org)
11 _MarshallDownPortInfo(PBYTE
* ppPortInfo
, DWORD Level
)
13 // Replace absolute pointer addresses in the output by relative offsets.
16 PPORT_INFO_1W pPortInfo1
= (PPORT_INFO_1W
)(*ppPortInfo
);
18 pPortInfo1
->pName
= (PWSTR
)((ULONG_PTR
)pPortInfo1
->pName
- (ULONG_PTR
)pPortInfo1
);
20 *ppPortInfo
+= sizeof(PORT_INFO_1W
);
24 PPORT_INFO_2W pPortInfo2
= (PPORT_INFO_2W
)(*ppPortInfo
);
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
);
30 *ppPortInfo
+= sizeof(PORT_INFO_2W
);
34 PPORT_INFO_3W pPortInfo3
= (PPORT_INFO_3W
)(*ppPortInfo
);
36 pPortInfo3
->pszStatus
= (PWSTR
)((ULONG_PTR
)pPortInfo3
->pszStatus
- (ULONG_PTR
)pPortInfo3
);
38 *ppPortInfo
+= sizeof(PORT_INFO_3W
);
43 _RpcAddPort(WINSPOOL_HANDLE pName
, ULONG_PTR hWnd
, WCHAR
* pMonitorName
)
46 return ERROR_INVALID_FUNCTION
;
50 _RpcAddPortEx(WINSPOOL_HANDLE pName
, WINSPOOL_PORT_CONTAINER
* pPortContainer
, WINSPOOL_PORT_VAR_CONTAINER
* pPortVarContainer
, WCHAR
* pMonitorName
)
53 return ERROR_INVALID_FUNCTION
;
57 _RpcConfigurePort(WINSPOOL_HANDLE pName
, ULONG_PTR hWnd
, WCHAR
* pPortName
)
60 return ERROR_INVALID_FUNCTION
;
64 _RpcDeletePort(WINSPOOL_HANDLE pName
, ULONG_PTR hWnd
, WCHAR
* pPortName
)
67 return ERROR_INVALID_FUNCTION
;
71 _RpcEnumPorts(WINSPOOL_HANDLE pName
, DWORD Level
, BYTE
* pPort
, DWORD cbBuf
, DWORD
* pcbNeeded
, DWORD
* pcReturned
)
76 dwErrorCode
= RpcImpersonateClient(NULL
);
77 if (dwErrorCode
!= ERROR_SUCCESS
)
79 ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode
);
83 pPortAligned
= AlignRpcPtr(pPort
, &cbBuf
);
85 if (EnumPortsW(pName
, Level
, pPortAligned
, cbBuf
, pcbNeeded
, pcReturned
))
87 // Replace absolute pointer addresses in the output by relative offsets.
89 PBYTE p
= pPortAligned
;
91 for (i
= 0; i
< *pcReturned
; i
++)
92 _MarshallDownPortInfo(&p
, Level
);
96 dwErrorCode
= GetLastError();
100 UndoAlignRpcPtr(pPort
, pPortAligned
, cbBuf
, pcbNeeded
);
106 _RpcSetPort(WINSPOOL_HANDLE pName
, WCHAR
* pPortName
, WINSPOOL_PORT_CONTAINER
* pPortContainer
)
109 return ERROR_INVALID_FUNCTION
;