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
10 #define WIN32_NO_STATUS
12 #define COM_NO_WINDOWS_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>
25 /* This includes ntsecapi.h so it needs to come after the NDK */
28 #include <afd/shared.h>
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
;
41 typedef enum _SOCKET_STATE
{
47 } SOCKET_STATE
, *PSOCKET_STATE
;
49 typedef struct _SOCK_SHARED_INFO
{
54 INT SizeOfLocalAddress
;
55 INT SizeOfRemoteAddress
;
56 struct linger LingerData
;
59 ULONG SizeOfRecvBuffer
;
60 ULONG SizeOfSendBuffer
;
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;
88 LONG AsyncDisabledEvents
;
89 } SOCK_SHARED_INFO
, *PSOCK_SHARED_INFO
;
91 typedef struct _SOCKET_INFORMATION
{
94 SOCK_SHARED_INFO SharedData
;
96 PHELPER_DATA HelperData
;
98 PSOCKADDR LocalAddress
;
99 PSOCKADDR RemoteAddress
;
100 HANDLE TdiAddressHandle
;
101 HANDLE TdiConnectionHandle
;
105 CRITICAL_SECTION Lock
;
108 SOCKADDR WSLocalAddress
;
109 SOCKADDR WSRemoteAddress
;
110 struct _SOCKET_INFORMATION
*NextSocket
;
111 } SOCKET_INFORMATION
, *PSOCKET_INFORMATION
;
114 typedef struct _SOCKET_CONTEXT
{
115 SOCK_SHARED_INFO SharedData
;
116 ULONG SizeOfHelperData
;
118 SOCKADDR LocalAddress
;
119 SOCKADDR RemoteAddress
;
120 /* Plus Helper Data */
121 } SOCKET_CONTEXT
, *PSOCKET_CONTEXT
;
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
;
135 IN OUT LPINT addrlen
,
136 IN LPCONDITIONPROC lpfnCondition
,
137 IN DWORD dwCallbackData
,
143 IN LPSOCKADDR lpsaAddress
,
144 IN DWORD dwAddressLength
,
145 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
146 OUT LPWSTR lpszAddressString
,
147 IN OUT LPDWORD lpdwAddressStringLength
,
162 IN CONST SOCKADDR
*name
,
168 WSPCancelBlockingCall(
186 IN CONST SOCKADDR
*name
,
188 IN LPWSABUF lpCallerData
,
189 OUT LPWSABUF lpCalleeData
,
198 IN DWORD dwProcessId
,
199 OUT LPWSAPROTOCOL_INFOW lpProtocolInfo
,
204 WSPEnumNetworkEvents(
206 IN WSAEVENT hEventObject
,
207 OUT LPWSANETWORKEVENTS lpNetworkEvents
,
214 IN WSAEVENT hEventObject
,
215 IN LONG lNetworkEvents
,
220 WSPGetOverlappedResult(
222 IN LPWSAOVERLAPPED lpOverlapped
,
223 OUT LPDWORD lpcbTransfer
,
225 OUT LPDWORD lpdwFlags
,
233 IN OUT LPINT namelen
,
240 IN OUT LPWSABUF lpQOSName
,
249 IN OUT LPINT namelen
,
258 OUT CHAR FAR
* optval
,
266 IN DWORD dwIoControlCode
,
267 IN LPVOID lpvInBuffer
,
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
,
281 IN CONST SOCKADDR
*name
,
283 IN LPWSABUF lpCallerData
,
284 OUT LPWSABUF lpCalleeData
,
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
,
314 OUT LPWSABUF lpInboundDisconnectData
,
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
,
336 IN OUT fd_set
*readfds
,
337 IN OUT fd_set
*writefds
,
338 IN OUT fd_set
*exceptfds
,
339 IN CONST
struct timeval
*timeout
,
346 IN LPWSABUF lpBuffers
,
347 IN DWORD dwBufferCount
,
348 OUT LPDWORD lpNumberOfBytesSent
,
350 IN LPWSAOVERLAPPED lpOverlapped
,
351 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
352 IN LPWSATHREADID lpThreadId
,
359 IN LPWSABUF lpOutboundDisconnectData
,
366 IN LPWSABUF lpBuffers
,
367 IN DWORD dwBufferCount
,
368 OUT LPDWORD lpNumberOfBytesSent
,
370 IN CONST SOCKADDR
*lpTo
,
372 IN LPWSAOVERLAPPED lpOverlapped
,
373 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
374 IN LPWSATHREADID lpThreadId
,
383 IN CONST CHAR FAR
* optval
,
400 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
408 IN LPWSTR AddressString
,
409 IN INT AddressFamily
,
410 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
411 OUT LPSOCKADDR lpAddress
,
412 IN OUT LPINT lpAddressLength
,
416 PSOCKET_INFORMATION
GetSocketStructure(
420 INT
TranslateNtStatusError( NTSTATUS Status
);
422 VOID
DeleteSocketStructure( SOCKET Handle
);
424 int GetSocketInformation(
425 PSOCKET_INFORMATION Socket
,
426 ULONG AfdInformationClass
,
427 PBOOLEAN Boolean OPTIONAL
,
428 PULONG Ulong OPTIONAL
,
429 PLARGE_INTEGER LargeInteger OPTIONAL
432 int SetSocketInformation(
433 PSOCKET_INFORMATION Socket
,
434 ULONG AfdInformationClass
,
435 PBOOLEAN Boolean OPTIONAL
,
436 PULONG Ulong OPTIONAL
,
437 PLARGE_INTEGER LargeInteger OPTIONAL
441 PSOCKET_INFORMATION Socket
449 SockProcessAsyncSelect(
450 PSOCKET_INFORMATION Socket
,
451 PASYNC_DATA AsyncData
455 SockAsyncSelectCompletionRoutine(
457 PIO_STATUS_BLOCK IoStatusBlock
461 SockCreateOrReferenceAsyncThread(
465 BOOLEAN
SockGetAsyncSelectHelperAfdHandle(
469 VOID
SockProcessQueuedAsyncSelect(
471 PIO_STATUS_BLOCK IoStatusBlock
475 SockReenableAsyncSelectEvent (
476 IN PSOCKET_INFORMATION Socket
,
480 typedef VOID (*PASYNC_COMPLETION_ROUTINE
)(PVOID Context
, PIO_STATUS_BLOCK IoStatusBlock
);
484 MsafdReturnWithErrno(NTSTATUS Status
,
487 LPDWORD ReturnedBytes
)
491 *Errno
= TranslateNtStatusError(Status
);
494 *ReturnedBytes
= (*Errno
== 0) ? Received
: 0;
496 return (*Errno
== 0) ? 0 : SOCKET_ERROR
;
500 DbgPrint("%s: Received invalid lpErrno pointer!\n", __FUNCTION__
);
503 *ReturnedBytes
= (Status
== STATUS_SUCCESS
) ? Received
: 0;
505 return (Status
== STATUS_SUCCESS
) ? 0 : SOCKET_ERROR
;
509 #endif /* __MSAFD_H */