Sync with trunk r63793.
[reactos.git] / dll / win32 / msafd / msafd.h
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Ancillary Function Driver DLL
4 * FILE: include/msafd.h
5 * PURPOSE: Ancillary Function Driver DLL header
6 */
7
8 #ifndef __MSAFD_H
9 #define __MSAFD_H
10
11 #include <stdarg.h>
12
13 #define WIN32_NO_STATUS
14 #define _INC_WINDOWS
15 #define COM_NO_WINDOWS_H
16
17 #include <windef.h>
18 #include <winbase.h>
19 #include <ws2spi.h>
20 #define NTOS_MODE_USER
21 #include <ndk/exfuncs.h>
22 #include <ndk/iofuncs.h>
23 #include <ndk/obfuncs.h>
24 #include <ndk/rtlfuncs.h>
25
26 /* This includes ntsecapi.h so it needs to come after the NDK */
27 #include <wsahelp.h>
28 #include <tdi.h>
29 #include <afd/shared.h>
30 #include <helpers.h>
31
32 #include <debug.h>
33
34 extern HANDLE GlobalHeap;
35 extern WSPUPCALLTABLE Upcalls;
36 extern LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest;
37 extern LIST_ENTRY SockHelpersListHead;
38 extern HANDLE SockEvent;
39 extern HANDLE SockAsyncCompletionPort;
40 extern BOOLEAN SockAsyncSelectCalled;
41
42 typedef enum _SOCKET_STATE {
43 SocketOpen,
44 SocketBound,
45 SocketBoundUdp,
46 SocketConnected,
47 SocketClosed
48 } SOCKET_STATE, *PSOCKET_STATE;
49
50 typedef struct _SOCK_SHARED_INFO {
51 SOCKET_STATE State;
52 INT AddressFamily;
53 INT SocketType;
54 INT Protocol;
55 INT SizeOfLocalAddress;
56 INT SizeOfRemoteAddress;
57 struct linger LingerData;
58 ULONG SendTimeout;
59 ULONG RecvTimeout;
60 ULONG SizeOfRecvBuffer;
61 ULONG SizeOfSendBuffer;
62 struct {
63 BOOLEAN Listening:1;
64 BOOLEAN Broadcast:1;
65 BOOLEAN Debug:1;
66 BOOLEAN OobInline:1;
67 BOOLEAN ReuseAddresses:1;
68 BOOLEAN ExclusiveAddressUse:1;
69 BOOLEAN NonBlocking:1;
70 BOOLEAN DontUseWildcard:1;
71 BOOLEAN ReceiveShutdown:1;
72 BOOLEAN SendShutdown:1;
73 BOOLEAN UseDelayedAcceptance:1;
74 BOOLEAN UseSAN:1;
75 }; // Flags
76 DWORD CreateFlags;
77 DWORD CatalogEntryId;
78 DWORD ServiceFlags1;
79 DWORD ProviderFlags;
80 GROUP GroupID;
81 DWORD GroupType;
82 INT GroupPriority;
83 INT SocketLastError;
84 HWND hWnd;
85 LONG Unknown;
86 DWORD SequenceNumber;
87 UINT wMsg;
88 LONG AsyncEvents;
89 LONG AsyncDisabledEvents;
90 } SOCK_SHARED_INFO, *PSOCK_SHARED_INFO;
91
92 typedef struct _SOCKET_INFORMATION {
93 ULONG RefCount;
94 SOCKET Handle;
95 SOCK_SHARED_INFO SharedData;
96 DWORD HelperEvents;
97 PHELPER_DATA HelperData;
98 PVOID HelperContext;
99 PSOCKADDR LocalAddress;
100 PSOCKADDR RemoteAddress;
101 HANDLE TdiAddressHandle;
102 HANDLE TdiConnectionHandle;
103 PVOID AsyncData;
104 HANDLE EventObject;
105 LONG NetworkEvents;
106 CRITICAL_SECTION Lock;
107 PVOID SanData;
108 BOOL TrySAN;
109 SOCKADDR WSLocalAddress;
110 SOCKADDR WSRemoteAddress;
111 struct _SOCKET_INFORMATION *NextSocket;
112 } SOCKET_INFORMATION, *PSOCKET_INFORMATION;
113
114
115 typedef struct _SOCKET_CONTEXT {
116 SOCK_SHARED_INFO SharedData;
117 ULONG SizeOfHelperData;
118 ULONG Padding;
119 SOCKADDR LocalAddress;
120 SOCKADDR RemoteAddress;
121 /* Plus Helper Data */
122 } SOCKET_CONTEXT, *PSOCKET_CONTEXT;
123
124 typedef struct _ASYNC_DATA {
125 PSOCKET_INFORMATION ParentSocket;
126 DWORD SequenceNumber;
127 IO_STATUS_BLOCK IoStatusBlock;
128 AFD_POLL_INFO AsyncSelectInfo;
129 } ASYNC_DATA, *PASYNC_DATA;
130
131 SOCKET
132 WSPAPI
133 WSPAccept(
134 IN SOCKET s,
135 OUT LPSOCKADDR addr,
136 IN OUT LPINT addrlen,
137 IN LPCONDITIONPROC lpfnCondition,
138 IN DWORD dwCallbackData,
139 OUT LPINT lpErrno);
140
141 INT
142 WSPAPI
143 WSPAddressToString(
144 IN LPSOCKADDR lpsaAddress,
145 IN DWORD dwAddressLength,
146 IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
147 OUT LPWSTR lpszAddressString,
148 IN OUT LPDWORD lpdwAddressStringLength,
149 OUT LPINT lpErrno);
150
151 INT
152 WSPAPI
153 WSPAsyncSelect(
154 IN SOCKET s,
155 IN HWND hWnd,
156 IN UINT wMsg,
157 IN LONG lEvent,
158 OUT LPINT lpErrno);
159
160 INT
161 WSPAPI WSPBind(
162 IN SOCKET s,
163 IN CONST SOCKADDR *name,
164 IN INT namelen,
165 OUT LPINT lpErrno);
166
167 INT
168 WSPAPI
169 WSPCancelBlockingCall(
170 OUT LPINT lpErrno);
171
172 INT
173 WSPAPI
174 WSPCleanup(
175 OUT LPINT lpErrno);
176
177 INT
178 WSPAPI
179 WSPCloseSocket(
180 IN SOCKET s,
181 OUT LPINT lpErrno);
182
183 INT
184 WSPAPI
185 WSPConnect(
186 IN SOCKET s,
187 IN CONST SOCKADDR *name,
188 IN INT namelen,
189 IN LPWSABUF lpCallerData,
190 OUT LPWSABUF lpCalleeData,
191 IN LPQOS lpSQOS,
192 IN LPQOS lpGQOS,
193 OUT LPINT lpErrno);
194
195 INT
196 WSPAPI
197 WSPDuplicateSocket(
198 IN SOCKET s,
199 IN DWORD dwProcessId,
200 OUT LPWSAPROTOCOL_INFOW lpProtocolInfo,
201 OUT LPINT lpErrno);
202
203 INT
204 WSPAPI
205 WSPEnumNetworkEvents(
206 IN SOCKET s,
207 IN WSAEVENT hEventObject,
208 OUT LPWSANETWORKEVENTS lpNetworkEvents,
209 OUT LPINT lpErrno);
210
211 INT
212 WSPAPI
213 WSPEventSelect(
214 IN SOCKET s,
215 IN WSAEVENT hEventObject,
216 IN LONG lNetworkEvents,
217 OUT LPINT lpErrno);
218
219 BOOL
220 WSPAPI
221 WSPGetOverlappedResult(
222 IN SOCKET s,
223 IN LPWSAOVERLAPPED lpOverlapped,
224 OUT LPDWORD lpcbTransfer,
225 IN BOOL fWait,
226 OUT LPDWORD lpdwFlags,
227 OUT LPINT lpErrno);
228
229 INT
230 WSPAPI
231 WSPGetPeerName(
232 IN SOCKET s,
233 OUT LPSOCKADDR name,
234 IN OUT LPINT namelen,
235 OUT LPINT lpErrno);
236
237 BOOL
238 WSPAPI
239 WSPGetQOSByName(
240 IN SOCKET s,
241 IN OUT LPWSABUF lpQOSName,
242 OUT LPQOS lpQOS,
243 OUT LPINT lpErrno);
244
245 INT
246 WSPAPI
247 WSPGetSockName(
248 IN SOCKET s,
249 OUT LPSOCKADDR name,
250 IN OUT LPINT namelen,
251 OUT LPINT lpErrno);
252
253 INT
254 WSPAPI
255 WSPGetSockOpt(
256 IN SOCKET s,
257 IN INT level,
258 IN INT optname,
259 OUT CHAR FAR* optval,
260 IN OUT LPINT optlen,
261 OUT LPINT lpErrno);
262
263 INT
264 WSPAPI
265 WSPIoctl(
266 IN SOCKET s,
267 IN DWORD dwIoControlCode,
268 IN LPVOID lpvInBuffer,
269 IN DWORD cbInBuffer,
270 OUT LPVOID lpvOutBuffer,
271 IN DWORD cbOutBuffer,
272 OUT LPDWORD lpcbBytesReturned,
273 IN LPWSAOVERLAPPED lpOverlapped,
274 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
275 IN LPWSATHREADID lpThreadId,
276 OUT LPINT lpErrno);
277
278 SOCKET
279 WSPAPI
280 WSPJoinLeaf(
281 IN SOCKET s,
282 IN CONST SOCKADDR *name,
283 IN INT namelen,
284 IN LPWSABUF lpCallerData,
285 OUT LPWSABUF lpCalleeData,
286 IN LPQOS lpSQOS,
287 IN LPQOS lpGQOS,
288 IN DWORD dwFlags,
289 OUT LPINT lpErrno);
290
291 INT
292 WSPAPI
293 WSPListen(
294 IN SOCKET s,
295 IN INT backlog,
296 OUT LPINT lpErrno);
297
298 INT
299 WSPAPI
300 WSPRecv(
301 IN SOCKET s,
302 IN OUT LPWSABUF lpBuffers,
303 IN DWORD dwBufferCount,
304 OUT LPDWORD lpNumberOfBytesRecvd,
305 IN OUT LPDWORD lpFlags,
306 IN LPWSAOVERLAPPED lpOverlapped,
307 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
308 IN LPWSATHREADID lpThreadId,
309 OUT LPINT lpErrno);
310
311 INT
312 WSPAPI
313 WSPRecvDisconnect(
314 IN SOCKET s,
315 OUT LPWSABUF lpInboundDisconnectData,
316 OUT LPINT lpErrno);
317
318 INT
319 WSPAPI
320 WSPRecvFrom(
321 IN SOCKET s,
322 IN OUT LPWSABUF lpBuffers,
323 IN DWORD dwBufferCount,
324 OUT LPDWORD lpNumberOfBytesRecvd,
325 IN OUT LPDWORD lpFlags,
326 OUT LPSOCKADDR lpFrom,
327 IN OUT LPINT lpFromlen,
328 IN LPWSAOVERLAPPED lpOverlapped,
329 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
330 IN LPWSATHREADID lpThreadId,
331 OUT LPINT lpErrno);
332
333 INT
334 WSPAPI
335 WSPSelect(
336 IN INT nfds,
337 IN OUT fd_set *readfds,
338 IN OUT fd_set *writefds,
339 IN OUT fd_set *exceptfds,
340 IN CONST struct timeval *timeout,
341 OUT LPINT lpErrno);
342
343 INT
344 WSPAPI
345 WSPSend(
346 IN SOCKET s,
347 IN LPWSABUF lpBuffers,
348 IN DWORD dwBufferCount,
349 OUT LPDWORD lpNumberOfBytesSent,
350 IN DWORD dwFlags,
351 IN LPWSAOVERLAPPED lpOverlapped,
352 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
353 IN LPWSATHREADID lpThreadId,
354 OUT LPINT lpErrno);
355
356 INT
357 WSPAPI
358 WSPSendDisconnect(
359 IN SOCKET s,
360 IN LPWSABUF lpOutboundDisconnectData,
361 OUT LPINT lpErrno);
362
363 INT
364 WSPAPI
365 WSPSendTo(
366 IN SOCKET s,
367 IN LPWSABUF lpBuffers,
368 IN DWORD dwBufferCount,
369 OUT LPDWORD lpNumberOfBytesSent,
370 IN DWORD dwFlags,
371 IN CONST SOCKADDR *lpTo,
372 IN INT iTolen,
373 IN LPWSAOVERLAPPED lpOverlapped,
374 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
375 IN LPWSATHREADID lpThreadId,
376 OUT LPINT lpErrno);
377
378 INT
379 WSPAPI
380 WSPSetSockOpt(
381 IN SOCKET s,
382 IN INT level,
383 IN INT optname,
384 IN CONST CHAR FAR* optval,
385 IN INT optlen,
386 OUT LPINT lpErrno);
387
388 INT
389 WSPAPI
390 WSPShutdown(
391 IN SOCKET s,
392 IN INT how,
393 OUT LPINT lpErrno);
394
395 SOCKET
396 WSPAPI
397 WSPSocket(
398 IN INT af,
399 IN INT type,
400 IN INT protocol,
401 IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
402 IN GROUP g,
403 IN DWORD dwFlags,
404 OUT LPINT lpErrno);
405
406 INT
407 WSPAPI
408 WSPStringToAddress(
409 IN LPWSTR AddressString,
410 IN INT AddressFamily,
411 IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
412 OUT LPSOCKADDR lpAddress,
413 IN OUT LPINT lpAddressLength,
414 OUT LPINT lpErrno);
415
416
417 PSOCKET_INFORMATION GetSocketStructure(
418 SOCKET Handle
419 );
420
421 INT TranslateNtStatusError( NTSTATUS Status );
422
423 VOID DeleteSocketStructure( SOCKET Handle );
424
425 int GetSocketInformation(
426 PSOCKET_INFORMATION Socket,
427 ULONG AfdInformationClass,
428 PBOOLEAN Boolean OPTIONAL,
429 PULONG Ulong OPTIONAL,
430 PLARGE_INTEGER LargeInteger OPTIONAL
431 );
432
433 int SetSocketInformation(
434 PSOCKET_INFORMATION Socket,
435 ULONG AfdInformationClass,
436 PBOOLEAN Boolean OPTIONAL,
437 PULONG Ulong OPTIONAL,
438 PLARGE_INTEGER LargeInteger OPTIONAL
439 );
440
441 int CreateContext(
442 PSOCKET_INFORMATION Socket
443 );
444
445 int SockAsyncThread(
446 PVOID ThreadParam
447 );
448
449 VOID
450 SockProcessAsyncSelect(
451 PSOCKET_INFORMATION Socket,
452 PASYNC_DATA AsyncData
453 );
454
455 VOID
456 SockAsyncSelectCompletionRoutine(
457 PVOID Context,
458 PIO_STATUS_BLOCK IoStatusBlock
459 );
460
461 BOOLEAN
462 SockCreateOrReferenceAsyncThread(
463 VOID
464 );
465
466 BOOLEAN SockGetAsyncSelectHelperAfdHandle(
467 VOID
468 );
469
470 VOID SockProcessQueuedAsyncSelect(
471 PVOID Context,
472 PIO_STATUS_BLOCK IoStatusBlock
473 );
474
475 VOID
476 SockReenableAsyncSelectEvent (
477 IN PSOCKET_INFORMATION Socket,
478 IN ULONG Event
479 );
480
481 typedef VOID (*PASYNC_COMPLETION_ROUTINE)(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock);
482
483 FORCEINLINE
484 DWORD
485 MsafdReturnWithErrno(NTSTATUS Status,
486 LPINT Errno,
487 DWORD Received,
488 LPDWORD ReturnedBytes)
489 {
490 if (Errno)
491 {
492 *Errno = TranslateNtStatusError(Status);
493
494 if (ReturnedBytes)
495 *ReturnedBytes = (*Errno == 0) ? Received : 0;
496
497 return (*Errno == 0) ? 0 : SOCKET_ERROR;
498 }
499 else
500 {
501 DbgPrint("%s: Received invalid lpErrno pointer!\n", __FUNCTION__);
502
503 if (ReturnedBytes)
504 *ReturnedBytes = (Status == STATUS_SUCCESS) ? Received : 0;
505
506 return (Status == STATUS_SUCCESS) ? 0 : SOCKET_ERROR;
507 }
508 }
509
510 #endif /* __MSAFD_H */