2 * Copyright 2016 Klemens D. Morgenstern
3 * Copyright 2016, 2017 Andrey Semashev
5 * Distributed under the Boost Software License, Version 1.0.
6 * See http://www.boost.org/LICENSE_1_0.txt
9 #ifndef BOOST_WINAPI_PIPES_HPP_INCLUDED_
10 #define BOOST_WINAPI_PIPES_HPP_INCLUDED_
12 #include <boost/winapi/basic_types.hpp>
13 #include <boost/winapi/config.hpp>
14 #include <boost/winapi/overlapped.hpp>
16 #ifdef BOOST_HAS_PRAGMA_ONCE
20 #if BOOST_WINAPI_PARTITION_DESKTOP_SYSTEM
22 #if !defined( BOOST_USE_WINDOWS_H ) && BOOST_WINAPI_PARTITION_DESKTOP && !defined( BOOST_NO_ANSI_APIS )
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);
34 #endif // !defined( BOOST_USE_WINDOWS_H ) && BOOST_WINAPI_PARTITION_DESKTOP && !defined( BOOST_NO_ANSI_APIS )
36 #if !defined( BOOST_USE_WINDOWS_H )
39 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC ImpersonateNamedPipeClient(
40 boost::winapi::HANDLE_ hNamedPipe);
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);
48 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC ConnectNamedPipe(
49 boost::winapi::HANDLE_ hNamedPipe,
50 _OVERLAPPED* lpOverlapped);
52 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC DisconnectNamedPipe(
53 boost::winapi::HANDLE_ hNamedPipe);
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);
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);
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);
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 )
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);
94 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC WaitNamedPipeW(
95 boost::winapi::LPCWSTR_ lpNamedPipeName,
96 boost::winapi::DWORD_ nTimeOut);
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 )
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);
113 #endif // !defined( BOOST_USE_WINDOWS_H )
118 #if defined( BOOST_USE_WINDOWS_H )
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;
124 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_TYPE_BYTE_ = PIPE_TYPE_BYTE;
125 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_TYPE_MESSAGE_ = PIPE_TYPE_MESSAGE;
127 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_READMODE_BYTE_ = PIPE_READMODE_BYTE;
128 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_READMODE_MESSAGE_ = PIPE_READMODE_MESSAGE;
130 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_WAIT_ = PIPE_WAIT;
131 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_NOWAIT_ = PIPE_NOWAIT;
133 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_UNLIMITED_INSTANCES_ = PIPE_UNLIMITED_INSTANCES;
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;
139 #else // defined( BOOST_USE_WINDOWS_H )
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;
145 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_TYPE_BYTE_ = 0x00000000;
146 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_TYPE_MESSAGE_ = 0x00000004;
148 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_READMODE_BYTE_ = 0x00000000;
149 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_READMODE_MESSAGE_ = 0x00000002;
151 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_WAIT_ = 0x00000000;
152 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_NOWAIT_ = 0x00000001;
154 BOOST_CONSTEXPR_OR_CONST DWORD_ PIPE_UNLIMITED_INSTANCES_ = 255u;
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;
160 #endif // defined( BOOST_USE_WINDOWS_H )
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;
166 using ::ImpersonateNamedPipeClient;
167 using ::DisconnectNamedPipe;
168 using ::SetNamedPipeHandleState;
169 using ::PeekNamedPipe;
171 #if !defined( BOOST_NO_ANSI_APIS )
172 using ::WaitNamedPipeA;
174 using ::WaitNamedPipeW;
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
183 BOOST_FORCEINLINE BOOL_ CreatePipe(PHANDLE_ hReadPipe, PHANDLE_ hWritePipe, LPSECURITY_ATTRIBUTES_ lpPipeAttributes, DWORD_ nSize)
185 return ::CreatePipe(hReadPipe, hWritePipe, reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpPipeAttributes), nSize);
188 BOOST_FORCEINLINE BOOL_ ConnectNamedPipe(HANDLE_ hNamedPipe, LPOVERLAPPED_ lpOverlapped)
190 return ::ConnectNamedPipe(hNamedPipe, reinterpret_cast< ::_OVERLAPPED* >(lpOverlapped));
193 BOOST_FORCEINLINE BOOL_ TransactNamedPipe(HANDLE_ hNamedPipe, LPVOID_ lpInBuffer, DWORD_ nInBufferSize, LPVOID_ lpOutBuffer, DWORD_ nOutBufferSize, LPDWORD_ lpBytesRead, LPOVERLAPPED_ lpOverlapped)
195 return ::TransactNamedPipe(hNamedPipe, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesRead, reinterpret_cast< ::_OVERLAPPED* >(lpOverlapped));
199 #if BOOST_WINAPI_PARTITION_DESKTOP && !defined( BOOST_NO_ANSI_APIS )
200 BOOST_FORCEINLINE HANDLE_ CreateNamedPipeA(
204 DWORD_ nMaxInstances,
205 DWORD_ nOutBufferSize,
206 DWORD_ nInBufferSize,
207 DWORD_ nDefaultTimeOut,
208 LPSECURITY_ATTRIBUTES_ lpSecurityAttributes)
210 return ::CreateNamedPipeA(
218 reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes));
221 BOOST_FORCEINLINE HANDLE_ create_named_pipe(
225 DWORD_ nMaxInstances,
226 DWORD_ nOutBufferSize,
227 DWORD_ nInBufferSize,
228 DWORD_ nDefaultTimeOut,
229 LPSECURITY_ATTRIBUTES_ lpSecurityAttributes)
231 return ::CreateNamedPipeA(
239 reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes));
241 #endif // BOOST_WINAPI_PARTITION_DESKTOP && !defined( BOOST_NO_ANSI_APIS )
243 BOOST_FORCEINLINE HANDLE_ CreateNamedPipeW(
247 DWORD_ nMaxInstances,
248 DWORD_ nOutBufferSize,
249 DWORD_ nInBufferSize,
250 DWORD_ nDefaultTimeOut,
251 LPSECURITY_ATTRIBUTES_ lpSecurityAttributes)
253 return ::CreateNamedPipeW(
261 reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes));
264 BOOST_FORCEINLINE HANDLE_ create_named_pipe(
268 DWORD_ nMaxInstances,
269 DWORD_ nOutBufferSize,
270 DWORD_ nInBufferSize,
271 DWORD_ nDefaultTimeOut,
272 LPSECURITY_ATTRIBUTES_ lpSecurityAttributes)
274 return ::CreateNamedPipeW(
282 reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes));
285 #if !defined( BOOST_NO_ANSI_APIS )
286 BOOST_FORCEINLINE BOOL_ wait_named_pipe(LPCSTR_ lpNamedPipeName, DWORD_ nTimeOut)
288 return ::WaitNamedPipeA(lpNamedPipeName, nTimeOut);
290 #endif //BOOST_NO_ANSI_APIS
292 BOOST_FORCEINLINE BOOL_ wait_named_pipe(LPCWSTR_ lpNamedPipeName, DWORD_ nTimeOut)
294 return ::WaitNamedPipeW(lpNamedPipeName, nTimeOut);
297 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
299 #if !defined( BOOST_NO_ANSI_APIS )
300 BOOST_FORCEINLINE BOOL_ get_named_pipe_client_computer_name(HANDLE_ Pipe, LPSTR_ ClientComputerName, ULONG_ ClientComputerNameLength)
302 return ::GetNamedPipeClientComputerNameA(Pipe, ClientComputerName, ClientComputerNameLength);
304 #endif // !defined( BOOST_NO_ANSI_APIS )
306 BOOST_FORCEINLINE BOOL_ get_named_pipe_client_computer_name(HANDLE_ Pipe, LPWSTR_ ClientComputerName, ULONG_ ClientComputerNameLength)
308 return ::GetNamedPipeClientComputerNameW(Pipe, ClientComputerName, ClientComputerNameLength);
311 #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
316 #endif // BOOST_WINAPI_PARTITION_DESKTOP_SYSTEM
318 #endif // BOOST_WINAPI_PIPES_HPP_INCLUDED_