2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WinSock Helper DLL for TCP/IP
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * CSH 01/09-2000 Created
16 DllMain(HANDLE hInstDll
,
20 DPRINT("DllMain of wshtcpip.dll\n");
23 case DLL_PROCESS_ATTACH
:
24 /* Don't need thread attach notifications
25 so disable them to improve performance */
26 DisableThreadLibraryCalls(hInstDll
);
29 case DLL_THREAD_ATTACH
:
32 case DLL_THREAD_DETACH
:
35 case DLL_PROCESS_DETACH
:
45 IN LPSOCKADDR Address
,
47 IN LPWSAPROTOCOL_INFOW ProtocolInfo OPTIONAL
,
48 OUT LPWSTR AddressString
,
49 IN OUT LPDWORD AddressStringLength
)
60 IN LPINT lpiProtocols OPTIONAL
,
61 IN LPWSTR lpTransportKeyName
,
62 IN OUT LPVOID lpProtocolBuffer
,
63 IN OUT LPDWORD lpdwBufferLength
)
73 WSHGetBroadcastSockaddr(
74 IN PVOID HelperDllSocketContext
,
75 OUT PSOCKADDR Sockaddr
,
76 OUT PINT SockaddrLength
)
87 IN LPWSTR ProviderName
,
88 OUT LPGUID ProviderGuid
)
97 Document from OSR how WSHGetSockaddrType works
98 http://www.osronline.com/ddkx/network/37wshfun_5lyq.htm
104 IN PSOCKADDR Sockaddr
,
105 IN DWORD SockaddrLength
,
106 OUT PSOCKADDR_INFO SockaddrInfo
)
108 PSOCKADDR_IN ipv4
= (PSOCKADDR_IN
)Sockaddr
;
110 if (!ipv4
|| !SockaddrInfo
|| SockaddrLength
< sizeof(SOCKADDR_IN
) ||
111 ipv4
->sin_family
!= AF_INET
)
113 DPRINT1("Invalid parameter: %x %x %d %u\n", ipv4
, SockaddrInfo
, SockaddrLength
, (ipv4
? ipv4
->sin_family
: 0));
117 switch (ntohl(ipv4
->sin_addr
.s_addr
))
120 SockaddrInfo
->AddressInfo
= SockaddrAddressInfoWildcard
;
123 case INADDR_BROADCAST
:
124 SockaddrInfo
->AddressInfo
= SockaddrAddressInfoBroadcast
;
127 case INADDR_LOOPBACK
:
128 SockaddrInfo
->AddressInfo
= SockaddrAddressInfoLoopback
;
132 SockaddrInfo
->AddressInfo
= SockaddrAddressInfoNormal
;
136 if (ntohs(ipv4
->sin_port
) == 0)
137 SockaddrInfo
->EndpointInfo
= SockaddrEndpointInfoWildcard
;
138 else if (ntohs(ipv4
->sin_port
) < IPPORT_RESERVED
)
139 SockaddrInfo
->EndpointInfo
= SockaddrEndpointInfoReserved
;
141 SockaddrInfo
->EndpointInfo
= SockaddrEndpointInfoNormal
;
152 WSHGetSocketInformation(
153 IN PVOID HelperDllSocketContext
,
154 IN SOCKET SocketHandle
,
155 IN HANDLE TdiAddressObjectHandle
,
156 IN HANDLE TdiConnectionObjectHandle
,
159 OUT PCHAR OptionValue
,
160 OUT INT OptionLength
)
170 WSHGetWildcardSockaddr(
171 IN PVOID HelperDllSocketContext
,
172 OUT PSOCKADDR Sockaddr
,
173 OUT PINT SockaddrLength
)
175 RtlZeroMemory((PVOID
)Sockaddr
, *SockaddrLength
);
176 Sockaddr
->sa_family
= AF_INET
;
183 WSHGetWinsockMapping(
184 OUT PWINSOCK_MAPPING Mapping
,
185 IN DWORD MappingLength
)
189 DWORD Size
= 2 * sizeof(DWORD
) + Columns
* Rows
* sizeof(DWORD
);
191 if (MappingLength
< Size
)
196 Mapping
->Rows
= Rows
;
197 Mapping
->Columns
= Columns
;
199 Mapping
->Mapping
[0].AddressFamily
= AF_INET
;
200 Mapping
->Mapping
[0].SocketType
= SOCK_STREAM
;
201 Mapping
->Mapping
[0].Protocol
= 0;
203 Mapping
->Mapping
[1].AddressFamily
= AF_INET
;
204 Mapping
->Mapping
[1].SocketType
= SOCK_STREAM
;
205 Mapping
->Mapping
[1].Protocol
= IPPROTO_TCP
;
207 Mapping
->Mapping
[2].AddressFamily
= AF_INET
;
208 Mapping
->Mapping
[2].SocketType
= SOCK_DGRAM
;
209 Mapping
->Mapping
[2].Protocol
= 0;
211 Mapping
->Mapping
[3].AddressFamily
= AF_INET
;
212 Mapping
->Mapping
[3].SocketType
= SOCK_DGRAM
;
213 Mapping
->Mapping
[3].Protocol
= IPPROTO_UDP
;
215 Mapping
->Mapping
[4].AddressFamily
= AF_INET
;
216 Mapping
->Mapping
[4].SocketType
= SOCK_RAW
;
217 Mapping
->Mapping
[4].Protocol
= 0;
219 Mapping
->Mapping
[5].AddressFamily
= AF_INET
;
220 Mapping
->Mapping
[5].SocketType
= SOCK_RAW
;
221 Mapping
->Mapping
[5].Protocol
= IPPROTO_ICMP
;
229 WSHGetWSAProtocolInfo(
230 IN LPWSTR ProviderName
,
231 OUT LPWSAPROTOCOL_INFOW
*ProtocolInfo
,
232 OUT LPDWORD ProtocolInfoEntries
)
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
)
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
,
289 IN PVOID HelperDllSocketContext
,
290 IN SOCKET SocketHandle
,
291 IN HANDLE TdiAddressObjectHandle
,
292 IN HANDLE TdiConnectionObjectHandle
,
293 IN DWORD NotifyEvent
)
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
)
311 * FUNCTION: Opens a socket
314 return WSHOpenSocket2(AddressFamily
,
320 HelperDllSocketContext
,
328 OUT PINT AddressFamily
,
329 IN OUT PINT SocketType
,
330 IN OUT PINT Protocol
,
333 OUT PUNICODE_STRING TransportDeviceName
,
334 OUT PVOID
*HelperDllSocketContext
,
335 OUT PDWORD NotificationEvents
)
337 * FUNCTION: Opens a socket
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
348 * Status of operation
350 * Mapping tripple is returned in an canonicalized form
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
);
362 switch (*SocketType
) {
364 String
= TcpDeviceName
;
368 String
= UdpDeviceName
;
372 if ((*Protocol
< 0) || (*Protocol
> 255))
375 String
= RawDeviceName
;
382 RtlInitUnicodeString(TransportDeviceName
, NULL
);
384 TransportDeviceName
->MaximumLength
= String
.Length
+ /* Transport device name */
385 (4 * sizeof(WCHAR
) + /* Separator and protocol */
386 sizeof(UNICODE_NULL
)); /* Terminating null */
388 TransportDeviceName
->Buffer
= HeapAlloc(
391 TransportDeviceName
->MaximumLength
);
393 if (!TransportDeviceName
->Buffer
)
396 /* Append the transport device name */
397 Status
= RtlAppendUnicodeStringToString(TransportDeviceName
, &String
);
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
;
405 /* Append the protocol number */
406 String
.Buffer
= TransportDeviceName
->Buffer
+ (TransportDeviceName
->Length
/ sizeof(WCHAR
));
408 String
.MaximumLength
= TransportDeviceName
->MaximumLength
- TransportDeviceName
->Length
;
410 Status
= RtlIntegerToUnicodeString((ULONG
)*Protocol
, 10, &String
);
412 TransportDeviceName
->Length
+= String
.Length
;
415 /* Setup a socket context area */
417 Context
= HeapAlloc(GetProcessHeap(), 0, sizeof(SOCKET_CONTEXT
));
419 RtlFreeUnicodeString(TransportDeviceName
);
423 Context
->AddressFamily
= *AddressFamily
;
424 Context
->SocketType
= *SocketType
;
425 Context
->Protocol
= *Protocol
;
426 Context
->Flags
= Flags
;
428 *HelperDllSocketContext
= Context
;
436 WSHSetSocketInformation(
437 IN PVOID HelperDllSocketContext
,
438 IN SOCKET SocketHandle
,
439 IN HANDLE TdiAddressObjectHandle
,
440 IN HANDLE TdiConnectionObjectHandle
,
443 IN PCHAR OptionValue
,
455 IN LPWSTR AddressString
,
456 IN DWORD AddressFamily
,
457 IN LPWSAPROTOCOL_INFOW ProtocolInfo OPTIONAL
,
458 OUT LPSOCKADDR Address
,
459 IN OUT LPDWORD AddressStringLength
)