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
13 #define WIN32_NO_STATUS
15 #define COM_NO_WINDOWS_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>
26 /* This includes ntsecapi.h so it needs to come after the NDK */
29 #include <afd/shared.h>
32 #include <wine/debug.h>
33 WINE_DEFAULT_DEBUG_CHANNEL(msafd
);
35 #include "include/helpers.h"
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
;
45 typedef enum _SOCKET_STATE
{
51 } SOCKET_STATE
, *PSOCKET_STATE
;
53 typedef struct _SOCK_SHARED_INFO
{
59 INT SizeOfLocalAddress
;
60 INT SizeOfRemoteAddress
;
61 struct linger LingerData
;
64 ULONG SizeOfRecvBuffer
;
65 ULONG SizeOfSendBuffer
;
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;
93 LONG AsyncDisabledEvents
;
94 SOCKADDR WSLocalAddress
;
95 SOCKADDR WSRemoteAddress
;
96 } SOCK_SHARED_INFO
, *PSOCK_SHARED_INFO
;
98 typedef struct _SOCKET_INFORMATION
{
100 PSOCK_SHARED_INFO SharedData
;
101 HANDLE SharedDataHandle
;
103 PHELPER_DATA HelperData
;
105 PSOCKADDR LocalAddress
;
106 PSOCKADDR RemoteAddress
;
107 HANDLE TdiAddressHandle
;
108 HANDLE TdiConnectionHandle
;
112 CRITICAL_SECTION Lock
;
115 WSAPROTOCOL_INFOW ProtocolInfo
;
116 struct _SOCKET_INFORMATION
*NextSocket
;
117 } SOCKET_INFORMATION
, *PSOCKET_INFORMATION
;
120 typedef struct _SOCKET_CONTEXT
{
121 SOCK_SHARED_INFO SharedData
;
122 ULONG SizeOfHelperData
;
124 SOCKADDR LocalAddress
;
125 SOCKADDR RemoteAddress
;
126 /* Plus Helper Data */
127 } SOCKET_CONTEXT
, *PSOCKET_CONTEXT
;
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
;
136 typedef struct _AFDAPCCONTEXT
138 LPWSAOVERLAPPED lpOverlapped
;
139 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
;
140 PSOCKET_INFORMATION lpSocket
;
141 } AFDAPCCONTEXT
, *PAFDAPCCONTEXT
;
148 IN OUT LPINT addrlen
,
149 IN LPCONDITIONPROC lpfnCondition
,
150 IN DWORD dwCallbackData
,
156 IN LPSOCKADDR lpsaAddress
,
157 IN DWORD dwAddressLength
,
158 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
159 OUT LPWSTR lpszAddressString
,
160 IN OUT LPDWORD lpdwAddressStringLength
,
175 IN CONST SOCKADDR
*name
,
181 WSPCancelBlockingCall(
199 IN CONST SOCKADDR
*name
,
201 IN LPWSABUF lpCallerData
,
202 OUT LPWSABUF lpCalleeData
,
211 IN DWORD dwProcessId
,
212 OUT LPWSAPROTOCOL_INFOW lpProtocolInfo
,
217 WSPEnumNetworkEvents(
219 IN WSAEVENT hEventObject
,
220 OUT LPWSANETWORKEVENTS lpNetworkEvents
,
227 IN WSAEVENT hEventObject
,
228 IN LONG lNetworkEvents
,
233 WSPGetOverlappedResult(
235 IN LPWSAOVERLAPPED lpOverlapped
,
236 OUT LPDWORD lpcbTransfer
,
238 OUT LPDWORD lpdwFlags
,
246 IN OUT LPINT namelen
,
253 IN OUT LPWSABUF lpQOSName
,
262 IN OUT LPINT namelen
,
271 OUT CHAR FAR
* optval
,
279 IN DWORD dwIoControlCode
,
280 IN LPVOID lpvInBuffer
,
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
,
294 IN CONST SOCKADDR
*name
,
296 IN LPWSABUF lpCallerData
,
297 OUT LPWSABUF lpCalleeData
,
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
,
327 OUT LPWSABUF lpInboundDisconnectData
,
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
,
349 IN OUT fd_set
*readfds
,
350 IN OUT fd_set
*writefds
,
351 IN OUT fd_set
*exceptfds
,
352 IN CONST
struct timeval
*timeout
,
359 IN LPWSABUF lpBuffers
,
360 IN DWORD dwBufferCount
,
361 OUT LPDWORD lpNumberOfBytesSent
,
363 IN LPWSAOVERLAPPED lpOverlapped
,
364 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
365 IN LPWSATHREADID lpThreadId
,
372 IN LPWSABUF lpOutboundDisconnectData
,
379 IN LPWSABUF lpBuffers
,
380 IN DWORD dwBufferCount
,
381 OUT LPDWORD lpNumberOfBytesSent
,
383 IN CONST SOCKADDR
*lpTo
,
385 IN LPWSAOVERLAPPED lpOverlapped
,
386 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
387 IN LPWSATHREADID lpThreadId
,
396 IN CONST CHAR FAR
* optval
,
413 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
421 IN LPWSTR AddressString
,
422 IN INT AddressFamily
,
423 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
424 OUT LPSOCKADDR lpAddress
,
425 IN OUT LPINT lpAddressLength
,
429 PSOCKET_INFORMATION
GetSocketStructure(
433 INT
TranslateNtStatusError( NTSTATUS Status
);
435 VOID
DeleteSocketStructure( SOCKET Handle
);
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
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
458 PSOCKET_INFORMATION Socket
468 SockProcessAsyncSelect(
469 PSOCKET_INFORMATION Socket
,
470 PASYNC_DATA AsyncData
474 SockAsyncSelectCompletionRoutine(
476 PIO_STATUS_BLOCK IoStatusBlock
480 SockCreateOrReferenceAsyncThread(
484 BOOLEAN
SockGetAsyncSelectHelperAfdHandle(
488 VOID
SockProcessQueuedAsyncSelect(
490 PIO_STATUS_BLOCK IoStatusBlock
494 SockReenableAsyncSelectEvent (
495 IN PSOCKET_INFORMATION Socket
,
499 typedef VOID (*PASYNC_COMPLETION_ROUTINE
)(PVOID Context
, PIO_STATUS_BLOCK IoStatusBlock
);
503 MsafdReturnWithErrno(NTSTATUS Status
,
506 LPDWORD ReturnedBytes
)
510 *Errno
= TranslateNtStatusError(Status
);
513 *ReturnedBytes
= (*Errno
== 0) ? Received
: 0;
515 return (*Errno
== 0) ? 0 : SOCKET_ERROR
;
519 DbgPrint("%s: Received invalid lpErrno pointer!\n", __FUNCTION__
);
522 *ReturnedBytes
= (Status
== STATUS_SUCCESS
) ? Received
: 0;
524 return (Status
== STATUS_SUCCESS
) ? 0 : SOCKET_ERROR
;
528 #endif /* __MSAFD_H */