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