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
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>
34 extern HANDLE GlobalHeap
;
35 extern WSPUPCALLTABLE Upcalls
;
36 extern LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest
;
37 extern LIST_ENTRY SockHelpersListHead
;
38 extern HANDLE SockEvent
;
39 extern HANDLE SockAsyncCompletionPort
;
40 extern BOOLEAN SockAsyncSelectCalled
;
42 typedef enum _SOCKET_STATE
{
48 } SOCKET_STATE
, *PSOCKET_STATE
;
50 typedef struct _SOCK_SHARED_INFO
{
55 INT SizeOfLocalAddress
;
56 INT SizeOfRemoteAddress
;
57 struct linger LingerData
;
60 ULONG SizeOfRecvBuffer
;
61 ULONG SizeOfSendBuffer
;
67 BOOLEAN ReuseAddresses
:1;
68 BOOLEAN ExclusiveAddressUse
:1;
69 BOOLEAN NonBlocking
:1;
70 BOOLEAN DontUseWildcard
:1;
71 BOOLEAN ReceiveShutdown
:1;
72 BOOLEAN SendShutdown
:1;
73 BOOLEAN UseDelayedAcceptance
:1;
89 LONG AsyncDisabledEvents
;
90 } SOCK_SHARED_INFO
, *PSOCK_SHARED_INFO
;
92 typedef struct _SOCKET_INFORMATION
{
95 SOCK_SHARED_INFO SharedData
;
97 PHELPER_DATA HelperData
;
99 PSOCKADDR LocalAddress
;
100 PSOCKADDR RemoteAddress
;
101 HANDLE TdiAddressHandle
;
102 HANDLE TdiConnectionHandle
;
106 CRITICAL_SECTION Lock
;
109 SOCKADDR WSLocalAddress
;
110 SOCKADDR WSRemoteAddress
;
111 struct _SOCKET_INFORMATION
*NextSocket
;
112 } SOCKET_INFORMATION
, *PSOCKET_INFORMATION
;
115 typedef struct _SOCKET_CONTEXT
{
116 SOCK_SHARED_INFO SharedData
;
117 ULONG SizeOfHelperData
;
119 SOCKADDR LocalAddress
;
120 SOCKADDR RemoteAddress
;
121 /* Plus Helper Data */
122 } SOCKET_CONTEXT
, *PSOCKET_CONTEXT
;
124 typedef struct _ASYNC_DATA
{
125 PSOCKET_INFORMATION ParentSocket
;
126 DWORD SequenceNumber
;
127 IO_STATUS_BLOCK IoStatusBlock
;
128 AFD_POLL_INFO AsyncSelectInfo
;
129 } ASYNC_DATA
, *PASYNC_DATA
;
136 IN OUT LPINT addrlen
,
137 IN LPCONDITIONPROC lpfnCondition
,
138 IN DWORD dwCallbackData
,
144 IN LPSOCKADDR lpsaAddress
,
145 IN DWORD dwAddressLength
,
146 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
147 OUT LPWSTR lpszAddressString
,
148 IN OUT LPDWORD lpdwAddressStringLength
,
163 IN CONST SOCKADDR
*name
,
169 WSPCancelBlockingCall(
187 IN CONST SOCKADDR
*name
,
189 IN LPWSABUF lpCallerData
,
190 OUT LPWSABUF lpCalleeData
,
199 IN DWORD dwProcessId
,
200 OUT LPWSAPROTOCOL_INFOW lpProtocolInfo
,
205 WSPEnumNetworkEvents(
207 IN WSAEVENT hEventObject
,
208 OUT LPWSANETWORKEVENTS lpNetworkEvents
,
215 IN WSAEVENT hEventObject
,
216 IN LONG lNetworkEvents
,
221 WSPGetOverlappedResult(
223 IN LPWSAOVERLAPPED lpOverlapped
,
224 OUT LPDWORD lpcbTransfer
,
226 OUT LPDWORD lpdwFlags
,
234 IN OUT LPINT namelen
,
241 IN OUT LPWSABUF lpQOSName
,
250 IN OUT LPINT namelen
,
259 OUT CHAR FAR
* optval
,
267 IN DWORD dwIoControlCode
,
268 IN LPVOID lpvInBuffer
,
270 OUT LPVOID lpvOutBuffer
,
271 IN DWORD cbOutBuffer
,
272 OUT LPDWORD lpcbBytesReturned
,
273 IN LPWSAOVERLAPPED lpOverlapped
,
274 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
275 IN LPWSATHREADID lpThreadId
,
282 IN CONST SOCKADDR
*name
,
284 IN LPWSABUF lpCallerData
,
285 OUT LPWSABUF lpCalleeData
,
302 IN OUT LPWSABUF lpBuffers
,
303 IN DWORD dwBufferCount
,
304 OUT LPDWORD lpNumberOfBytesRecvd
,
305 IN OUT LPDWORD lpFlags
,
306 IN LPWSAOVERLAPPED lpOverlapped
,
307 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
308 IN LPWSATHREADID lpThreadId
,
315 OUT LPWSABUF lpInboundDisconnectData
,
322 IN OUT LPWSABUF lpBuffers
,
323 IN DWORD dwBufferCount
,
324 OUT LPDWORD lpNumberOfBytesRecvd
,
325 IN OUT LPDWORD lpFlags
,
326 OUT LPSOCKADDR lpFrom
,
327 IN OUT LPINT lpFromlen
,
328 IN LPWSAOVERLAPPED lpOverlapped
,
329 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
330 IN LPWSATHREADID lpThreadId
,
337 IN OUT fd_set
*readfds
,
338 IN OUT fd_set
*writefds
,
339 IN OUT fd_set
*exceptfds
,
340 IN CONST
struct timeval
*timeout
,
347 IN LPWSABUF lpBuffers
,
348 IN DWORD dwBufferCount
,
349 OUT LPDWORD lpNumberOfBytesSent
,
351 IN LPWSAOVERLAPPED lpOverlapped
,
352 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
353 IN LPWSATHREADID lpThreadId
,
360 IN LPWSABUF lpOutboundDisconnectData
,
367 IN LPWSABUF lpBuffers
,
368 IN DWORD dwBufferCount
,
369 OUT LPDWORD lpNumberOfBytesSent
,
371 IN CONST SOCKADDR
*lpTo
,
373 IN LPWSAOVERLAPPED lpOverlapped
,
374 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
375 IN LPWSATHREADID lpThreadId
,
384 IN CONST CHAR FAR
* optval
,
401 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
409 IN LPWSTR AddressString
,
410 IN INT AddressFamily
,
411 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
412 OUT LPSOCKADDR lpAddress
,
413 IN OUT LPINT lpAddressLength
,
417 PSOCKET_INFORMATION
GetSocketStructure(
421 INT
TranslateNtStatusError( NTSTATUS Status
);
423 VOID
DeleteSocketStructure( SOCKET Handle
);
425 int GetSocketInformation(
426 PSOCKET_INFORMATION Socket
,
427 ULONG AfdInformationClass
,
428 PBOOLEAN Boolean OPTIONAL
,
429 PULONG Ulong OPTIONAL
,
430 PLARGE_INTEGER LargeInteger OPTIONAL
433 int SetSocketInformation(
434 PSOCKET_INFORMATION Socket
,
435 ULONG AfdInformationClass
,
436 PBOOLEAN Boolean OPTIONAL
,
437 PULONG Ulong OPTIONAL
,
438 PLARGE_INTEGER LargeInteger OPTIONAL
442 PSOCKET_INFORMATION Socket
450 SockProcessAsyncSelect(
451 PSOCKET_INFORMATION Socket
,
452 PASYNC_DATA AsyncData
456 SockAsyncSelectCompletionRoutine(
458 PIO_STATUS_BLOCK IoStatusBlock
462 SockCreateOrReferenceAsyncThread(
466 BOOLEAN
SockGetAsyncSelectHelperAfdHandle(
470 VOID
SockProcessQueuedAsyncSelect(
472 PIO_STATUS_BLOCK IoStatusBlock
476 SockReenableAsyncSelectEvent (
477 IN PSOCKET_INFORMATION Socket
,
481 typedef VOID (*PASYNC_COMPLETION_ROUTINE
)(PVOID Context
, PIO_STATUS_BLOCK IoStatusBlock
);
485 MsafdReturnWithErrno(NTSTATUS Status
,
488 LPDWORD ReturnedBytes
)
492 *Errno
= TranslateNtStatusError(Status
);
495 *ReturnedBytes
= (*Errno
== 0) ? Received
: 0;
497 return (*Errno
== 0) ? 0 : SOCKET_ERROR
;
501 DbgPrint("%s: Received invalid lpErrno pointer!\n", __FUNCTION__
);
504 *ReturnedBytes
= (Status
== STATUS_SUCCESS
) ? Received
: 0;
506 return (Status
== STATUS_SUCCESS
) ? 0 : SOCKET_ERROR
;
510 #endif /* __MSAFD_H */