- Fix parameter checking in WSHGetSockaddrType
[reactos.git] / reactos / dll / win32 / wshtcpip / wshtcpip.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WinSock Helper DLL for TCP/IP
4 * FILE: wshtcpip.c
5 * PURPOSE: DLL entry
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * REVISIONS:
8 * CSH 01/09-2000 Created
9 */
10 #include <wshtcpip.h>
11 #define NDEBUG
12 #include <debug.h>
13
14 BOOL
15 EXPORT
16 DllMain(HANDLE hInstDll,
17 ULONG dwReason,
18 PVOID Reserved)
19 {
20 DPRINT("DllMain of wshtcpip.dll\n");
21
22 switch (dwReason) {
23 case DLL_PROCESS_ATTACH:
24 /* Don't need thread attach notifications
25 so disable them to improve performance */
26 DisableThreadLibraryCalls(hInstDll);
27 break;
28
29 case DLL_THREAD_ATTACH:
30 break;
31
32 case DLL_THREAD_DETACH:
33 break;
34
35 case DLL_PROCESS_DETACH:
36 break;
37 }
38 return TRUE;
39 }
40
41
42 INT
43 EXPORT
44 WSHAddressToString(
45 IN LPSOCKADDR Address,
46 IN INT AddressLength,
47 IN LPWSAPROTOCOL_INFOW ProtocolInfo OPTIONAL,
48 OUT LPWSTR AddressString,
49 IN OUT LPDWORD AddressStringLength)
50 {
51 UNIMPLEMENTED
52
53 return 0;
54 }
55
56
57 INT
58 EXPORT
59 WSHEnumProtocols(
60 IN LPINT lpiProtocols OPTIONAL,
61 IN LPWSTR lpTransportKeyName,
62 IN OUT LPVOID lpProtocolBuffer,
63 IN OUT LPDWORD lpdwBufferLength)
64 {
65 UNIMPLEMENTED
66
67 return 0;
68 }
69
70
71 INT
72 EXPORT
73 WSHGetBroadcastSockaddr(
74 IN PVOID HelperDllSocketContext,
75 OUT PSOCKADDR Sockaddr,
76 OUT PINT SockaddrLength)
77 {
78 UNIMPLEMENTED
79
80 return 0;
81 }
82
83
84 INT
85 EXPORT
86 WSHGetProviderGuid(
87 IN LPWSTR ProviderName,
88 OUT LPGUID ProviderGuid)
89 {
90 UNIMPLEMENTED
91
92 return 0;
93 }
94
95
96 /*
97 Document from OSR how WSHGetSockaddrType works
98 http://www.osronline.com/ddkx/network/37wshfun_5lyq.htm
99 */
100
101 INT
102 EXPORT
103 WSHGetSockaddrType(
104 IN PSOCKADDR Sockaddr,
105 IN DWORD SockaddrLength,
106 OUT PSOCKADDR_INFO SockaddrInfo)
107 {
108 PSOCKADDR_IN ipv4 = (PSOCKADDR_IN)Sockaddr;
109
110 if (!ipv4 || !SockaddrInfo || SockaddrLength < sizeof(SOCKADDR_IN) ||
111 ipv4->sin_family != AF_INET)
112 {
113 DPRINT1("Invalid parameter: %x %x %d %u\n", ipv4, SockaddrInfo, SockaddrLength, (ipv4 ? ipv4->sin_family : 0));
114 return WSAEINVAL;
115 }
116
117 switch (ntohl(ipv4->sin_addr.s_addr))
118 {
119 case INADDR_ANY:
120 SockaddrInfo->AddressInfo = SockaddrAddressInfoWildcard;
121 break;
122
123 case INADDR_BROADCAST:
124 SockaddrInfo->AddressInfo = SockaddrAddressInfoBroadcast;
125 break;
126
127 case INADDR_LOOPBACK:
128 SockaddrInfo->AddressInfo = SockaddrAddressInfoLoopback;
129 break;
130
131 default:
132 SockaddrInfo->AddressInfo = SockaddrAddressInfoNormal;
133 break;
134 }
135
136 if (ntohs(ipv4->sin_port) == 0)
137 SockaddrInfo->EndpointInfo = SockaddrEndpointInfoWildcard;
138 else if (ntohs(ipv4->sin_port) < IPPORT_RESERVED)
139 SockaddrInfo->EndpointInfo = SockaddrEndpointInfoReserved;
140 else
141 SockaddrInfo->EndpointInfo = SockaddrEndpointInfoNormal;
142
143 return 0;
144 }
145
146
147
148
149
150 INT
151 EXPORT
152 WSHGetSocketInformation(
153 IN PVOID HelperDllSocketContext,
154 IN SOCKET SocketHandle,
155 IN HANDLE TdiAddressObjectHandle,
156 IN HANDLE TdiConnectionObjectHandle,
157 IN INT Level,
158 IN INT OptionName,
159 OUT PCHAR OptionValue,
160 OUT INT OptionLength)
161 {
162 UNIMPLEMENTED
163
164 return 0;
165 }
166
167
168 INT
169 EXPORT
170 WSHGetWildcardSockaddr(
171 IN PVOID HelperDllSocketContext,
172 OUT PSOCKADDR Sockaddr,
173 OUT PINT SockaddrLength)
174 {
175 RtlZeroMemory((PVOID)Sockaddr, *SockaddrLength);
176 Sockaddr->sa_family = AF_INET;
177 return 0;
178 }
179
180
181 DWORD
182 EXPORT
183 WSHGetWinsockMapping(
184 OUT PWINSOCK_MAPPING Mapping,
185 IN DWORD MappingLength)
186 {
187 DWORD Rows = 6;
188 DWORD Columns = 3;
189 DWORD Size = 2 * sizeof(DWORD) + Columns * Rows * sizeof(DWORD);
190
191 if (MappingLength < Size)
192 {
193 return Size;
194 }
195
196 Mapping->Rows = Rows;
197 Mapping->Columns = Columns;
198
199 Mapping->Mapping[0].AddressFamily = AF_INET;
200 Mapping->Mapping[0].SocketType = SOCK_STREAM;
201 Mapping->Mapping[0].Protocol = 0;
202
203 Mapping->Mapping[1].AddressFamily = AF_INET;
204 Mapping->Mapping[1].SocketType = SOCK_STREAM;
205 Mapping->Mapping[1].Protocol = IPPROTO_TCP;
206
207 Mapping->Mapping[2].AddressFamily = AF_INET;
208 Mapping->Mapping[2].SocketType = SOCK_DGRAM;
209 Mapping->Mapping[2].Protocol = 0;
210
211 Mapping->Mapping[3].AddressFamily = AF_INET;
212 Mapping->Mapping[3].SocketType = SOCK_DGRAM;
213 Mapping->Mapping[3].Protocol = IPPROTO_UDP;
214
215 Mapping->Mapping[4].AddressFamily = AF_INET;
216 Mapping->Mapping[4].SocketType = SOCK_RAW;
217 Mapping->Mapping[4].Protocol = 0;
218
219 Mapping->Mapping[5].AddressFamily = AF_INET;
220 Mapping->Mapping[5].SocketType = SOCK_RAW;
221 Mapping->Mapping[5].Protocol = IPPROTO_ICMP;
222
223 return 0;
224 }
225
226
227 INT
228 EXPORT
229 WSHGetWSAProtocolInfo(
230 IN LPWSTR ProviderName,
231 OUT LPWSAPROTOCOL_INFOW *ProtocolInfo,
232 OUT LPDWORD ProtocolInfoEntries)
233 {
234 UNIMPLEMENTED
235
236 return 0;
237 }
238
239
240 INT
241 EXPORT
242 WSHIoctl(
243 IN PVOID HelperDllSocketContext,
244 IN SOCKET SocketHandle,
245 IN HANDLE TdiAddressObjectHandle,
246 IN HANDLE TdiConnectionObjectHandle,
247 IN DWORD IoControlCode,
248 IN LPVOID InputBuffer,
249 IN DWORD InputBufferLength,
250 IN LPVOID OutputBuffer,
251 IN DWORD OutputBufferLength,
252 OUT LPDWORD NumberOfBytesReturned,
253 IN LPWSAOVERLAPPED Overlapped,
254 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine,
255 OUT LPBOOL NeedsCompletion)
256 {
257 UNIMPLEMENTED
258
259 return 0;
260 }
261
262
263 INT
264 EXPORT
265 WSHJoinLeaf(
266 IN PVOID HelperDllSocketContext,
267 IN SOCKET SocketHandle,
268 IN HANDLE TdiAddressObjectHandle,
269 IN HANDLE TdiConnectionObjectHandle,
270 IN PVOID LeafHelperDllSocketContext,
271 IN SOCKET LeafSocketHandle,
272 IN PSOCKADDR Sockaddr,
273 IN DWORD SockaddrLength,
274 IN LPWSABUF CallerData,
275 IN LPWSABUF CalleeData,
276 IN LPQOS SocketQOS,
277 IN LPQOS GroupQOS,
278 IN DWORD Flags)
279 {
280 UNIMPLEMENTED
281
282 return 0;
283 }
284
285
286 INT
287 EXPORT
288 WSHNotify(
289 IN PVOID HelperDllSocketContext,
290 IN SOCKET SocketHandle,
291 IN HANDLE TdiAddressObjectHandle,
292 IN HANDLE TdiConnectionObjectHandle,
293 IN DWORD NotifyEvent)
294 {
295 UNIMPLEMENTED
296
297 return 0;
298 }
299
300
301 INT
302 EXPORT
303 WSHOpenSocket(
304 IN OUT PINT AddressFamily,
305 IN OUT PINT SocketType,
306 IN OUT PINT Protocol,
307 OUT PUNICODE_STRING TransportDeviceName,
308 OUT PVOID HelperDllSocketContext,
309 OUT PDWORD NotificationEvents)
310 /*
311 * FUNCTION: Opens a socket
312 */
313 {
314 return WSHOpenSocket2(AddressFamily,
315 SocketType,
316 Protocol,
317 0,
318 0,
319 TransportDeviceName,
320 HelperDllSocketContext,
321 NotificationEvents);
322 }
323
324
325 INT
326 EXPORT
327 WSHOpenSocket2(
328 OUT PINT AddressFamily,
329 IN OUT PINT SocketType,
330 IN OUT PINT Protocol,
331 IN GROUP Group,
332 IN DWORD Flags,
333 OUT PUNICODE_STRING TransportDeviceName,
334 OUT PVOID *HelperDllSocketContext,
335 OUT PDWORD NotificationEvents)
336 /*
337 * FUNCTION: Opens a socket
338 * ARGUMENTS:
339 * AddressFamily = Address of buffer with address family (updated)
340 * SocketType = Address of buffer with type of socket (updated)
341 * Protocol = Address of buffer with protocol number (updated)
342 * Group = Socket group
343 * Flags = Socket flags
344 * TransportDeviceName = Address of buffer to place name of transport device
345 * HelperDllSocketContext = Address of buffer to place socket context pointer
346 * NotificationEvents = Address of buffer to place flags for event notification
347 * RETURNS:
348 * Status of operation
349 * NOTES:
350 * Mapping tripple is returned in an canonicalized form
351 */
352 {
353 PSOCKET_CONTEXT Context;
354 UNICODE_STRING String;
355 UNICODE_STRING TcpDeviceName = RTL_CONSTANT_STRING(DD_TCP_DEVICE_NAME);
356 UNICODE_STRING UdpDeviceName = RTL_CONSTANT_STRING(DD_UDP_DEVICE_NAME);
357 UNICODE_STRING RawDeviceName = RTL_CONSTANT_STRING(DD_RAW_IP_DEVICE_NAME);
358 NTSTATUS Status;
359
360 DPRINT("");
361
362 switch (*SocketType) {
363 case SOCK_STREAM:
364 String = TcpDeviceName;
365 break;
366
367 case SOCK_DGRAM:
368 String = UdpDeviceName;
369 break;
370
371 case SOCK_RAW:
372 if ((*Protocol < 0) || (*Protocol > 255))
373 return WSAEINVAL;
374
375 String = RawDeviceName;
376 break;
377
378 default:
379 return WSAEINVAL;
380 }
381
382 RtlInitUnicodeString(TransportDeviceName, NULL);
383
384 TransportDeviceName->MaximumLength = String.Length + /* Transport device name */
385 (4 * sizeof(WCHAR) + /* Separator and protocol */
386 sizeof(UNICODE_NULL)); /* Terminating null */
387
388 TransportDeviceName->Buffer = HeapAlloc(
389 GetProcessHeap(),
390 0,
391 TransportDeviceName->MaximumLength);
392
393 if (!TransportDeviceName->Buffer)
394 return WSAENOBUFS;
395
396 /* Append the transport device name */
397 Status = RtlAppendUnicodeStringToString(TransportDeviceName, &String);
398
399 if (*SocketType == SOCK_RAW) {
400 /* Append a separator */
401 TransportDeviceName->Buffer[TransportDeviceName->Length / sizeof(WCHAR)] = OBJ_NAME_PATH_SEPARATOR;
402 TransportDeviceName->Length += sizeof(WCHAR);
403 TransportDeviceName->Buffer[TransportDeviceName->Length / sizeof(WCHAR)] = UNICODE_NULL;
404
405 /* Append the protocol number */
406 String.Buffer = TransportDeviceName->Buffer + (TransportDeviceName->Length / sizeof(WCHAR));
407 String.Length = 0;
408 String.MaximumLength = TransportDeviceName->MaximumLength - TransportDeviceName->Length;
409
410 Status = RtlIntegerToUnicodeString((ULONG)*Protocol, 10, &String);
411
412 TransportDeviceName->Length += String.Length;
413 }
414
415 /* Setup a socket context area */
416
417 Context = HeapAlloc(GetProcessHeap(), 0, sizeof(SOCKET_CONTEXT));
418 if (!Context) {
419 RtlFreeUnicodeString(TransportDeviceName);
420 return WSAENOBUFS;
421 }
422
423 Context->AddressFamily = *AddressFamily;
424 Context->SocketType = *SocketType;
425 Context->Protocol = *Protocol;
426 Context->Flags = Flags;
427
428 *HelperDllSocketContext = Context;
429
430 return NO_ERROR;
431 }
432
433
434 INT
435 EXPORT
436 WSHSetSocketInformation(
437 IN PVOID HelperDllSocketContext,
438 IN SOCKET SocketHandle,
439 IN HANDLE TdiAddressObjectHandle,
440 IN HANDLE TdiConnectionObjectHandle,
441 IN INT Level,
442 IN INT OptionName,
443 IN PCHAR OptionValue,
444 IN INT OptionLength)
445 {
446 UNIMPLEMENTED
447
448 return 0;
449 }
450
451
452 INT
453 EXPORT
454 WSHStringToAddress(
455 IN LPWSTR AddressString,
456 IN DWORD AddressFamily,
457 IN LPWSAPROTOCOL_INFOW ProtocolInfo OPTIONAL,
458 OUT LPSOCKADDR Address,
459 IN OUT LPDWORD AddressStringLength)
460 {
461 UNIMPLEMENTED
462
463 return 0;
464 }
465
466 /* EOF */