1 /* 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 6 */ 7 8 #ifndef __MSAFD_H 9 #define __MSAFD_H 10 11 #include <stdarg.h> 12 13 #define WIN32_NO_STATUS 14 #define _INC_WINDOWS 15 #define COM_NO_WINDOWS_H 16 17 #include <windef.h> 18 #include <winbase.h> 19 #include <ws2spi.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> 25 26 /* This includes ntsecapi.h so it needs to come after the NDK */ 27 #include <wsahelp.h> 28 #include <tdi.h> 29 #include <afd/shared.h> 30 #include <mswsock.h> 31 32 #include <wine/debug.h> 33 WINE_DEFAULT_DEBUG_CHANNEL(msafd); 34 35 #include "include/helpers.h" 36 37 extern HANDLE GlobalHeap; 38 extern WSPUPCALLTABLE Upcalls; 39 extern LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest; 40 extern LIST_ENTRY SockHelpersListHead; 41 extern HANDLE SockEvent; 42 extern HANDLE SockAsyncCompletionPort; 43 extern BOOLEAN SockAsyncSelectCalled; 44 45 typedef enum _SOCKET_STATE { 46 SocketOpen, 47 SocketBound, 48 SocketBoundUdp, 49 SocketConnected, 50 SocketClosed 51 } SOCKET_STATE, *PSOCKET_STATE; 52 53 typedef struct _SOCK_SHARED_INFO { 54 SOCKET_STATE State; 55 LONG RefCount; 56 INT AddressFamily; 57 INT SocketType; 58 INT Protocol; 59 INT SizeOfLocalAddress; 60 INT SizeOfRemoteAddress; 61 struct linger LingerData; 62 ULONG SendTimeout; 63 ULONG RecvTimeout; 64 ULONG SizeOfRecvBuffer; 65 ULONG SizeOfSendBuffer; 66 ULONG ConnectTime; 67 struct { 68 BOOLEAN Listening:1; 69 BOOLEAN Broadcast:1; 70 BOOLEAN Debug:1; 71 BOOLEAN OobInline:1; 72 BOOLEAN ReuseAddresses:1; 73 BOOLEAN ExclusiveAddressUse:1; 74 BOOLEAN NonBlocking:1; 75 BOOLEAN DontUseWildcard:1; 76 BOOLEAN ReceiveShutdown:1; 77 BOOLEAN SendShutdown:1; 78 BOOLEAN UseDelayedAcceptance:1; 79 BOOLEAN UseSAN:1; 80 }; // Flags 81 DWORD CreateFlags; 82 DWORD ServiceFlags1; 83 DWORD ProviderFlags; 84 GROUP GroupID; 85 DWORD GroupType; 86 INT GroupPriority; 87 INT SocketLastError; 88 HWND hWnd; 89 LONG Unknown; 90 DWORD SequenceNumber; 91 UINT wMsg; 92 LONG AsyncEvents; 93 LONG AsyncDisabledEvents; 94 SOCKADDR WSLocalAddress; 95 SOCKADDR WSRemoteAddress; 96 } SOCK_SHARED_INFO, *PSOCK_SHARED_INFO; 97 98 typedef struct _SOCKET_INFORMATION { 99 SOCKET Handle; 100 PSOCK_SHARED_INFO SharedData; 101 HANDLE SharedDataHandle; 102 DWORD HelperEvents; 103 PHELPER_DATA HelperData; 104 PVOID HelperContext; 105 PSOCKADDR LocalAddress; 106 PSOCKADDR RemoteAddress; 107 HANDLE TdiAddressHandle; 108 HANDLE TdiConnectionHandle; 109 PVOID AsyncData; 110 HANDLE EventObject; 111 LONG NetworkEvents; 112 CRITICAL_SECTION Lock; 113 PVOID SanData; 114 BOOL TrySAN; 115 WSAPROTOCOL_INFOW ProtocolInfo; 116 struct _SOCKET_INFORMATION *NextSocket; 117 } SOCKET_INFORMATION, *PSOCKET_INFORMATION; 118 119 120 typedef struct _SOCKET_CONTEXT { 121 SOCK_SHARED_INFO SharedData; 122 ULONG SizeOfHelperData; 123 ULONG Padding; 124 SOCKADDR LocalAddress; 125 SOCKADDR RemoteAddress; 126 /* Plus Helper Data */ 127 } SOCKET_CONTEXT, *PSOCKET_CONTEXT; 128 129 typedef struct _ASYNC_DATA { 130 PSOCKET_INFORMATION ParentSocket; 131 DWORD SequenceNumber; 132 IO_STATUS_BLOCK IoStatusBlock; 133 AFD_POLL_INFO AsyncSelectInfo; 134 } ASYNC_DATA, *PASYNC_DATA; 135 136 typedef struct _AFDAPCCONTEXT 137 { 138 LPWSAOVERLAPPED lpOverlapped; 139 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine; 140 PSOCKET_INFORMATION lpSocket; 141 } AFDAPCCONTEXT, *PAFDAPCCONTEXT; 142 143 SOCKET 144 WSPAPI 145 WSPAccept( 146 IN SOCKET s, 147 OUT LPSOCKADDR addr, 148 IN OUT LPINT addrlen, 149 IN LPCONDITIONPROC lpfnCondition, 150 IN DWORD dwCallbackData, 151 OUT LPINT lpErrno); 152 153 INT 154 WSPAPI 155 WSPAddressToString( 156 IN LPSOCKADDR lpsaAddress, 157 IN DWORD dwAddressLength, 158 IN LPWSAPROTOCOL_INFOW lpProtocolInfo, 159 OUT LPWSTR lpszAddressString, 160 IN OUT LPDWORD lpdwAddressStringLength, 161 OUT LPINT lpErrno); 162 163 INT 164 WSPAPI 165 WSPAsyncSelect( 166 IN SOCKET s, 167 IN HWND hWnd, 168 IN UINT wMsg, 169 IN LONG lEvent, 170 OUT LPINT lpErrno); 171 172 INT 173 WSPAPI WSPBind( 174 IN SOCKET s, 175 IN CONST SOCKADDR *name, 176 IN INT namelen, 177 OUT LPINT lpErrno); 178 179 INT 180 WSPAPI 181 WSPCancelBlockingCall( 182 OUT LPINT lpErrno); 183 184 INT 185 WSPAPI 186 WSPCleanup( 187 OUT LPINT lpErrno); 188 189 INT 190 WSPAPI 191 WSPCloseSocket( 192 IN SOCKET s, 193 OUT LPINT lpErrno); 194 195 INT 196 WSPAPI 197 WSPConnect( 198 IN SOCKET s, 199 IN CONST SOCKADDR *name, 200 IN INT namelen, 201 IN LPWSABUF lpCallerData, 202 OUT LPWSABUF lpCalleeData, 203 IN LPQOS lpSQOS, 204 IN LPQOS lpGQOS, 205 OUT LPINT lpErrno); 206 207 INT 208 WSPAPI 209 WSPDuplicateSocket( 210 IN SOCKET s, 211 IN DWORD dwProcessId, 212 OUT LPWSAPROTOCOL_INFOW lpProtocolInfo, 213 OUT LPINT lpErrno); 214 215 INT 216 WSPAPI 217 WSPEnumNetworkEvents( 218 IN SOCKET s, 219 IN WSAEVENT hEventObject, 220 OUT LPWSANETWORKEVENTS lpNetworkEvents, 221 OUT LPINT lpErrno); 222 223 INT 224 WSPAPI 225 WSPEventSelect( 226 IN SOCKET s, 227 IN WSAEVENT hEventObject, 228 IN LONG lNetworkEvents, 229 OUT LPINT lpErrno); 230 231 BOOL 232 WSPAPI 233 WSPGetOverlappedResult( 234 IN SOCKET s, 235 IN LPWSAOVERLAPPED lpOverlapped, 236 OUT LPDWORD lpcbTransfer, 237 IN BOOL fWait, 238 OUT LPDWORD lpdwFlags, 239 OUT LPINT lpErrno); 240 241 INT 242 WSPAPI 243 WSPGetPeerName( 244 IN SOCKET s, 245 OUT LPSOCKADDR name, 246 IN OUT LPINT namelen, 247 OUT LPINT lpErrno); 248 249 BOOL 250 WSPAPI 251 WSPGetQOSByName( 252 IN SOCKET s, 253 IN OUT LPWSABUF lpQOSName, 254 OUT LPQOS lpQOS, 255 OUT LPINT lpErrno); 256 257 INT 258 WSPAPI 259 WSPGetSockName( 260 IN SOCKET s, 261 OUT LPSOCKADDR name, 262 IN OUT LPINT namelen, 263 OUT LPINT lpErrno); 264 265 INT 266 WSPAPI 267 WSPGetSockOpt( 268 IN SOCKET s, 269 IN INT level, 270 IN INT optname, 271 OUT CHAR FAR* optval, 272 IN OUT LPINT optlen, 273 OUT LPINT lpErrno); 274 275 INT 276 WSPAPI 277 WSPIoctl( 278 IN SOCKET s, 279 IN DWORD dwIoControlCode, 280 IN LPVOID lpvInBuffer, 281 IN DWORD cbInBuffer, 282 OUT LPVOID lpvOutBuffer, 283 IN DWORD cbOutBuffer, 284 OUT LPDWORD lpcbBytesReturned, 285 IN LPWSAOVERLAPPED lpOverlapped, 286 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, 287 IN LPWSATHREADID lpThreadId, 288 OUT LPINT lpErrno); 289 290 SOCKET 291 WSPAPI 292 WSPJoinLeaf( 293 IN SOCKET s, 294 IN CONST SOCKADDR *name, 295 IN INT namelen, 296 IN LPWSABUF lpCallerData, 297 OUT LPWSABUF lpCalleeData, 298 IN LPQOS lpSQOS, 299 IN LPQOS lpGQOS, 300 IN DWORD dwFlags, 301 OUT LPINT lpErrno); 302 303 INT 304 WSPAPI 305 WSPListen( 306 IN SOCKET s, 307 IN INT backlog, 308 OUT LPINT lpErrno); 309 310 INT 311 WSPAPI 312 WSPRecv( 313 IN SOCKET s, 314 IN OUT LPWSABUF lpBuffers, 315 IN DWORD dwBufferCount, 316 OUT LPDWORD lpNumberOfBytesRecvd, 317 IN OUT LPDWORD lpFlags, 318 IN LPWSAOVERLAPPED lpOverlapped, 319 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, 320 IN LPWSATHREADID lpThreadId, 321 OUT LPINT lpErrno); 322 323 INT 324 WSPAPI 325 WSPRecvDisconnect( 326 IN SOCKET s, 327 OUT LPWSABUF lpInboundDisconnectData, 328 OUT LPINT lpErrno); 329 330 INT 331 WSPAPI 332 WSPRecvFrom( 333 IN SOCKET s, 334 IN OUT LPWSABUF lpBuffers, 335 IN DWORD dwBufferCount, 336 OUT LPDWORD lpNumberOfBytesRecvd, 337 IN OUT LPDWORD lpFlags, 338 OUT LPSOCKADDR lpFrom, 339 IN OUT LPINT lpFromlen, 340 IN LPWSAOVERLAPPED lpOverlapped, 341 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, 342 IN LPWSATHREADID lpThreadId, 343 OUT LPINT lpErrno); 344 345 INT 346 WSPAPI 347 WSPSelect( 348 IN INT nfds, 349 IN OUT fd_set *readfds, 350 IN OUT fd_set *writefds, 351 IN OUT fd_set *exceptfds, 352 IN CONST struct timeval *timeout, 353 OUT LPINT lpErrno); 354 355 INT 356 WSPAPI 357 WSPSend( 358 IN SOCKET s, 359 IN LPWSABUF lpBuffers, 360 IN DWORD dwBufferCount, 361 OUT LPDWORD lpNumberOfBytesSent, 362 IN DWORD dwFlags, 363 IN LPWSAOVERLAPPED lpOverlapped, 364 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, 365 IN LPWSATHREADID lpThreadId, 366 OUT LPINT lpErrno); 367 368 INT 369 WSPAPI 370 WSPSendDisconnect( 371 IN SOCKET s, 372 IN LPWSABUF lpOutboundDisconnectData, 373 OUT LPINT lpErrno); 374 375 INT 376 WSPAPI 377 WSPSendTo( 378 IN SOCKET s, 379 IN LPWSABUF lpBuffers, 380 IN DWORD dwBufferCount, 381 OUT LPDWORD lpNumberOfBytesSent, 382 IN DWORD dwFlags, 383 IN CONST SOCKADDR *lpTo, 384 IN INT iTolen, 385 IN LPWSAOVERLAPPED lpOverlapped, 386 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, 387 IN LPWSATHREADID lpThreadId, 388 OUT LPINT lpErrno); 389 390 INT 391 WSPAPI 392 WSPSetSockOpt( 393 IN SOCKET s, 394 IN INT level, 395 IN INT optname, 396 IN CONST CHAR FAR* optval, 397 IN INT optlen, 398 OUT LPINT lpErrno); 399 400 INT 401 WSPAPI 402 WSPShutdown( 403 IN SOCKET s, 404 IN INT how, 405 OUT LPINT lpErrno); 406 407 SOCKET 408 WSPAPI 409 WSPSocket( 410 IN INT af, 411 IN INT type, 412 IN INT protocol, 413 IN LPWSAPROTOCOL_INFOW lpProtocolInfo, 414 IN GROUP g, 415 IN DWORD dwFlags, 416 OUT LPINT lpErrno); 417 418 INT 419 WSPAPI 420 WSPStringToAddress( 421 IN LPWSTR AddressString, 422 IN INT AddressFamily, 423 IN LPWSAPROTOCOL_INFOW lpProtocolInfo, 424 OUT LPSOCKADDR lpAddress, 425 IN OUT LPINT lpAddressLength, 426 OUT LPINT lpErrno); 427 428 429 PSOCKET_INFORMATION GetSocketStructure( 430 SOCKET Handle 431 ); 432 433 INT TranslateNtStatusError( NTSTATUS Status ); 434 435 VOID DeleteSocketStructure( SOCKET Handle ); 436 437 int GetSocketInformation( 438 PSOCKET_INFORMATION Socket, 439 ULONG AfdInformationClass, 440 PBOOLEAN Boolean OPTIONAL, 441 PULONG Ulong OPTIONAL, 442 PLARGE_INTEGER LargeInteger OPTIONAL, 443 LPWSAOVERLAPPED Overlapped OPTIONAL, 444 LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL 445 ); 446 447 int SetSocketInformation( 448 PSOCKET_INFORMATION Socket, 449 ULONG AfdInformationClass, 450 PBOOLEAN Boolean OPTIONAL, 451 PULONG Ulong OPTIONAL, 452 PLARGE_INTEGER LargeInteger OPTIONAL, 453 LPWSAOVERLAPPED Overlapped OPTIONAL, 454 LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL 455 ); 456 457 int CreateContext( 458 PSOCKET_INFORMATION Socket 459 ); 460 461 ULONG 462 NTAPI 463 SockAsyncThread( 464 PVOID ThreadParam 465 ); 466 467 VOID 468 SockProcessAsyncSelect( 469 PSOCKET_INFORMATION Socket, 470 PASYNC_DATA AsyncData 471 ); 472 473 VOID 474 SockAsyncSelectCompletionRoutine( 475 PVOID Context, 476 PIO_STATUS_BLOCK IoStatusBlock 477 ); 478 479 BOOLEAN 480 SockCreateOrReferenceAsyncThread( 481 VOID 482 ); 483 484 BOOLEAN SockGetAsyncSelectHelperAfdHandle( 485 VOID 486 ); 487 488 VOID SockProcessQueuedAsyncSelect( 489 PVOID Context, 490 PIO_STATUS_BLOCK IoStatusBlock 491 ); 492 493 VOID 494 SockReenableAsyncSelectEvent ( 495 IN PSOCKET_INFORMATION Socket, 496 IN ULONG Event 497 ); 498 499 typedef VOID (*PASYNC_COMPLETION_ROUTINE)(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock); 500 501 FORCEINLINE 502 DWORD 503 MsafdReturnWithErrno(NTSTATUS Status, 504 LPINT Errno, 505 DWORD Received, 506 LPDWORD ReturnedBytes) 507 { 508 if (Errno) 509 { 510 *Errno = TranslateNtStatusError(Status); 511 512 if (ReturnedBytes) 513 *ReturnedBytes = (*Errno == 0) ? Received : 0; 514 515 return (*Errno == 0) ? 0 : SOCKET_ERROR; 516 } 517 else 518 { 519 DbgPrint("%s: Received invalid lpErrno pointer!\n", __FUNCTION__); 520 521 if (ReturnedBytes) 522 *ReturnedBytes = (Status == STATUS_SUCCESS) ? Received : 0; 523 524 return (Status == STATUS_SUCCESS) ? 0 : SOCKET_ERROR; 525 } 526 } 527 528 #endif /* __MSAFD_H */ 529