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