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
;
111 && (SockaddrLength
== sizeof(SOCKADDR_IN
))
112 && (ipv4
->sin_family
== AF_INET
)
113 && (SockaddrInfo
!= NULL
))
116 switch (ntohl(ipv4
->sin_addr
.s_addr
))
119 SockaddrInfo
->AddressInfo
= SockaddrAddressInfoWildcard
;
122 case INADDR_BROADCAST
:
123 SockaddrInfo
->AddressInfo
= SockaddrAddressInfoBroadcast
;
126 case INADDR_LOOPBACK
:
127 SockaddrInfo
->AddressInfo
= SockaddrAddressInfoLoopback
;
131 SockaddrInfo
->AddressInfo
= SockaddrAddressInfoNormal
;
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
;
144 DPRINT1("FIXME WSHGetSockaddrType Unsupported Address Family or bad parameters\n");
145 if (SockaddrInfo
!= NULL
)
147 SockaddrInfo
->AddressInfo
= SockaddrAddressInfoNormal
;
148 SockaddrInfo
->EndpointInfo
= SockaddrEndpointInfoNormal
;
151 DPRINT1("Size of Address Family %d \n",SockaddrLength
);
153 DPRINT1("FIXME WSHGetSockaddrType return Winsock error, but we do not return any error\n");
163 WSHGetSocketInformation(
164 IN PVOID HelperDllSocketContext
,
165 IN SOCKET SocketHandle
,
166 IN HANDLE TdiAddressObjectHandle
,
167 IN HANDLE TdiConnectionObjectHandle
,
170 OUT PCHAR OptionValue
,
171 OUT INT OptionLength
)
181 WSHGetWildcardSockaddr(
182 IN PVOID HelperDllSocketContext
,
183 OUT PSOCKADDR Sockaddr
,
184 OUT PINT SockaddrLength
)
186 RtlZeroMemory((PVOID
)Sockaddr
, *SockaddrLength
);
187 Sockaddr
->sa_family
= AF_INET
;
194 WSHGetWinsockMapping(
195 OUT PWINSOCK_MAPPING Mapping
,
196 IN DWORD MappingLength
)
206 WSHGetWSAProtocolInfo(
207 IN LPWSTR ProviderName
,
208 OUT LPWSAPROTOCOL_INFOW
*ProtocolInfo
,
209 OUT LPDWORD ProtocolInfoEntries
)
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
)
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
,
266 IN PVOID HelperDllSocketContext
,
267 IN SOCKET SocketHandle
,
268 IN HANDLE TdiAddressObjectHandle
,
269 IN HANDLE TdiConnectionObjectHandle
,
270 IN DWORD NotifyEvent
)
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
)
288 * FUNCTION: Opens a socket
291 return WSHOpenSocket2(AddressFamily
,
297 HelperDllSocketContext
,
305 OUT PINT AddressFamily
,
306 IN OUT PINT SocketType
,
307 IN OUT PINT Protocol
,
310 OUT PUNICODE_STRING TransportDeviceName
,
311 OUT PVOID
*HelperDllSocketContext
,
312 OUT PDWORD NotificationEvents
)
314 * FUNCTION: Opens a socket
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
325 * Status of operation
327 * Mapping tripple is returned in an canonicalized form
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
);
339 switch (*SocketType
) {
341 String
= TcpDeviceName
;
345 String
= UdpDeviceName
;
349 if ((*Protocol
< 0) || (*Protocol
> 255))
352 String
= RawDeviceName
;
359 RtlInitUnicodeString(TransportDeviceName
, NULL
);
361 TransportDeviceName
->MaximumLength
= String
.Length
+ /* Transport device name */
362 (4 * sizeof(WCHAR
) + /* Separator and protocol */
363 sizeof(UNICODE_NULL
)); /* Terminating null */
365 TransportDeviceName
->Buffer
= HeapAlloc(
368 TransportDeviceName
->MaximumLength
);
370 if (!TransportDeviceName
->Buffer
)
373 /* Append the transport device name */
374 Status
= RtlAppendUnicodeStringToString(TransportDeviceName
, &String
);
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
;
382 /* Append the protocol number */
383 String
.Buffer
= TransportDeviceName
->Buffer
+ (TransportDeviceName
->Length
/ sizeof(WCHAR
));
385 String
.MaximumLength
= TransportDeviceName
->MaximumLength
- TransportDeviceName
->Length
;
387 Status
= RtlIntegerToUnicodeString((ULONG
)*Protocol
, 10, &String
);
389 TransportDeviceName
->Length
+= String
.Length
;
392 /* Setup a socket context area */
394 Context
= HeapAlloc(GetProcessHeap(), 0, sizeof(SOCKET_CONTEXT
));
396 RtlFreeUnicodeString(TransportDeviceName
);
400 Context
->AddressFamily
= *AddressFamily
;
401 Context
->SocketType
= *SocketType
;
402 Context
->Protocol
= *Protocol
;
403 Context
->Flags
= Flags
;
405 *HelperDllSocketContext
= Context
;
413 WSHSetSocketInformation(
414 IN PVOID HelperDllSocketContext
,
415 IN SOCKET SocketHandle
,
416 IN HANDLE TdiAddressObjectHandle
,
417 IN HANDLE TdiConnectionObjectHandle
,
420 IN PCHAR OptionValue
,
432 IN LPWSTR AddressString
,
433 IN DWORD AddressFamily
,
434 IN LPWSAPROTOCOL_INFOW ProtocolInfo OPTIONAL
,
435 OUT LPSOCKADDR Address
,
436 IN OUT LPDWORD AddressStringLength
)