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