[MSAFD] Move the default debug channel to msafd.h.
[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: 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 */