xref: /reactos/dll/win32/mswsock/extensions.c (revision b36d9bd9)
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