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>
31 #include "include/helpers.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
{
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;
88 LONG AsyncDisabledEvents
;
89 SOCKADDR WSLocalAddress
;
90 SOCKADDR WSRemoteAddress
;
91 } SOCK_SHARED_INFO
, *PSOCK_SHARED_INFO
;
93 typedef struct _SOCKET_INFORMATION
{
95 PSOCK_SHARED_INFO SharedData
;
96 HANDLE SharedDataHandle
;
98 PHELPER_DATA HelperData
;
100 PSOCKADDR LocalAddress
;
101 PSOCKADDR RemoteAddress
;
102 HANDLE TdiAddressHandle
;
103 HANDLE TdiConnectionHandle
;
107 CRITICAL_SECTION Lock
;
110 WSAPROTOCOL_INFOW ProtocolInfo
;
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
;
131 typedef struct _AFDAPCCONTEXT
133 LPWSAOVERLAPPED lpOverlapped
;
134 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
;
135 PSOCKET_INFORMATION lpSocket
;
136 } AFDAPCCONTEXT
, *PAFDAPCCONTEXT
;
143 IN OUT LPINT addrlen
,
144 IN LPCONDITIONPROC lpfnCondition
,
145 IN DWORD dwCallbackData
,
151 IN LPSOCKADDR lpsaAddress
,
152 IN DWORD dwAddressLength
,
153 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
154 OUT LPWSTR lpszAddressString
,
155 IN OUT LPDWORD lpdwAddressStringLength
,
170 IN CONST SOCKADDR
*name
,
176 WSPCancelBlockingCall(
194 IN CONST SOCKADDR
*name
,
196 IN LPWSABUF lpCallerData
,
197 OUT LPWSABUF lpCalleeData
,
206 IN DWORD dwProcessId
,
207 OUT LPWSAPROTOCOL_INFOW lpProtocolInfo
,
212 WSPEnumNetworkEvents(
214 IN WSAEVENT hEventObject
,
215 OUT LPWSANETWORKEVENTS lpNetworkEvents
,
222 IN WSAEVENT hEventObject
,
223 IN LONG lNetworkEvents
,
228 WSPGetOverlappedResult(
230 IN LPWSAOVERLAPPED lpOverlapped
,
231 OUT LPDWORD lpcbTransfer
,
233 OUT LPDWORD lpdwFlags
,
241 IN OUT LPINT namelen
,
248 IN OUT LPWSABUF lpQOSName
,
257 IN OUT LPINT namelen
,
266 OUT CHAR FAR
* optval
,
274 IN DWORD dwIoControlCode
,
275 IN LPVOID lpvInBuffer
,
277 OUT LPVOID lpvOutBuffer
,
278 IN DWORD cbOutBuffer
,
279 OUT LPDWORD lpcbBytesReturned
,
280 IN LPWSAOVERLAPPED lpOverlapped
,
281 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
282 IN LPWSATHREADID lpThreadId
,
289 IN CONST SOCKADDR
*name
,
291 IN LPWSABUF lpCallerData
,
292 OUT LPWSABUF lpCalleeData
,
309 IN OUT LPWSABUF lpBuffers
,
310 IN DWORD dwBufferCount
,
311 OUT LPDWORD lpNumberOfBytesRecvd
,
312 IN OUT LPDWORD lpFlags
,
313 IN LPWSAOVERLAPPED lpOverlapped
,
314 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
315 IN LPWSATHREADID lpThreadId
,
322 OUT LPWSABUF lpInboundDisconnectData
,
329 IN OUT LPWSABUF lpBuffers
,
330 IN DWORD dwBufferCount
,
331 OUT LPDWORD lpNumberOfBytesRecvd
,
332 IN OUT LPDWORD lpFlags
,
333 OUT LPSOCKADDR lpFrom
,
334 IN OUT LPINT lpFromlen
,
335 IN LPWSAOVERLAPPED lpOverlapped
,
336 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
337 IN LPWSATHREADID lpThreadId
,
344 IN OUT fd_set
*readfds
,
345 IN OUT fd_set
*writefds
,
346 IN OUT fd_set
*exceptfds
,
347 IN CONST
struct timeval
*timeout
,
354 IN LPWSABUF lpBuffers
,
355 IN DWORD dwBufferCount
,
356 OUT LPDWORD lpNumberOfBytesSent
,
358 IN LPWSAOVERLAPPED lpOverlapped
,
359 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
360 IN LPWSATHREADID lpThreadId
,
367 IN LPWSABUF lpOutboundDisconnectData
,
374 IN LPWSABUF lpBuffers
,
375 IN DWORD dwBufferCount
,
376 OUT LPDWORD lpNumberOfBytesSent
,
378 IN CONST SOCKADDR
*lpTo
,
380 IN LPWSAOVERLAPPED lpOverlapped
,
381 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
382 IN LPWSATHREADID lpThreadId
,
391 IN CONST CHAR FAR
* optval
,
408 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
416 IN LPWSTR AddressString
,
417 IN INT AddressFamily
,
418 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
419 OUT LPSOCKADDR lpAddress
,
420 IN OUT LPINT lpAddressLength
,
424 PSOCKET_INFORMATION
GetSocketStructure(
428 INT
TranslateNtStatusError( NTSTATUS Status
);
430 VOID
DeleteSocketStructure( SOCKET Handle
);
432 int GetSocketInformation(
433 PSOCKET_INFORMATION Socket
,
434 ULONG AfdInformationClass
,
435 PBOOLEAN Boolean OPTIONAL
,
436 PULONG Ulong OPTIONAL
,
437 PLARGE_INTEGER LargeInteger OPTIONAL
,
438 LPWSAOVERLAPPED Overlapped OPTIONAL
,
439 LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
442 int SetSocketInformation(
443 PSOCKET_INFORMATION Socket
,
444 ULONG AfdInformationClass
,
445 PBOOLEAN Boolean OPTIONAL
,
446 PULONG Ulong OPTIONAL
,
447 PLARGE_INTEGER LargeInteger OPTIONAL
,
448 LPWSAOVERLAPPED Overlapped OPTIONAL
,
449 LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
453 PSOCKET_INFORMATION Socket
461 SockProcessAsyncSelect(
462 PSOCKET_INFORMATION Socket
,
463 PASYNC_DATA AsyncData
467 SockAsyncSelectCompletionRoutine(
469 PIO_STATUS_BLOCK IoStatusBlock
473 SockCreateOrReferenceAsyncThread(
477 BOOLEAN
SockGetAsyncSelectHelperAfdHandle(
481 VOID
SockProcessQueuedAsyncSelect(
483 PIO_STATUS_BLOCK IoStatusBlock
487 SockReenableAsyncSelectEvent (
488 IN PSOCKET_INFORMATION Socket
,
492 typedef VOID (*PASYNC_COMPLETION_ROUTINE
)(PVOID Context
, PIO_STATUS_BLOCK IoStatusBlock
);
496 MsafdReturnWithErrno(NTSTATUS Status
,
499 LPDWORD ReturnedBytes
)
503 *Errno
= TranslateNtStatusError(Status
);
506 *ReturnedBytes
= (*Errno
== 0) ? Received
: 0;
508 return (*Errno
== 0) ? 0 : SOCKET_ERROR
;
512 DbgPrint("%s: Received invalid lpErrno pointer!\n", __FUNCTION__
);
515 *ReturnedBytes
= (Status
== STATUS_SUCCESS
) ? Received
: 0;
517 return (Status
== STATUS_SUCCESS
) ? 0 : SOCKET_ERROR
;
521 #endif /* __MSAFD_H */