- Merge aicom-network-fixes up to r36740
[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 != NULL)
111 && (SockaddrLength == sizeof(SOCKADDR_IN))
112 && (ipv4->sin_family == AF_INET)
113 && (SockaddrInfo != NULL))
114 {
115
116 switch (ntohl(ipv4->sin_addr.s_addr))
117 {
118 case INADDR_ANY:
119 SockaddrInfo->AddressInfo = SockaddrAddressInfoWildcard;
120 break;
121
122 case INADDR_BROADCAST:
123 SockaddrInfo->AddressInfo = SockaddrAddressInfoBroadcast;
124 break;
125
126 case INADDR_LOOPBACK:
127 SockaddrInfo->AddressInfo = SockaddrAddressInfoLoopback;
128 break;
129
130 default:
131 SockaddrInfo->AddressInfo = SockaddrAddressInfoNormal;
132 break;
133 }
134
135 SockaddrInfo->EndpointInfo = SockaddrEndpointInfoNormal;
136 if (ntohs(ipv4->sin_port) == 0)
137 SockaddrInfo->EndpointInfo = SockaddrEndpointInfoWildcard;
138 if (ntohs(ipv4->sin_port) < IPPORT_RESERVED)
139 SockaddrInfo->EndpointInfo = SockaddrEndpointInfoReserved;
140
141 return 0;
142 }
143
144 DPRINT1("FIXME WSHGetSockaddrType Unsupported Address Family or bad parameters\n");
145 if (SockaddrInfo != NULL)
146 {
147 SockaddrInfo->AddressInfo = SockaddrAddressInfoNormal;
148 SockaddrInfo->EndpointInfo = SockaddrEndpointInfoNormal;
149 }
150
151 DPRINT1("Size of Address Family %d \n",SockaddrLength);
152
153 DPRINT1("FIXME WSHGetSockaddrType return Winsock error, but we do not return any error\n");
154 return 0;
155 }
156
157
158
159
160
161 INT
162 EXPORT
163 WSHGetSocketInformation(
164 IN PVOID HelperDllSocketContext,
165 IN SOCKET SocketHandle,
166 IN HANDLE TdiAddressObjectHandle,
167 IN HANDLE TdiConnectionObjectHandle,
168 IN INT Level,
169 IN INT OptionName,
170 OUT PCHAR OptionValue,
171 OUT INT OptionLength)
172 {
173 UNIMPLEMENTED
174
175 return 0;
176 }
177
178
179 INT
180 EXPORT
181 WSHGetWildcardSockaddr(
182 IN PVOID HelperDllSocketContext,
183 OUT PSOCKADDR Sockaddr,
184 OUT PINT SockaddrLength)
185 {
186 RtlZeroMemory((PVOID)Sockaddr, *SockaddrLength);
187 Sockaddr->sa_family = AF_INET;
188 return 0;
189 }
190
191
192 DWORD
193 EXPORT
194 WSHGetWinsockMapping(
195 OUT PWINSOCK_MAPPING Mapping,
196 IN DWORD MappingLength)
197 {
198 UNIMPLEMENTED
199
200 return 0;
201 }
202
203
204 INT
205 EXPORT
206 WSHGetWSAProtocolInfo(
207 IN LPWSTR ProviderName,
208 OUT LPWSAPROTOCOL_INFOW *ProtocolInfo,
209 OUT LPDWORD ProtocolInfoEntries)
210 {
211 UNIMPLEMENTED
212
213 return 0;
214 }
215
216
217 INT
218 EXPORT
219 WSHIoctl(
220 IN PVOID HelperDllSocketContext,
221 IN SOCKET SocketHandle,
222 IN HANDLE TdiAddressObjectHandle,
223 IN HANDLE TdiConnectionObjectHandle,
224 IN DWORD IoControlCode,
225 IN LPVOID InputBuffer,
226 IN DWORD InputBufferLength,
227 IN LPVOID OutputBuffer,
228 IN DWORD OutputBufferLength,
229 OUT LPDWORD NumberOfBytesReturned,
230 IN LPWSAOVERLAPPED Overlapped,
231 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine,
232 OUT LPBOOL NeedsCompletion)
233 {
234 UNIMPLEMENTED
235
236 return 0;
237 }
238
239
240 INT
241 EXPORT
242 WSHJoinLeaf(
243 IN PVOID HelperDllSocketContext,
244 IN SOCKET SocketHandle,
245 IN HANDLE TdiAddressObjectHandle,
246 IN HANDLE TdiConnectionObjectHandle,
247 IN PVOID LeafHelperDllSocketContext,
248 IN SOCKET LeafSocketHandle,
249 IN PSOCKADDR Sockaddr,
250 IN DWORD SockaddrLength,
251 IN LPWSABUF CallerData,
252 IN LPWSABUF CalleeData,
253 IN LPQOS SocketQOS,
254 IN LPQOS GroupQOS,
255 IN DWORD Flags)
256 {
257 UNIMPLEMENTED
258
259 return 0;
260 }
261
262
263 INT
264 EXPORT
265 WSHNotify(
266 IN PVOID HelperDllSocketContext,
267 IN SOCKET SocketHandle,
268 IN HANDLE TdiAddressObjectHandle,
269 IN HANDLE TdiConnectionObjectHandle,
270 IN DWORD NotifyEvent)
271 {
272 UNIMPLEMENTED
273
274 return 0;
275 }
276
277
278 INT
279 EXPORT
280 WSHOpenSocket(
281 IN OUT PINT AddressFamily,
282 IN OUT PINT SocketType,
283 IN OUT PINT Protocol,
284 OUT PUNICODE_STRING TransportDeviceName,
285 OUT PVOID HelperDllSocketContext,
286 OUT PDWORD NotificationEvents)
287 /*
288 * FUNCTION: Opens a socket
289 */
290 {
291 return WSHOpenSocket2(AddressFamily,
292 SocketType,
293 Protocol,
294 0,
295 0,
296 TransportDeviceName,
297 HelperDllSocketContext,
298 NotificationEvents);
299 }
300
301
302 INT
303 EXPORT
304 WSHOpenSocket2(
305 OUT PINT AddressFamily,
306 IN OUT PINT SocketType,
307 IN OUT PINT Protocol,
308 IN GROUP Group,
309 IN DWORD Flags,
310 OUT PUNICODE_STRING TransportDeviceName,
311 OUT PVOID *HelperDllSocketContext,
312 OUT PDWORD NotificationEvents)
313 /*
314 * FUNCTION: Opens a socket
315 * ARGUMENTS:
316 * AddressFamily = Address of buffer with address family (updated)
317 * SocketType = Address of buffer with type of socket (updated)
318 * Protocol = Address of buffer with protocol number (updated)
319 * Group = Socket group
320 * Flags = Socket flags
321 * TransportDeviceName = Address of buffer to place name of transport device
322 * HelperDllSocketContext = Address of buffer to place socket context pointer
323 * NotificationEvents = Address of buffer to place flags for event notification
324 * RETURNS:
325 * Status of operation
326 * NOTES:
327 * Mapping tripple is returned in an canonicalized form
328 */
329 {
330 PSOCKET_CONTEXT Context;
331 UNICODE_STRING String;
332 UNICODE_STRING TcpDeviceName = RTL_CONSTANT_STRING(DD_TCP_DEVICE_NAME);
333 UNICODE_STRING UdpDeviceName = RTL_CONSTANT_STRING(DD_UDP_DEVICE_NAME);
334 UNICODE_STRING RawDeviceName = RTL_CONSTANT_STRING(DD_RAW_IP_DEVICE_NAME);
335 NTSTATUS Status;
336
337 DPRINT("");
338
339 switch (*SocketType) {
340 case SOCK_STREAM:
341 String = TcpDeviceName;
342 break;
343
344 case SOCK_DGRAM:
345 String = UdpDeviceName;
346 break;
347
348 case SOCK_RAW:
349 if ((*Protocol < 0) || (*Protocol > 255))
350 return WSAEINVAL;
351
352 String = RawDeviceName;
353 break;
354
355 default:
356 return WSAEINVAL;
357 }
358
359 RtlInitUnicodeString(TransportDeviceName, NULL);
360
361 TransportDeviceName->MaximumLength = String.Length + /* Transport device name */
362 (4 * sizeof(WCHAR) + /* Separator and protocol */
363 sizeof(UNICODE_NULL)); /* Terminating null */
364
365 TransportDeviceName->Buffer = HeapAlloc(
366 GetProcessHeap(),
367 0,
368 TransportDeviceName->MaximumLength);
369
370 if (!TransportDeviceName->Buffer)
371 return WSAENOBUFS;
372
373 /* Append the transport device name */
374 Status = RtlAppendUnicodeStringToString(TransportDeviceName, &String);
375
376 if (*SocketType == SOCK_RAW) {
377 /* Append a separator */
378 TransportDeviceName->Buffer[TransportDeviceName->Length / sizeof(WCHAR)] = OBJ_NAME_PATH_SEPARATOR;
379 TransportDeviceName->Length += sizeof(WCHAR);
380 TransportDeviceName->Buffer[TransportDeviceName->Length / sizeof(WCHAR)] = UNICODE_NULL;
381
382 /* Append the protocol number */
383 String.Buffer = TransportDeviceName->Buffer + (TransportDeviceName->Length / sizeof(WCHAR));
384 String.Length = 0;
385 String.MaximumLength = TransportDeviceName->MaximumLength - TransportDeviceName->Length;
386
387 Status = RtlIntegerToUnicodeString((ULONG)*Protocol, 10, &String);
388
389 TransportDeviceName->Length += String.Length;
390 }
391
392 /* Setup a socket context area */
393
394 Context = HeapAlloc(GetProcessHeap(), 0, sizeof(SOCKET_CONTEXT));
395 if (!Context) {
396 RtlFreeUnicodeString(TransportDeviceName);
397 return WSAENOBUFS;
398 }
399
400 Context->AddressFamily = *AddressFamily;
401 Context->SocketType = *SocketType;
402 Context->Protocol = *Protocol;
403 Context->Flags = Flags;
404
405 *HelperDllSocketContext = Context;
406
407 return NO_ERROR;
408 }
409
410
411 INT
412 EXPORT
413 WSHSetSocketInformation(
414 IN PVOID HelperDllSocketContext,
415 IN SOCKET SocketHandle,
416 IN HANDLE TdiAddressObjectHandle,
417 IN HANDLE TdiConnectionObjectHandle,
418 IN INT Level,
419 IN INT OptionName,
420 IN PCHAR OptionValue,
421 IN INT OptionLength)
422 {
423 UNIMPLEMENTED
424
425 return 0;
426 }
427
428
429 INT
430 EXPORT
431 WSHStringToAddress(
432 IN LPWSTR AddressString,
433 IN DWORD AddressFamily,
434 IN LPWSAPROTOCOL_INFOW ProtocolInfo OPTIONAL,
435 OUT LPSOCKADDR Address,
436 IN OUT LPDWORD AddressStringLength)
437 {
438 UNIMPLEMENTED
439
440 return 0;
441 }
442
443 /* EOF */