1 /*
2  * Copyright 2016 Klemens D. Morgenstern
3  * Copyright 2016, 2017 Andrey Semashev
4  *
5  * Distributed under the Boost Software License, Version 1.0.
6  * See http://www.boost.org/LICENSE_1_0.txt
7  */
8 
9 #ifndef BOOST_WINAPI_PIPES_HPP_INCLUDED_
10 #define BOOST_WINAPI_PIPES_HPP_INCLUDED_
11 
12 #include <boost/winapi/basic_types.hpp>
13 #include <boost/winapi/config.hpp>
14 #include <boost/winapi/overlapped.hpp>
15 
16 #ifdef BOOST_HAS_PRAGMA_ONCE
17 #pragma once
18 #endif
19 
20 #if BOOST_WINAPI_PARTITION_DESKTOP_SYSTEM
21 
22 #if !defined( BOOST_USE_WINDOWS_H ) && BOOST_WINAPI_PARTITION_DESKTOP && !defined( BOOST_NO_ANSI_APIS )
23 extern "C" {
24 BOOST_SYMBOL_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC CreateNamedPipeA(
25     boost::winapi::LPCSTR_ lpName,
26     boost::winapi::DWORD_ dwOpenMode,
27     boost::winapi::DWORD_ dwPipeMode,
28     boost::winapi::DWORD_ nMaxInstances,
29     boost::winapi::DWORD_ nOutBufferSize,
30     boost::winapi::DWORD_ nInBufferSize,
31     boost::winapi::DWORD_ nDefaultTimeOut,
32     _SECURITY_ATTRIBUTES *lpSecurityAttributes);
33 } // extern "C"
34 #endif // !defined( BOOST_USE_WINDOWS_H ) && BOOST_WINAPI_PARTITION_DESKTOP && !defined( BOOST_NO_ANSI_APIS )
35 
36 #if !defined( BOOST_USE_WINDOWS_H )
37 extern "C" {
38 
39 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC ImpersonateNamedPipeClient(
40     boost::winapi::HANDLE_ hNamedPipe);
41 
42 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC CreatePipe(
43     boost::winapi::PHANDLE_ hReadPipe,
44     boost::winapi::PHANDLE_ hWritePipe,
45     _SECURITY_ATTRIBUTES* lpPipeAttributes,
46     boost::winapi::DWORD_ nSize);
47 
48 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC ConnectNamedPipe(
49     boost::winapi::HANDLE_ hNamedPipe,
50     _OVERLAPPED* lpOverlapped);
51 
52 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC DisconnectNamedPipe(
53     boost::winapi::HANDLE_ hNamedPipe);
54 
55 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC SetNamedPipeHandleState(
56     boost::winapi::HANDLE_ hNamedPipe,
57     boost::winapi::LPDWORD_ lpMode,
58     boost::winapi::LPDWORD_ lpMaxCollectionCount,
59     boost::winapi::LPDWORD_ lpCollectDataTimeout);
60 
61 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC PeekNamedPipe(
62     boost::winapi::HANDLE_ hNamedPipe,
63     boost::winapi::LPVOID_ lpBuffer,
64     boost::winapi::DWORD_ nBufferSize,
65     boost::winapi::LPDWORD_ lpBytesRead,
66     boost::winapi::LPDWORD_ lpTotalBytesAvail,
67     boost::winapi::LPDWORD_ lpBytesLeftThisMessage);
68 
69 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC TransactNamedPipe(
70     boost::winapi::HANDLE_ hNamedPipe,
71     boost::winapi::LPVOID_ lpInBuffer,
72     boost::winapi::DWORD_ nInBufferSize,
73     boost::winapi::LPVOID_ lpOutBuffer,
74     boost::winapi::DWORD_ nOutBufferSize,
75     boost::winapi::LPDWORD_ lpBytesRead,
76     _OVERLAPPED* lpOverlapped);
77 
78 #if !defined( BOOST_NO_ANSI_APIS )
79 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC WaitNamedPipeA(
80     boost::winapi::LPCSTR_ lpNamedPipeName,
81     boost::winapi::DWORD_ nTimeOut);
82 #endif // !defined( BOOST_NO_ANSI_APIS )
83 
84 BOOST_SYMBOL_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC CreateNamedPipeW(
85     boost::winapi::LPCWSTR_ lpName,
86     boost::winapi::DWORD_ dwOpenMode,
87     boost::winapi::DWORD_ dwPipeMode,
88     boost::winapi::DWORD_ nMaxInstances,
89     boost::winapi::DWORD_ nOutBufferSize,
90     boost::winapi::DWORD_ nInBufferSize,
91     boost::winapi::DWORD_ nDefaultTimeOut,
92     _SECURITY_ATTRIBUTES* lpSecurityAttributes);
93 
94 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC WaitNamedPipeW(
95     boost::winapi::LPCWSTR_ lpNamedPipeName,
96     boost::winapi::DWORD_ nTimeOut);
97 
98 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
99 #if !defined( BOOST_NO_ANSI_APIS )
100 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC GetNamedPipeClientComputerNameA(
101     boost::winapi::HANDLE_ Pipe,
102     boost::winapi::LPSTR_ ClientComputerName,
103     boost::winapi::ULONG_ ClientComputerNameLength);
104 #endif // !defined( BOOST_NO_ANSI_APIS )
105 
106 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC GetNamedPipeClientComputerNameW(
107     boost::winapi::HANDLE_ Pipe,
108     boost::winapi::LPWSTR_ ClientComputerName,
109     boost::winapi::ULONG_ ClientComputerNameLength);
110 #endif
111 
112 } // extern "C"
113 #endif // !defined( BOOST_USE_WINDOWS_H )
114 
115 namespace boost {
116 namespace winapi {
117 
118 #if defined( BOOST_USE_WINDOWS_H )
119 
120 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_ACCESS_DUPLEX_ = PIPE_ACCESS_DUPLEX;
121 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_ACCESS_INBOUND_ = PIPE_ACCESS_INBOUND;
122 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_ACCESS_OUTBOUND_ = PIPE_ACCESS_OUTBOUND;
123 
124 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_TYPE_BYTE_ = PIPE_TYPE_BYTE;
125 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_TYPE_MESSAGE_ = PIPE_TYPE_MESSAGE;
126 
127 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_READMODE_BYTE_ = PIPE_READMODE_BYTE;
128 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_READMODE_MESSAGE_ = PIPE_READMODE_MESSAGE;
129 
130 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_WAIT_ = PIPE_WAIT;
131 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_NOWAIT_ = PIPE_NOWAIT;
132 
133 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_UNLIMITED_INSTANCES_ = PIPE_UNLIMITED_INSTANCES;
134 
135 BOOST_CONSTEXPR_OR_CONST DWORD_ NMPWAIT_USE_DEFAULT_WAIT_ = NMPWAIT_USE_DEFAULT_WAIT;
136 BOOST_CONSTEXPR_OR_CONST DWORD_ NMPWAIT_NOWAIT_ = NMPWAIT_NOWAIT;
137 BOOST_CONSTEXPR_OR_CONST DWORD_ NMPWAIT_WAIT_FOREVER_ = NMPWAIT_WAIT_FOREVER;
138 
139 #else // defined( BOOST_USE_WINDOWS_H )
140 
141 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_ACCESS_DUPLEX_ = 0x00000003;
142 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_ACCESS_INBOUND_ = 0x00000001;
143 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_ACCESS_OUTBOUND_ = 0x00000002;
144 
145 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_TYPE_BYTE_ = 0x00000000;
146 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_TYPE_MESSAGE_ = 0x00000004;
147 
148 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_READMODE_BYTE_ = 0x00000000;
149 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_READMODE_MESSAGE_ = 0x00000002;
150 
151 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_WAIT_ = 0x00000000;
152 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_NOWAIT_ = 0x00000001;
153 
154 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_UNLIMITED_INSTANCES_ = 255u;
155 
156 BOOST_CONSTEXPR_OR_CONST DWORD_ NMPWAIT_USE_DEFAULT_WAIT_ = 0x00000000;
157 BOOST_CONSTEXPR_OR_CONST DWORD_ NMPWAIT_NOWAIT_ = 0x00000001;
158 BOOST_CONSTEXPR_OR_CONST DWORD_ NMPWAIT_WAIT_FOREVER_ = 0xFFFFFFFF;
159 
160 #endif // defined( BOOST_USE_WINDOWS_H )
161 
162 // These constants are not defined in Windows SDK prior to 7.0A
163 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_ACCEPT_REMOTE_CLIENTS_ = 0x00000000;
164 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_REJECT_REMOTE_CLIENTS_ = 0x00000008;
165 
166 using ::ImpersonateNamedPipeClient;
167 using ::DisconnectNamedPipe;
168 using ::SetNamedPipeHandleState;
169 using ::PeekNamedPipe;
170 
171 #if !defined( BOOST_NO_ANSI_APIS )
172 using ::WaitNamedPipeA;
173 #endif
174 using ::WaitNamedPipeW;
175 
176 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
177 #if !defined( BOOST_NO_ANSI_APIS )
178 using ::GetNamedPipeClientComputerNameA;
179 #endif // !defined( BOOST_NO_ANSI_APIS )
180 using ::GetNamedPipeClientComputerNameW;
181 #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
182 
CreatePipe(PHANDLE_ hReadPipe,PHANDLE_ hWritePipe,LPSECURITY_ATTRIBUTES_ lpPipeAttributes,DWORD_ nSize)183 BOOST_FORCEINLINE BOOL_ CreatePipe(PHANDLE_ hReadPipe, PHANDLE_ hWritePipe, LPSECURITY_ATTRIBUTES_ lpPipeAttributes, DWORD_ nSize)
184 {
185     return ::CreatePipe(hReadPipe, hWritePipe, reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpPipeAttributes), nSize);
186 }
187 
ConnectNamedPipe(HANDLE_ hNamedPipe,LPOVERLAPPED_ lpOverlapped)188 BOOST_FORCEINLINE BOOL_ ConnectNamedPipe(HANDLE_ hNamedPipe, LPOVERLAPPED_ lpOverlapped)
189 {
190     return ::ConnectNamedPipe(hNamedPipe, reinterpret_cast< ::_OVERLAPPED* >(lpOverlapped));
191 }
192 
TransactNamedPipe(HANDLE_ hNamedPipe,LPVOID_ lpInBuffer,DWORD_ nInBufferSize,LPVOID_ lpOutBuffer,DWORD_ nOutBufferSize,LPDWORD_ lpBytesRead,LPOVERLAPPED_ lpOverlapped)193 BOOST_FORCEINLINE BOOL_ TransactNamedPipe(HANDLE_ hNamedPipe, LPVOID_ lpInBuffer, DWORD_ nInBufferSize, LPVOID_ lpOutBuffer, DWORD_ nOutBufferSize, LPDWORD_ lpBytesRead, LPOVERLAPPED_ lpOverlapped)
194 {
195     return ::TransactNamedPipe(hNamedPipe, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesRead, reinterpret_cast< ::_OVERLAPPED* >(lpOverlapped));
196 }
197 
198 
199 #if BOOST_WINAPI_PARTITION_DESKTOP && !defined( BOOST_NO_ANSI_APIS )
CreateNamedPipeA(LPCSTR_ lpName,DWORD_ dwOpenMode,DWORD_ dwPipeMode,DWORD_ nMaxInstances,DWORD_ nOutBufferSize,DWORD_ nInBufferSize,DWORD_ nDefaultTimeOut,LPSECURITY_ATTRIBUTES_ lpSecurityAttributes)200 BOOST_FORCEINLINE HANDLE_ CreateNamedPipeA(
201     LPCSTR_ lpName,
202     DWORD_ dwOpenMode,
203     DWORD_ dwPipeMode,
204     DWORD_ nMaxInstances,
205     DWORD_ nOutBufferSize,
206     DWORD_ nInBufferSize,
207     DWORD_ nDefaultTimeOut,
208     LPSECURITY_ATTRIBUTES_ lpSecurityAttributes)
209 {
210     return ::CreateNamedPipeA(
211         lpName,
212         dwOpenMode,
213         dwPipeMode,
214         nMaxInstances,
215         nOutBufferSize,
216         nInBufferSize,
217         nDefaultTimeOut,
218         reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes));
219 }
220 
create_named_pipe(LPCSTR_ lpName,DWORD_ dwOpenMode,DWORD_ dwPipeMode,DWORD_ nMaxInstances,DWORD_ nOutBufferSize,DWORD_ nInBufferSize,DWORD_ nDefaultTimeOut,LPSECURITY_ATTRIBUTES_ lpSecurityAttributes)221 BOOST_FORCEINLINE HANDLE_ create_named_pipe(
222     LPCSTR_ lpName,
223     DWORD_ dwOpenMode,
224     DWORD_ dwPipeMode,
225     DWORD_ nMaxInstances,
226     DWORD_ nOutBufferSize,
227     DWORD_ nInBufferSize,
228     DWORD_ nDefaultTimeOut,
229     LPSECURITY_ATTRIBUTES_ lpSecurityAttributes)
230 {
231     return ::CreateNamedPipeA(
232         lpName,
233         dwOpenMode,
234         dwPipeMode,
235         nMaxInstances,
236         nOutBufferSize,
237         nInBufferSize,
238         nDefaultTimeOut,
239         reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes));
240 }
241 #endif // BOOST_WINAPI_PARTITION_DESKTOP && !defined( BOOST_NO_ANSI_APIS )
242 
CreateNamedPipeW(LPCWSTR_ lpName,DWORD_ dwOpenMode,DWORD_ dwPipeMode,DWORD_ nMaxInstances,DWORD_ nOutBufferSize,DWORD_ nInBufferSize,DWORD_ nDefaultTimeOut,LPSECURITY_ATTRIBUTES_ lpSecurityAttributes)243 BOOST_FORCEINLINE HANDLE_ CreateNamedPipeW(
244     LPCWSTR_ lpName,
245     DWORD_ dwOpenMode,
246     DWORD_ dwPipeMode,
247     DWORD_ nMaxInstances,
248     DWORD_ nOutBufferSize,
249     DWORD_ nInBufferSize,
250     DWORD_ nDefaultTimeOut,
251     LPSECURITY_ATTRIBUTES_ lpSecurityAttributes)
252 {
253     return ::CreateNamedPipeW(
254         lpName,
255         dwOpenMode,
256         dwPipeMode,
257         nMaxInstances,
258         nOutBufferSize,
259         nInBufferSize,
260         nDefaultTimeOut,
261         reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes));
262 }
263 
create_named_pipe(LPCWSTR_ lpName,DWORD_ dwOpenMode,DWORD_ dwPipeMode,DWORD_ nMaxInstances,DWORD_ nOutBufferSize,DWORD_ nInBufferSize,DWORD_ nDefaultTimeOut,LPSECURITY_ATTRIBUTES_ lpSecurityAttributes)264 BOOST_FORCEINLINE HANDLE_ create_named_pipe(
265     LPCWSTR_ lpName,
266     DWORD_ dwOpenMode,
267     DWORD_ dwPipeMode,
268     DWORD_ nMaxInstances,
269     DWORD_ nOutBufferSize,
270     DWORD_ nInBufferSize,
271     DWORD_ nDefaultTimeOut,
272     LPSECURITY_ATTRIBUTES_ lpSecurityAttributes)
273 {
274     return ::CreateNamedPipeW(
275         lpName,
276         dwOpenMode,
277         dwPipeMode,
278         nMaxInstances,
279         nOutBufferSize,
280         nInBufferSize,
281         nDefaultTimeOut,
282         reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes));
283 }
284 
285 #if !defined( BOOST_NO_ANSI_APIS )
wait_named_pipe(LPCSTR_ lpNamedPipeName,DWORD_ nTimeOut)286 BOOST_FORCEINLINE BOOL_ wait_named_pipe(LPCSTR_ lpNamedPipeName, DWORD_ nTimeOut)
287 {
288     return ::WaitNamedPipeA(lpNamedPipeName, nTimeOut);
289 }
290 #endif //BOOST_NO_ANSI_APIS
291 
wait_named_pipe(LPCWSTR_ lpNamedPipeName,DWORD_ nTimeOut)292 BOOST_FORCEINLINE BOOL_ wait_named_pipe(LPCWSTR_ lpNamedPipeName, DWORD_ nTimeOut)
293 {
294     return ::WaitNamedPipeW(lpNamedPipeName, nTimeOut);
295 }
296 
297 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
298 
299 #if !defined( BOOST_NO_ANSI_APIS )
get_named_pipe_client_computer_name(HANDLE_ Pipe,LPSTR_ ClientComputerName,ULONG_ ClientComputerNameLength)300 BOOST_FORCEINLINE BOOL_ get_named_pipe_client_computer_name(HANDLE_ Pipe, LPSTR_ ClientComputerName, ULONG_ ClientComputerNameLength)
301 {
302     return ::GetNamedPipeClientComputerNameA(Pipe, ClientComputerName, ClientComputerNameLength);
303 }
304 #endif // !defined( BOOST_NO_ANSI_APIS )
305 
get_named_pipe_client_computer_name(HANDLE_ Pipe,LPWSTR_ ClientComputerName,ULONG_ ClientComputerNameLength)306 BOOST_FORCEINLINE BOOL_ get_named_pipe_client_computer_name(HANDLE_ Pipe, LPWSTR_ ClientComputerName, ULONG_ ClientComputerNameLength)
307 {
308     return ::GetNamedPipeClientComputerNameW(Pipe, ClientComputerName, ClientComputerNameLength);
309 }
310 
311 #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
312 
313 }
314 }
315 
316 #endif // BOOST_WINAPI_PARTITION_DESKTOP_SYSTEM
317 
318 #endif // BOOST_WINAPI_PIPES_HPP_INCLUDED_
319