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
13 #define WIN32_NO_STATUS
17 #define NTOS_MODE_USER
18 #include <ndk/exfuncs.h>
19 #include <ndk/iofuncs.h>
20 #include <ndk/obfuncs.h>
21 #include <ndk/rtlfuncs.h>
23 /* This includes ntsecapi.h so it needs to come after the NDK */
26 #include <afd/shared.h>
31 extern HANDLE GlobalHeap
;
32 extern WSPUPCALLTABLE Upcalls
;
33 extern LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest
;
34 extern LIST_ENTRY SockHelpersListHead
;
35 extern HANDLE SockEvent
;
36 extern HANDLE SockAsyncCompletionPort
;
37 extern BOOLEAN SockAsyncSelectCalled
;
39 typedef enum _SOCKET_STATE
{
45 } SOCKET_STATE
, *PSOCKET_STATE
;
47 typedef struct _SOCK_SHARED_INFO
{
52 INT SizeOfLocalAddress
;
53 INT SizeOfRemoteAddress
;
54 struct linger LingerData
;
57 ULONG SizeOfRecvBuffer
;
58 ULONG SizeOfSendBuffer
;
64 BOOLEAN ReuseAddresses
:1;
65 BOOLEAN ExclusiveAddressUse
:1;
66 BOOLEAN NonBlocking
:1;
67 BOOLEAN DontUseWildcard
:1;
68 BOOLEAN ReceiveShutdown
:1;
69 BOOLEAN SendShutdown
:1;
70 BOOLEAN UseDelayedAcceptance
:1;
86 LONG AsyncDisabledEvents
;
87 } SOCK_SHARED_INFO
, *PSOCK_SHARED_INFO
;
89 typedef struct _SOCKET_INFORMATION
{
92 SOCK_SHARED_INFO SharedData
;
94 PHELPER_DATA HelperData
;
96 PSOCKADDR LocalAddress
;
97 PSOCKADDR RemoteAddress
;
98 HANDLE TdiAddressHandle
;
99 HANDLE TdiConnectionHandle
;
103 CRITICAL_SECTION Lock
;
106 SOCKADDR WSLocalAddress
;
107 SOCKADDR WSRemoteAddress
;
108 struct _SOCKET_INFORMATION
*NextSocket
;
109 } SOCKET_INFORMATION
, *PSOCKET_INFORMATION
;
112 typedef struct _SOCKET_CONTEXT
{
113 SOCK_SHARED_INFO SharedData
;
114 ULONG SizeOfHelperData
;
116 SOCKADDR LocalAddress
;
117 SOCKADDR RemoteAddress
;
118 /* Plus Helper Data */
119 } SOCKET_CONTEXT
, *PSOCKET_CONTEXT
;
121 typedef struct _ASYNC_DATA
{
122 PSOCKET_INFORMATION ParentSocket
;
123 DWORD SequenceNumber
;
124 IO_STATUS_BLOCK IoStatusBlock
;
125 AFD_POLL_INFO AsyncSelectInfo
;
126 } ASYNC_DATA
, *PASYNC_DATA
;
133 IN OUT LPINT addrlen
,
134 IN LPCONDITIONPROC lpfnCondition
,
135 IN DWORD dwCallbackData
,
141 IN LPSOCKADDR lpsaAddress
,
142 IN DWORD dwAddressLength
,
143 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
144 OUT LPWSTR lpszAddressString
,
145 IN OUT LPDWORD lpdwAddressStringLength
,
160 IN CONST SOCKADDR
*name
,
166 WSPCancelBlockingCall(
184 IN CONST SOCKADDR
*name
,
186 IN LPWSABUF lpCallerData
,
187 OUT LPWSABUF lpCalleeData
,
196 IN DWORD dwProcessId
,
197 OUT LPWSAPROTOCOL_INFOW lpProtocolInfo
,
202 WSPEnumNetworkEvents(
204 IN WSAEVENT hEventObject
,
205 OUT LPWSANETWORKEVENTS lpNetworkEvents
,
212 IN WSAEVENT hEventObject
,
213 IN LONG lNetworkEvents
,
218 WSPGetOverlappedResult(
220 IN LPWSAOVERLAPPED lpOverlapped
,
221 OUT LPDWORD lpcbTransfer
,
223 OUT LPDWORD lpdwFlags
,
231 IN OUT LPINT namelen
,
238 IN OUT LPWSABUF lpQOSName
,
247 IN OUT LPINT namelen
,
256 OUT CHAR FAR
* optval
,
264 IN DWORD dwIoControlCode
,
265 IN LPVOID lpvInBuffer
,
267 OUT LPVOID lpvOutBuffer
,
268 IN DWORD cbOutBuffer
,
269 OUT LPDWORD lpcbBytesReturned
,
270 IN LPWSAOVERLAPPED lpOverlapped
,
271 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
272 IN LPWSATHREADID lpThreadId
,
279 IN CONST SOCKADDR
*name
,
281 IN LPWSABUF lpCallerData
,
282 OUT LPWSABUF lpCalleeData
,
299 IN OUT LPWSABUF lpBuffers
,
300 IN DWORD dwBufferCount
,
301 OUT LPDWORD lpNumberOfBytesRecvd
,
302 IN OUT LPDWORD lpFlags
,
303 IN LPWSAOVERLAPPED lpOverlapped
,
304 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
305 IN LPWSATHREADID lpThreadId
,
312 OUT LPWSABUF lpInboundDisconnectData
,
319 IN OUT LPWSABUF lpBuffers
,
320 IN DWORD dwBufferCount
,
321 OUT LPDWORD lpNumberOfBytesRecvd
,
322 IN OUT LPDWORD lpFlags
,
323 OUT LPSOCKADDR lpFrom
,
324 IN OUT LPINT lpFromlen
,
325 IN LPWSAOVERLAPPED lpOverlapped
,
326 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
327 IN LPWSATHREADID lpThreadId
,
334 IN OUT fd_set
*readfds
,
335 IN OUT fd_set
*writefds
,
336 IN OUT fd_set
*exceptfds
,
337 IN CONST
struct timeval
*timeout
,
344 IN LPWSABUF lpBuffers
,
345 IN DWORD dwBufferCount
,
346 OUT LPDWORD lpNumberOfBytesSent
,
348 IN LPWSAOVERLAPPED lpOverlapped
,
349 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
350 IN LPWSATHREADID lpThreadId
,
357 IN LPWSABUF lpOutboundDisconnectData
,
364 IN LPWSABUF lpBuffers
,
365 IN DWORD dwBufferCount
,
366 OUT LPDWORD lpNumberOfBytesSent
,
368 IN CONST SOCKADDR
*lpTo
,
370 IN LPWSAOVERLAPPED lpOverlapped
,
371 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
372 IN LPWSATHREADID lpThreadId
,
381 IN CONST CHAR FAR
* optval
,
398 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
406 IN LPWSTR AddressString
,
407 IN INT AddressFamily
,
408 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
409 OUT LPSOCKADDR lpAddress
,
410 IN OUT LPINT lpAddressLength
,
414 PSOCKET_INFORMATION
GetSocketStructure(
418 INT
TranslateNtStatusError( NTSTATUS Status
);
420 VOID
DeleteSocketStructure( SOCKET Handle
);
422 int GetSocketInformation(
423 PSOCKET_INFORMATION Socket
,
424 ULONG AfdInformationClass
,
425 PBOOLEAN Boolean OPTIONAL
,
426 PULONG Ulong OPTIONAL
,
427 PLARGE_INTEGER LargeInteger OPTIONAL
430 int SetSocketInformation(
431 PSOCKET_INFORMATION Socket
,
432 ULONG AfdInformationClass
,
433 PBOOLEAN Boolean OPTIONAL
,
434 PULONG Ulong OPTIONAL
,
435 PLARGE_INTEGER LargeInteger OPTIONAL
439 PSOCKET_INFORMATION Socket
447 SockProcessAsyncSelect(
448 PSOCKET_INFORMATION Socket
,
449 PASYNC_DATA AsyncData
453 SockAsyncSelectCompletionRoutine(
455 PIO_STATUS_BLOCK IoStatusBlock
459 SockCreateOrReferenceAsyncThread(
463 BOOLEAN
SockGetAsyncSelectHelperAfdHandle(
467 VOID
SockProcessQueuedAsyncSelect(
469 PIO_STATUS_BLOCK IoStatusBlock
473 SockReenableAsyncSelectEvent (
474 IN PSOCKET_INFORMATION Socket
,
478 typedef VOID (*PASYNC_COMPLETION_ROUTINE
)(PVOID Context
, PIO_STATUS_BLOCK IoStatusBlock
);
482 MsafdReturnWithErrno(NTSTATUS Status
,
485 LPDWORD ReturnedBytes
)
489 *Errno
= TranslateNtStatusError(Status
);
492 *ReturnedBytes
= (*Errno
== 0) ? Received
: 0;
494 return (*Errno
== 0) ? 0 : SOCKET_ERROR
;
498 DbgPrint("%s: Received invalid lpErrno pointer!\n", __FUNCTION__
);
501 *ReturnedBytes
= (Status
== STATUS_SUCCESS
) ? Received
: 0;
503 return (Status
== STATUS_SUCCESS
) ? 0 : SOCKET_ERROR
;
507 #endif /* __MSAFD_H */