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