1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS WinSock DLL 4 * FILE: stubs.c 5 * PURPOSE: WSAIoctl wrappers for Microsoft extensions to Winsock 6 * PROGRAMMERS: KJK::Hyperion <hackbunny@reactos.com> 7 * REVISIONS: 8 */ 9 10 #include "precomp.h" 11 12 #include <winsock2.h> 13 #include <mswsock.h> 14 15 LPFN_TRANSMITFILE pfnTransmitFile = NULL; 16 LPFN_GETACCEPTEXSOCKADDRS pfnGetAcceptExSockaddrs = NULL; 17 LPFN_ACCEPTEX pfnAcceptEx = NULL; 18 /* 19 * @implemented 20 */ 21 BOOL 22 WINAPI 23 TransmitFile(SOCKET Socket, 24 HANDLE File, 25 DWORD NumberOfBytesToWrite, 26 DWORD NumberOfBytesPerSend, 27 LPOVERLAPPED Overlapped, 28 LPTRANSMIT_FILE_BUFFERS TransmitBuffers, 29 DWORD Flags) 30 { 31 GUID TransmitFileGUID = WSAID_TRANSMITFILE; 32 DWORD cbBytesReturned; 33 34 if (WSAIoctl(Socket, 35 SIO_GET_EXTENSION_FUNCTION_POINTER, 36 &TransmitFileGUID, 37 sizeof(TransmitFileGUID), 38 &pfnTransmitFile, 39 sizeof(pfnTransmitFile), 40 &cbBytesReturned, 41 NULL, 42 NULL) == SOCKET_ERROR) 43 { 44 return FALSE; 45 } 46 47 return pfnTransmitFile(Socket, 48 File, 49 NumberOfBytesToWrite, 50 NumberOfBytesPerSend, 51 Overlapped, 52 TransmitBuffers, 53 Flags); 54 } 55 56 /* 57 * @implemented 58 */ 59 BOOL 60 WINAPI 61 AcceptEx(SOCKET ListenSocket, 62 SOCKET AcceptSocket, 63 PVOID OutputBuffer, 64 DWORD ReceiveDataLength, 65 DWORD LocalAddressLength, 66 DWORD RemoteAddressLength, 67 LPDWORD BytesReceived, 68 LPOVERLAPPED Overlapped) 69 { 70 GUID AcceptExGUID = WSAID_ACCEPTEX; 71 GUID GetAcceptExSockaddrsGUID = WSAID_GETACCEPTEXSOCKADDRS; 72 DWORD cbBytesReturned; 73 74 if (WSAIoctl(ListenSocket, 75 SIO_GET_EXTENSION_FUNCTION_POINTER, 76 &AcceptExGUID, 77 sizeof(AcceptExGUID), 78 &pfnAcceptEx, 79 sizeof(pfnAcceptEx), 80 &cbBytesReturned, 81 NULL, 82 NULL) == SOCKET_ERROR) 83 { 84 return FALSE; 85 } 86 87 if (WSAIoctl(ListenSocket, 88 SIO_GET_EXTENSION_FUNCTION_POINTER, 89 &GetAcceptExSockaddrsGUID, 90 sizeof(GetAcceptExSockaddrsGUID), 91 &pfnGetAcceptExSockaddrs, 92 sizeof(pfnGetAcceptExSockaddrs), 93 &cbBytesReturned, 94 NULL, 95 NULL) == SOCKET_ERROR) 96 { 97 pfnAcceptEx = NULL; 98 return FALSE; 99 } 100 101 return pfnAcceptEx(ListenSocket, 102 AcceptSocket, 103 OutputBuffer, 104 ReceiveDataLength, 105 LocalAddressLength, 106 RemoteAddressLength, 107 BytesReceived, 108 Overlapped); 109 } 110 111 112 /* 113 * @implemented 114 */ 115 VOID 116 WINAPI 117 GetAcceptExSockaddrs(PVOID OutputBuffer, 118 DWORD ReceiveDataLength, 119 DWORD LocalAddressLength, 120 DWORD RemoteAddressLength, 121 LPSOCKADDR* LocalSockaddr, 122 LPINT LocalSockaddrLength, 123 LPSOCKADDR* RemoteSockaddr, 124 LPINT RemoteSockaddrLength) 125 { 126 if (pfnGetAcceptExSockaddrs) 127 { 128 pfnGetAcceptExSockaddrs(OutputBuffer, 129 ReceiveDataLength, 130 LocalAddressLength, 131 RemoteAddressLength, 132 LocalSockaddr, 133 LocalSockaddrLength, 134 RemoteSockaddr, 135 RemoteSockaddrLength); 136 } 137 } 138 /* EOF */ 139