Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmsafd.hGo to the documentation of this file.00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Ancillary Function Driver DLL 00004 * FILE: include/msafd.h 00005 * PURPOSE: Ancillary Function Driver DLL header 00006 */ 00007 #ifndef __MSAFD_H 00008 #define __MSAFD_H 00009 00010 #include <stdio.h> 00011 #include <stdlib.h> 00012 00013 #define WIN32_NO_STATUS 00014 #include <winsock2.h> 00015 #include <windows.h> 00016 #include <ws2spi.h> 00017 #define NTOS_MODE_USER 00018 #include <ndk/exfuncs.h> 00019 #include <ndk/iofuncs.h> 00020 #include <ndk/obfuncs.h> 00021 #include <ndk/rtlfuncs.h> 00022 00023 /* This includes ntsecapi.h so it needs to come after the NDK */ 00024 #include <wsahelp.h> 00025 #include <tdi.h> 00026 #include <afd/shared.h> 00027 #include <helpers.h> 00028 00029 #include <debug.h> 00030 00031 extern HANDLE GlobalHeap; 00032 extern WSPUPCALLTABLE Upcalls; 00033 extern LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest; 00034 extern LIST_ENTRY SockHelpersListHead; 00035 extern HANDLE SockEvent; 00036 extern HANDLE SockAsyncCompletionPort; 00037 extern BOOLEAN SockAsyncSelectCalled; 00038 00039 typedef enum _SOCKET_STATE { 00040 SocketOpen, 00041 SocketBound, 00042 SocketBoundUdp, 00043 SocketConnected, 00044 SocketClosed 00045 } SOCKET_STATE, *PSOCKET_STATE; 00046 00047 typedef struct _SOCK_SHARED_INFO { 00048 SOCKET_STATE State; 00049 INT AddressFamily; 00050 INT SocketType; 00051 INT Protocol; 00052 INT SizeOfLocalAddress; 00053 INT SizeOfRemoteAddress; 00054 struct linger LingerData; 00055 ULONG SendTimeout; 00056 ULONG RecvTimeout; 00057 ULONG SizeOfRecvBuffer; 00058 ULONG SizeOfSendBuffer; 00059 struct { 00060 BOOLEAN Listening:1; 00061 BOOLEAN Broadcast:1; 00062 BOOLEAN Debug:1; 00063 BOOLEAN OobInline:1; 00064 BOOLEAN ReuseAddresses:1; 00065 BOOLEAN ExclusiveAddressUse:1; 00066 BOOLEAN NonBlocking:1; 00067 BOOLEAN DontUseWildcard:1; 00068 BOOLEAN ReceiveShutdown:1; 00069 BOOLEAN SendShutdown:1; 00070 BOOLEAN UseDelayedAcceptance:1; 00071 BOOLEAN UseSAN:1; 00072 }; // Flags 00073 DWORD CreateFlags; 00074 DWORD CatalogEntryId; 00075 DWORD ServiceFlags1; 00076 DWORD ProviderFlags; 00077 GROUP GroupID; 00078 DWORD GroupType; 00079 INT GroupPriority; 00080 INT SocketLastError; 00081 HWND hWnd; 00082 LONG Unknown; 00083 DWORD SequenceNumber; 00084 UINT wMsg; 00085 LONG AsyncEvents; 00086 LONG AsyncDisabledEvents; 00087 } SOCK_SHARED_INFO, *PSOCK_SHARED_INFO; 00088 00089 typedef struct _SOCKET_INFORMATION { 00090 ULONG RefCount; 00091 SOCKET Handle; 00092 SOCK_SHARED_INFO SharedData; 00093 DWORD HelperEvents; 00094 PHELPER_DATA HelperData; 00095 PVOID HelperContext; 00096 PSOCKADDR LocalAddress; 00097 PSOCKADDR RemoteAddress; 00098 HANDLE TdiAddressHandle; 00099 HANDLE TdiConnectionHandle; 00100 PVOID AsyncData; 00101 HANDLE EventObject; 00102 LONG NetworkEvents; 00103 CRITICAL_SECTION Lock; 00104 PVOID SanData; 00105 BOOL TrySAN; 00106 SOCKADDR WSLocalAddress; 00107 SOCKADDR WSRemoteAddress; 00108 struct _SOCKET_INFORMATION *NextSocket; 00109 } SOCKET_INFORMATION, *PSOCKET_INFORMATION; 00110 00111 00112 typedef struct _SOCKET_CONTEXT { 00113 SOCK_SHARED_INFO SharedData; 00114 ULONG SizeOfHelperData; 00115 ULONG Padding; 00116 SOCKADDR LocalAddress; 00117 SOCKADDR RemoteAddress; 00118 /* Plus Helper Data */ 00119 } SOCKET_CONTEXT, *PSOCKET_CONTEXT; 00120 00121 typedef struct _ASYNC_DATA { 00122 PSOCKET_INFORMATION ParentSocket; 00123 DWORD SequenceNumber; 00124 IO_STATUS_BLOCK IoStatusBlock; 00125 AFD_POLL_INFO AsyncSelectInfo; 00126 } ASYNC_DATA, *PASYNC_DATA; 00127 00128 SOCKET 00129 WSPAPI 00130 WSPAccept( 00131 IN SOCKET s, 00132 OUT LPSOCKADDR addr, 00133 IN OUT LPINT addrlen, 00134 IN LPCONDITIONPROC lpfnCondition, 00135 IN DWORD dwCallbackData, 00136 OUT LPINT lpErrno); 00137 00138 INT 00139 WSPAPI 00140 WSPAddressToString( 00141 IN LPSOCKADDR lpsaAddress, 00142 IN DWORD dwAddressLength, 00143 IN LPWSAPROTOCOL_INFOW lpProtocolInfo, 00144 OUT LPWSTR lpszAddressString, 00145 IN OUT LPDWORD lpdwAddressStringLength, 00146 OUT LPINT lpErrno); 00147 00148 INT 00149 WSPAPI 00150 WSPAsyncSelect( 00151 IN SOCKET s, 00152 IN HWND hWnd, 00153 IN UINT wMsg, 00154 IN LONG lEvent, 00155 OUT LPINT lpErrno); 00156 00157 INT 00158 WSPAPI WSPBind( 00159 IN SOCKET s, 00160 IN CONST SOCKADDR *name, 00161 IN INT namelen, 00162 OUT LPINT lpErrno); 00163 00164 INT 00165 WSPAPI 00166 WSPCancelBlockingCall( 00167 OUT LPINT lpErrno); 00168 00169 INT 00170 WSPAPI 00171 WSPCleanup( 00172 OUT LPINT lpErrno); 00173 00174 INT 00175 WSPAPI 00176 WSPCloseSocket( 00177 IN SOCKET s, 00178 OUT LPINT lpErrno); 00179 00180 INT 00181 WSPAPI 00182 WSPConnect( 00183 IN SOCKET s, 00184 IN CONST SOCKADDR *name, 00185 IN INT namelen, 00186 IN LPWSABUF lpCallerData, 00187 OUT LPWSABUF lpCalleeData, 00188 IN LPQOS lpSQOS, 00189 IN LPQOS lpGQOS, 00190 OUT LPINT lpErrno); 00191 00192 INT 00193 WSPAPI 00194 WSPDuplicateSocket( 00195 IN SOCKET s, 00196 IN DWORD dwProcessId, 00197 OUT LPWSAPROTOCOL_INFOW lpProtocolInfo, 00198 OUT LPINT lpErrno); 00199 00200 INT 00201 WSPAPI 00202 WSPEnumNetworkEvents( 00203 IN SOCKET s, 00204 IN WSAEVENT hEventObject, 00205 OUT LPWSANETWORKEVENTS lpNetworkEvents, 00206 OUT LPINT lpErrno); 00207 00208 INT 00209 WSPAPI 00210 WSPEventSelect( 00211 IN SOCKET s, 00212 IN WSAEVENT hEventObject, 00213 IN LONG lNetworkEvents, 00214 OUT LPINT lpErrno); 00215 00216 BOOL 00217 WSPAPI 00218 WSPGetOverlappedResult( 00219 IN SOCKET s, 00220 IN LPWSAOVERLAPPED lpOverlapped, 00221 OUT LPDWORD lpcbTransfer, 00222 IN BOOL fWait, 00223 OUT LPDWORD lpdwFlags, 00224 OUT LPINT lpErrno); 00225 00226 INT 00227 WSPAPI 00228 WSPGetPeerName( 00229 IN SOCKET s, 00230 OUT LPSOCKADDR name, 00231 IN OUT LPINT namelen, 00232 OUT LPINT lpErrno); 00233 00234 BOOL 00235 WSPAPI 00236 WSPGetQOSByName( 00237 IN SOCKET s, 00238 IN OUT LPWSABUF lpQOSName, 00239 OUT LPQOS lpQOS, 00240 OUT LPINT lpErrno); 00241 00242 INT 00243 WSPAPI 00244 WSPGetSockName( 00245 IN SOCKET s, 00246 OUT LPSOCKADDR name, 00247 IN OUT LPINT namelen, 00248 OUT LPINT lpErrno); 00249 00250 INT 00251 WSPAPI 00252 WSPGetSockOpt( 00253 IN SOCKET s, 00254 IN INT level, 00255 IN INT optname, 00256 OUT CHAR FAR* optval, 00257 IN OUT LPINT optlen, 00258 OUT LPINT lpErrno); 00259 00260 INT 00261 WSPAPI 00262 WSPIoctl( 00263 IN SOCKET s, 00264 IN DWORD dwIoControlCode, 00265 IN LPVOID lpvInBuffer, 00266 IN DWORD cbInBuffer, 00267 OUT LPVOID lpvOutBuffer, 00268 IN DWORD cbOutBuffer, 00269 OUT LPDWORD lpcbBytesReturned, 00270 IN LPWSAOVERLAPPED lpOverlapped, 00271 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, 00272 IN LPWSATHREADID lpThreadId, 00273 OUT LPINT lpErrno); 00274 00275 SOCKET 00276 WSPAPI 00277 WSPJoinLeaf( 00278 IN SOCKET s, 00279 IN CONST SOCKADDR *name, 00280 IN INT namelen, 00281 IN LPWSABUF lpCallerData, 00282 OUT LPWSABUF lpCalleeData, 00283 IN LPQOS lpSQOS, 00284 IN LPQOS lpGQOS, 00285 IN DWORD dwFlags, 00286 OUT LPINT lpErrno); 00287 00288 INT 00289 WSPAPI 00290 WSPListen( 00291 IN SOCKET s, 00292 IN INT backlog, 00293 OUT LPINT lpErrno); 00294 00295 INT 00296 WSPAPI 00297 WSPRecv( 00298 IN SOCKET s, 00299 IN OUT LPWSABUF lpBuffers, 00300 IN DWORD dwBufferCount, 00301 OUT LPDWORD lpNumberOfBytesRecvd, 00302 IN OUT LPDWORD lpFlags, 00303 IN LPWSAOVERLAPPED lpOverlapped, 00304 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, 00305 IN LPWSATHREADID lpThreadId, 00306 OUT LPINT lpErrno); 00307 00308 INT 00309 WSPAPI 00310 WSPRecvDisconnect( 00311 IN SOCKET s, 00312 OUT LPWSABUF lpInboundDisconnectData, 00313 OUT LPINT lpErrno); 00314 00315 INT 00316 WSPAPI 00317 WSPRecvFrom( 00318 IN SOCKET s, 00319 IN OUT LPWSABUF lpBuffers, 00320 IN DWORD dwBufferCount, 00321 OUT LPDWORD lpNumberOfBytesRecvd, 00322 IN OUT LPDWORD lpFlags, 00323 OUT LPSOCKADDR lpFrom, 00324 IN OUT LPINT lpFromlen, 00325 IN LPWSAOVERLAPPED lpOverlapped, 00326 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, 00327 IN LPWSATHREADID lpThreadId, 00328 OUT LPINT lpErrno); 00329 00330 INT 00331 WSPAPI 00332 WSPSelect( 00333 IN INT nfds, 00334 IN OUT fd_set *readfds, 00335 IN OUT fd_set *writefds, 00336 IN OUT fd_set *exceptfds, 00337 IN CONST struct timeval *timeout, 00338 OUT LPINT lpErrno); 00339 00340 INT 00341 WSPAPI 00342 WSPSend( 00343 IN SOCKET s, 00344 IN LPWSABUF lpBuffers, 00345 IN DWORD dwBufferCount, 00346 OUT LPDWORD lpNumberOfBytesSent, 00347 IN DWORD dwFlags, 00348 IN LPWSAOVERLAPPED lpOverlapped, 00349 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, 00350 IN LPWSATHREADID lpThreadId, 00351 OUT LPINT lpErrno); 00352 00353 INT 00354 WSPAPI 00355 WSPSendDisconnect( 00356 IN SOCKET s, 00357 IN LPWSABUF lpOutboundDisconnectData, 00358 OUT LPINT lpErrno); 00359 00360 INT 00361 WSPAPI 00362 WSPSendTo( 00363 IN SOCKET s, 00364 IN LPWSABUF lpBuffers, 00365 IN DWORD dwBufferCount, 00366 OUT LPDWORD lpNumberOfBytesSent, 00367 IN DWORD dwFlags, 00368 IN CONST SOCKADDR *lpTo, 00369 IN INT iTolen, 00370 IN LPWSAOVERLAPPED lpOverlapped, 00371 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, 00372 IN LPWSATHREADID lpThreadId, 00373 OUT LPINT lpErrno); 00374 00375 INT 00376 WSPAPI 00377 WSPSetSockOpt( 00378 IN SOCKET s, 00379 IN INT level, 00380 IN INT optname, 00381 IN CONST CHAR FAR* optval, 00382 IN INT optlen, 00383 OUT LPINT lpErrno); 00384 00385 INT 00386 WSPAPI 00387 WSPShutdown( 00388 IN SOCKET s, 00389 IN INT how, 00390 OUT LPINT lpErrno); 00391 00392 SOCKET 00393 WSPAPI 00394 WSPSocket( 00395 IN INT af, 00396 IN INT type, 00397 IN INT protocol, 00398 IN LPWSAPROTOCOL_INFOW lpProtocolInfo, 00399 IN GROUP g, 00400 IN DWORD dwFlags, 00401 OUT LPINT lpErrno); 00402 00403 INT 00404 WSPAPI 00405 WSPStringToAddress( 00406 IN LPWSTR AddressString, 00407 IN INT AddressFamily, 00408 IN LPWSAPROTOCOL_INFOW lpProtocolInfo, 00409 OUT LPSOCKADDR lpAddress, 00410 IN OUT LPINT lpAddressLength, 00411 OUT LPINT lpErrno); 00412 00413 00414 PSOCKET_INFORMATION GetSocketStructure( 00415 SOCKET Handle 00416 ); 00417 00418 INT TranslateNtStatusError( NTSTATUS Status ); 00419 00420 VOID DeleteSocketStructure( SOCKET Handle ); 00421 00422 int GetSocketInformation( 00423 PSOCKET_INFORMATION Socket, 00424 ULONG AfdInformationClass, 00425 PBOOLEAN Boolean OPTIONAL, 00426 PULONG Ulong OPTIONAL, 00427 PLARGE_INTEGER LargeInteger OPTIONAL 00428 ); 00429 00430 int SetSocketInformation( 00431 PSOCKET_INFORMATION Socket, 00432 ULONG AfdInformationClass, 00433 PBOOLEAN Boolean OPTIONAL, 00434 PULONG Ulong OPTIONAL, 00435 PLARGE_INTEGER LargeInteger OPTIONAL 00436 ); 00437 00438 int CreateContext( 00439 PSOCKET_INFORMATION Socket 00440 ); 00441 00442 int SockAsyncThread( 00443 PVOID ThreadParam 00444 ); 00445 00446 VOID 00447 SockProcessAsyncSelect( 00448 PSOCKET_INFORMATION Socket, 00449 PASYNC_DATA AsyncData 00450 ); 00451 00452 VOID 00453 SockAsyncSelectCompletionRoutine( 00454 PVOID Context, 00455 PIO_STATUS_BLOCK IoStatusBlock 00456 ); 00457 00458 BOOLEAN 00459 SockCreateOrReferenceAsyncThread( 00460 VOID 00461 ); 00462 00463 BOOLEAN SockGetAsyncSelectHelperAfdHandle( 00464 VOID 00465 ); 00466 00467 VOID SockProcessQueuedAsyncSelect( 00468 PVOID Context, 00469 PIO_STATUS_BLOCK IoStatusBlock 00470 ); 00471 00472 VOID 00473 SockReenableAsyncSelectEvent ( 00474 IN PSOCKET_INFORMATION Socket, 00475 IN ULONG Event 00476 ); 00477 00478 typedef VOID (*PASYNC_COMPLETION_ROUTINE)(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock); 00479 00480 DWORD 00481 FORCEINLINE 00482 MsafdReturnWithErrno(NTSTATUS Status, 00483 LPINT Errno, 00484 DWORD Received, 00485 LPDWORD ReturnedBytes) 00486 { 00487 if (Errno) 00488 { 00489 *Errno = TranslateNtStatusError(Status); 00490 00491 if (ReturnedBytes) 00492 *ReturnedBytes = (*Errno == 0) ? Received : 0; 00493 00494 return (*Errno == 0) ? 0 : SOCKET_ERROR; 00495 } 00496 else 00497 { 00498 DbgPrint("%s: Received invalid lpErrno pointer!\n", __FUNCTION__); 00499 00500 if (ReturnedBytes) 00501 *ReturnedBytes = (Status == STATUS_SUCCESS) ? Received : 0; 00502 00503 return (Status == STATUS_SUCCESS) ? 0 : SOCKET_ERROR; 00504 } 00505 } 00506 00507 #endif /* __MSAFD_H */ 00508 00509 /* EOF */ Generated on Tue May 15 04:47:07 2012 for ReactOS by
1.6.3
|