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