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
;
68 BOOLEAN ReuseAddresses
:1;
69 BOOLEAN ExclusiveAddressUse
:1;
70 BOOLEAN NonBlocking
:1;
71 BOOLEAN DontUseWildcard
:1;
72 BOOLEAN ReceiveShutdown
:1;
73 BOOLEAN SendShutdown
:1;
74 BOOLEAN UseDelayedAcceptance
:1;
89 LONG AsyncDisabledEvents
;
90 SOCKADDR WSLocalAddress
;
91 SOCKADDR WSRemoteAddress
;
92 } SOCK_SHARED_INFO
, *PSOCK_SHARED_INFO
;
94 typedef struct _SOCKET_INFORMATION
{
96 PSOCK_SHARED_INFO SharedData
;
97 HANDLE SharedDataHandle
;
99 PHELPER_DATA HelperData
;
101 PSOCKADDR LocalAddress
;
102 PSOCKADDR RemoteAddress
;
103 HANDLE TdiAddressHandle
;
104 HANDLE TdiConnectionHandle
;
108 CRITICAL_SECTION Lock
;
111 WSAPROTOCOL_INFOW ProtocolInfo
;
112 struct _SOCKET_INFORMATION
*NextSocket
;
113 } SOCKET_INFORMATION
, *PSOCKET_INFORMATION
;
116 typedef struct _SOCKET_CONTEXT
{
117 SOCK_SHARED_INFO SharedData
;
118 ULONG SizeOfHelperData
;
120 SOCKADDR LocalAddress
;
121 SOCKADDR RemoteAddress
;
122 /* Plus Helper Data */
123 } SOCKET_CONTEXT
, *PSOCKET_CONTEXT
;
125 typedef struct _ASYNC_DATA
{
126 PSOCKET_INFORMATION ParentSocket
;
127 DWORD SequenceNumber
;
128 IO_STATUS_BLOCK IoStatusBlock
;
129 AFD_POLL_INFO AsyncSelectInfo
;
130 } ASYNC_DATA
, *PASYNC_DATA
;
132 typedef struct _AFDAPCCONTEXT
134 LPWSAOVERLAPPED lpOverlapped
;
135 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
;
136 PSOCKET_INFORMATION lpSocket
;
137 } AFDAPCCONTEXT
, *PAFDAPCCONTEXT
;
144 IN OUT LPINT addrlen
,
145 IN LPCONDITIONPROC lpfnCondition
,
146 IN DWORD dwCallbackData
,
152 IN LPSOCKADDR lpsaAddress
,
153 IN DWORD dwAddressLength
,
154 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
155 OUT LPWSTR lpszAddressString
,
156 IN OUT LPDWORD lpdwAddressStringLength
,
171 IN CONST SOCKADDR
*name
,
177 WSPCancelBlockingCall(
195 IN CONST SOCKADDR
*name
,
197 IN LPWSABUF lpCallerData
,
198 OUT LPWSABUF lpCalleeData
,
207 IN DWORD dwProcessId
,
208 OUT LPWSAPROTOCOL_INFOW lpProtocolInfo
,
213 WSPEnumNetworkEvents(
215 IN WSAEVENT hEventObject
,
216 OUT LPWSANETWORKEVENTS lpNetworkEvents
,
223 IN WSAEVENT hEventObject
,
224 IN LONG lNetworkEvents
,
229 WSPGetOverlappedResult(
231 IN LPWSAOVERLAPPED lpOverlapped
,
232 OUT LPDWORD lpcbTransfer
,
234 OUT LPDWORD lpdwFlags
,
242 IN OUT LPINT namelen
,
249 IN OUT LPWSABUF lpQOSName
,
258 IN OUT LPINT namelen
,
267 OUT CHAR FAR
* optval
,
275 IN DWORD dwIoControlCode
,
276 IN LPVOID lpvInBuffer
,
278 OUT LPVOID lpvOutBuffer
,
279 IN DWORD cbOutBuffer
,
280 OUT LPDWORD lpcbBytesReturned
,
281 IN LPWSAOVERLAPPED lpOverlapped
,
282 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
283 IN LPWSATHREADID lpThreadId
,
290 IN CONST SOCKADDR
*name
,
292 IN LPWSABUF lpCallerData
,
293 OUT LPWSABUF lpCalleeData
,
310 IN OUT LPWSABUF lpBuffers
,
311 IN DWORD dwBufferCount
,
312 OUT LPDWORD lpNumberOfBytesRecvd
,
313 IN OUT LPDWORD lpFlags
,
314 IN LPWSAOVERLAPPED lpOverlapped
,
315 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
316 IN LPWSATHREADID lpThreadId
,
323 OUT LPWSABUF lpInboundDisconnectData
,
330 IN OUT LPWSABUF lpBuffers
,
331 IN DWORD dwBufferCount
,
332 OUT LPDWORD lpNumberOfBytesRecvd
,
333 IN OUT LPDWORD lpFlags
,
334 OUT LPSOCKADDR lpFrom
,
335 IN OUT LPINT lpFromlen
,
336 IN LPWSAOVERLAPPED lpOverlapped
,
337 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
338 IN LPWSATHREADID lpThreadId
,
345 IN OUT fd_set
*readfds
,
346 IN OUT fd_set
*writefds
,
347 IN OUT fd_set
*exceptfds
,
348 IN CONST
struct timeval
*timeout
,
355 IN LPWSABUF lpBuffers
,
356 IN DWORD dwBufferCount
,
357 OUT LPDWORD lpNumberOfBytesSent
,
359 IN LPWSAOVERLAPPED lpOverlapped
,
360 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
361 IN LPWSATHREADID lpThreadId
,
368 IN LPWSABUF lpOutboundDisconnectData
,
375 IN LPWSABUF lpBuffers
,
376 IN DWORD dwBufferCount
,
377 OUT LPDWORD lpNumberOfBytesSent
,
379 IN CONST SOCKADDR
*lpTo
,
381 IN LPWSAOVERLAPPED lpOverlapped
,
382 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
383 IN LPWSATHREADID lpThreadId
,
392 IN CONST CHAR FAR
* optval
,
409 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
417 IN LPWSTR AddressString
,
418 IN INT AddressFamily
,
419 IN LPWSAPROTOCOL_INFOW lpProtocolInfo
,
420 OUT LPSOCKADDR lpAddress
,
421 IN OUT LPINT lpAddressLength
,
425 PSOCKET_INFORMATION
GetSocketStructure(
429 INT
TranslateNtStatusError( NTSTATUS Status
);
431 VOID
DeleteSocketStructure( SOCKET Handle
);
433 int GetSocketInformation(
434 PSOCKET_INFORMATION Socket
,
435 ULONG AfdInformationClass
,
436 PBOOLEAN Boolean OPTIONAL
,
437 PULONG Ulong OPTIONAL
,
438 PLARGE_INTEGER LargeInteger OPTIONAL
,
439 LPWSAOVERLAPPED Overlapped OPTIONAL
,
440 LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
443 int SetSocketInformation(
444 PSOCKET_INFORMATION Socket
,
445 ULONG AfdInformationClass
,
446 PBOOLEAN Boolean OPTIONAL
,
447 PULONG Ulong OPTIONAL
,
448 PLARGE_INTEGER LargeInteger OPTIONAL
,
449 LPWSAOVERLAPPED Overlapped OPTIONAL
,
450 LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
454 PSOCKET_INFORMATION Socket
462 SockProcessAsyncSelect(
463 PSOCKET_INFORMATION Socket
,
464 PASYNC_DATA AsyncData
468 SockAsyncSelectCompletionRoutine(
470 PIO_STATUS_BLOCK IoStatusBlock
474 SockCreateOrReferenceAsyncThread(
478 BOOLEAN
SockGetAsyncSelectHelperAfdHandle(
482 VOID
SockProcessQueuedAsyncSelect(
484 PIO_STATUS_BLOCK IoStatusBlock
488 SockReenableAsyncSelectEvent (
489 IN PSOCKET_INFORMATION Socket
,
493 typedef VOID (*PASYNC_COMPLETION_ROUTINE
)(PVOID Context
, PIO_STATUS_BLOCK IoStatusBlock
);
497 MsafdReturnWithErrno(NTSTATUS Status
,
500 LPDWORD ReturnedBytes
)
504 *Errno
= TranslateNtStatusError(Status
);
507 *ReturnedBytes
= (*Errno
== 0) ? Received
: 0;
509 return (*Errno
== 0) ? 0 : SOCKET_ERROR
;
513 DbgPrint("%s: Received invalid lpErrno pointer!\n", __FUNCTION__
);
516 *ReturnedBytes
= (Status
== STATUS_SUCCESS
) ? Received
: 0;
518 return (Status
== STATUS_SUCCESS
) ? 0 : SOCKET_ERROR
;
522 #endif /* __MSAFD_H */