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
;
143 _Must_inspect_result_
148 _Out_writes_bytes_to_opt_(*addrlen
, *addrlen
) struct sockaddr FAR
* addr
,
149 _Inout_opt_ LPINT addrlen
,
150 _In_opt_ LPCONDITIONPROC lpfnCondition
,
151 _In_opt_ DWORD_PTR dwCallbackData
,
152 _Out_ LPINT lpErrno
);
157 IN LPSOCKADDR lpsaAddress
,
158 IN DWORD dwAddressLength
,
159 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
160 OUT LPWSTR lpszAddressString
,
161 IN OUT LPDWORD lpdwAddressStringLength
,
176 IN CONST SOCKADDR
*name
,
182 WSPCancelBlockingCall(
200 IN CONST SOCKADDR
*name
,
202 IN LPWSABUF lpCallerData
,
203 OUT LPWSABUF lpCalleeData
,
212 IN DWORD dwProcessId
,
213 OUT LPWSAPROTOCOL_INFOW lpProtocolInfo
,
218 WSPEnumNetworkEvents(
220 IN WSAEVENT hEventObject
,
221 OUT LPWSANETWORKEVENTS lpNetworkEvents
,
228 IN WSAEVENT hEventObject
,
229 IN LONG lNetworkEvents
,
234 WSPGetOverlappedResult(
236 IN LPWSAOVERLAPPED lpOverlapped
,
237 OUT LPDWORD lpcbTransfer
,
239 OUT LPDWORD lpdwFlags
,
247 IN OUT LPINT namelen
,
254 IN OUT LPWSABUF lpQOSName
,
263 IN OUT LPINT namelen
,
272 OUT CHAR FAR
* optval
,
280 IN DWORD dwIoControlCode
,
281 IN LPVOID lpvInBuffer
,
283 OUT LPVOID lpvOutBuffer
,
284 IN DWORD cbOutBuffer
,
285 OUT LPDWORD lpcbBytesReturned
,
286 IN LPWSAOVERLAPPED lpOverlapped
,
287 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
288 IN LPWSATHREADID lpThreadId
,
295 IN CONST SOCKADDR
*name
,
297 IN LPWSABUF lpCallerData
,
298 OUT LPWSABUF lpCalleeData
,
315 IN OUT LPWSABUF lpBuffers
,
316 IN DWORD dwBufferCount
,
317 OUT LPDWORD lpNumberOfBytesRecvd
,
318 IN OUT LPDWORD lpFlags
,
319 IN LPWSAOVERLAPPED lpOverlapped
,
320 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
321 IN LPWSATHREADID lpThreadId
,
328 OUT LPWSABUF lpInboundDisconnectData
,
335 IN OUT LPWSABUF lpBuffers
,
336 IN DWORD dwBufferCount
,
337 OUT LPDWORD lpNumberOfBytesRecvd
,
338 IN OUT LPDWORD lpFlags
,
339 OUT LPSOCKADDR lpFrom
,
340 IN OUT LPINT lpFromlen
,
341 IN LPWSAOVERLAPPED lpOverlapped
,
342 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
343 IN LPWSATHREADID lpThreadId
,
350 IN OUT fd_set
*readfds
,
351 IN OUT fd_set
*writefds
,
352 IN OUT fd_set
*exceptfds
,
353 IN CONST
struct timeval
*timeout
,
360 IN LPWSABUF lpBuffers
,
361 IN DWORD dwBufferCount
,
362 OUT LPDWORD lpNumberOfBytesSent
,
364 IN LPWSAOVERLAPPED lpOverlapped
,
365 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
366 IN LPWSATHREADID lpThreadId
,
373 IN LPWSABUF lpOutboundDisconnectData
,
380 IN LPWSABUF lpBuffers
,
381 IN DWORD dwBufferCount
,
382 OUT LPDWORD lpNumberOfBytesSent
,
384 IN CONST SOCKADDR
*lpTo
,
386 IN LPWSAOVERLAPPED lpOverlapped
,
387 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
388 IN LPWSATHREADID lpThreadId
,
397 IN CONST CHAR FAR
* optval
,
414 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
422 IN LPWSTR AddressString
,
423 IN INT AddressFamily
,
424 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
425 OUT LPSOCKADDR lpAddress
,
426 IN OUT LPINT lpAddressLength
,
430 PSOCKET_INFORMATION
GetSocketStructure(
434 INT
TranslateNtStatusError( NTSTATUS Status
);
436 VOID
DeleteSocketStructure( SOCKET Handle
);
438 int GetSocketInformation(
439 PSOCKET_INFORMATION Socket
,
440 ULONG AfdInformationClass
,
441 PBOOLEAN Boolean OPTIONAL
,
442 PULONG Ulong OPTIONAL
,
443 PLARGE_INTEGER LargeInteger OPTIONAL
,
444 LPWSAOVERLAPPED Overlapped OPTIONAL
,
445 LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
448 int SetSocketInformation(
449 PSOCKET_INFORMATION Socket
,
450 ULONG AfdInformationClass
,
451 PBOOLEAN Boolean OPTIONAL
,
452 PULONG Ulong OPTIONAL
,
453 PLARGE_INTEGER LargeInteger OPTIONAL
,
454 LPWSAOVERLAPPED Overlapped OPTIONAL
,
455 LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
459 PSOCKET_INFORMATION Socket
469 SockProcessAsyncSelect(
470 PSOCKET_INFORMATION Socket
,
471 PASYNC_DATA AsyncData
475 SockAsyncSelectCompletionRoutine(
477 PIO_STATUS_BLOCK IoStatusBlock
481 SockCreateOrReferenceAsyncThread(
485 BOOLEAN
SockGetAsyncSelectHelperAfdHandle(
489 VOID
SockProcessQueuedAsyncSelect(
491 PIO_STATUS_BLOCK IoStatusBlock
495 SockReenableAsyncSelectEvent (
496 IN PSOCKET_INFORMATION Socket
,
500 typedef VOID (*PASYNC_COMPLETION_ROUTINE
)(PVOID Context
, PIO_STATUS_BLOCK IoStatusBlock
);
504 MsafdReturnWithErrno(NTSTATUS Status
,
507 LPDWORD ReturnedBytes
)
511 *Errno
= TranslateNtStatusError(Status
);
514 *ReturnedBytes
= (*Errno
== 0) ? Received
: 0;
516 return (*Errno
== 0) ? 0 : SOCKET_ERROR
;
520 DbgPrint("%s: Received invalid lpErrno pointer!\n", __FUNCTION__
);
523 *ReturnedBytes
= (Status
== STATUS_SUCCESS
) ? Received
: 0;
525 return (Status
== STATUS_SUCCESS
) ? 0 : SOCKET_ERROR
;
529 #endif /* __MSAFD_H */