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
)
99 IN PSOCKADDR Sockaddr
,
100 IN DWORD SockaddrLength
,
101 OUT PSOCKADDR_INFO SockaddrInfo
)
111 WSHGetSocketInformation(
112 IN PVOID HelperDllSocketContext
,
113 IN SOCKET SocketHandle
,
114 IN HANDLE TdiAddressObjectHandle
,
115 IN HANDLE TdiConnectionObjectHandle
,
118 OUT PCHAR OptionValue
,
119 OUT INT OptionLength
)
129 WSHGetWildcardSockaddr(
130 IN PVOID HelperDllSocketContext
,
131 OUT PSOCKADDR Sockaddr
,
132 OUT PINT SockaddrLength
)
134 RtlZeroMemory((PVOID
)Sockaddr
, *SockaddrLength
);
135 Sockaddr
->sa_family
= AF_INET
;
142 WSHGetWinsockMapping(
143 OUT PWINSOCK_MAPPING Mapping
,
144 IN DWORD MappingLength
)
154 WSHGetWSAProtocolInfo(
155 IN LPWSTR ProviderName
,
156 OUT LPWSAPROTOCOL_INFOW
*ProtocolInfo
,
157 OUT LPDWORD ProtocolInfoEntries
)
168 IN PVOID HelperDllSocketContext
,
169 IN SOCKET SocketHandle
,
170 IN HANDLE TdiAddressObjectHandle
,
171 IN HANDLE TdiConnectionObjectHandle
,
172 IN DWORD IoControlCode
,
173 IN LPVOID InputBuffer
,
174 IN DWORD InputBufferLength
,
175 IN LPVOID OutputBuffer
,
176 IN DWORD OutputBufferLength
,
177 OUT LPDWORD NumberOfBytesReturned
,
178 IN LPWSAOVERLAPPED Overlapped
,
179 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine
,
180 OUT LPBOOL NeedsCompletion
)
191 IN PVOID HelperDllSocketContext
,
192 IN SOCKET SocketHandle
,
193 IN HANDLE TdiAddressObjectHandle
,
194 IN HANDLE TdiConnectionObjectHandle
,
195 IN PVOID LeafHelperDllSocketContext
,
196 IN SOCKET LeafSocketHandle
,
197 IN PSOCKADDR Sockaddr
,
198 IN DWORD SockaddrLength
,
199 IN LPWSABUF CallerData
,
200 IN LPWSABUF CalleeData
,
214 IN PVOID HelperDllSocketContext
,
215 IN SOCKET SocketHandle
,
216 IN HANDLE TdiAddressObjectHandle
,
217 IN HANDLE TdiConnectionObjectHandle
,
218 IN DWORD NotifyEvent
)
229 IN OUT PINT AddressFamily
,
230 IN OUT PINT SocketType
,
231 IN OUT PINT Protocol
,
232 OUT PUNICODE_STRING TransportDeviceName
,
233 OUT PVOID HelperDllSocketContext
,
234 OUT PDWORD NotificationEvents
)
236 * FUNCTION: Opens a socket
239 return WSHOpenSocket2(AddressFamily
,
245 HelperDllSocketContext
,
253 OUT PINT AddressFamily
,
254 IN OUT PINT SocketType
,
255 IN OUT PINT Protocol
,
258 OUT PUNICODE_STRING TransportDeviceName
,
259 OUT PVOID
*HelperDllSocketContext
,
260 OUT PDWORD NotificationEvents
)
262 * FUNCTION: Opens a socket
264 * AddressFamily = Address of buffer with address family (updated)
265 * SocketType = Address of buffer with type of socket (updated)
266 * Protocol = Address of buffer with protocol number (updated)
267 * Group = Socket group
268 * Flags = Socket flags
269 * TransportDeviceName = Address of buffer to place name of transport device
270 * HelperDllSocketContext = Address of buffer to place socket context pointer
271 * NotificationEvents = Address of buffer to place flags for event notification
273 * Status of operation
275 * Mapping tripple is returned in an canonicalized form
278 PSOCKET_CONTEXT Context
;
279 UNICODE_STRING String
;
280 UNICODE_STRING TcpDeviceName
= RTL_CONSTANT_STRING(DD_TCP_DEVICE_NAME
);
281 UNICODE_STRING UdpDeviceName
= RTL_CONSTANT_STRING(DD_UDP_DEVICE_NAME
);
282 UNICODE_STRING RawDeviceName
= RTL_CONSTANT_STRING(DD_RAW_IP_DEVICE_NAME
);
287 switch (*SocketType
) {
289 String
= TcpDeviceName
;
293 String
= UdpDeviceName
;
297 if ((*Protocol
< 0) || (*Protocol
> 255))
300 String
= RawDeviceName
;
307 RtlInitUnicodeString(TransportDeviceName
, NULL
);
309 TransportDeviceName
->MaximumLength
= String
.Length
+ /* Transport device name */
310 (4 * sizeof(WCHAR
) + /* Separator and protocol */
311 sizeof(UNICODE_NULL
)); /* Terminating null */
313 TransportDeviceName
->Buffer
= HeapAlloc(
316 TransportDeviceName
->MaximumLength
);
318 if (!TransportDeviceName
->Buffer
)
321 /* Append the transport device name */
322 Status
= RtlAppendUnicodeStringToString(TransportDeviceName
, &String
);
324 if (*SocketType
== SOCK_RAW
) {
325 /* Append a separator */
326 TransportDeviceName
->Buffer
[TransportDeviceName
->Length
/ sizeof(WCHAR
)] = OBJ_NAME_PATH_SEPARATOR
;
327 TransportDeviceName
->Length
+= sizeof(WCHAR
);
328 TransportDeviceName
->Buffer
[TransportDeviceName
->Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
330 /* Append the protocol number */
331 String
.Buffer
= TransportDeviceName
->Buffer
+ (TransportDeviceName
->Length
/ sizeof(WCHAR
));
333 String
.MaximumLength
= TransportDeviceName
->MaximumLength
- TransportDeviceName
->Length
;
335 Status
= RtlIntegerToUnicodeString((ULONG
)*Protocol
, 10, &String
);
337 TransportDeviceName
->Length
+= String
.Length
;
340 /* Setup a socket context area */
342 Context
= HeapAlloc(GetProcessHeap(), 0, sizeof(SOCKET_CONTEXT
));
344 RtlFreeUnicodeString(TransportDeviceName
);
348 Context
->AddressFamily
= *AddressFamily
;
349 Context
->SocketType
= *SocketType
;
350 Context
->Protocol
= *Protocol
;
351 Context
->Flags
= Flags
;
353 *HelperDllSocketContext
= Context
;
361 WSHSetSocketInformation(
362 IN PVOID HelperDllSocketContext
,
363 IN SOCKET SocketHandle
,
364 IN HANDLE TdiAddressObjectHandle
,
365 IN HANDLE TdiConnectionObjectHandle
,
368 IN PCHAR OptionValue
,
380 IN LPWSTR AddressString
,
381 IN DWORD AddressFamily
,
382 IN LPWSAPROTOCOL_INFOW ProtocolInfo OPTIONAL
,
383 OUT LPSOCKADDR Address
,
384 IN OUT LPDWORD AddressStringLength
)