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
14 /* See debug.h for debug/trace constants */
15 DWORD DebugTraceLevel = MAX_TRACE;
19 /* To make the linker happy */
20 VOID STDCALL KeBugCheck (ULONG BugCheckCode) {}
25 DllMain(HANDLE hInstDll,
29 WSH_DbgPrint(MIN_TRACE, ("DllMain of wshtcpip.dll\n"));
32 case DLL_PROCESS_ATTACH:
33 /* Don't need thread attach notifications
34 so disable them to improve performance */
35 DisableThreadLibraryCalls(hInstDll);
38 case DLL_THREAD_ATTACH:
41 case DLL_THREAD_DETACH:
44 case DLL_PROCESS_DETACH:
54 IN LPSOCKADDR Address,
56 IN LPWSAPROTOCOL_INFOW ProtocolInfo OPTIONAL,
57 OUT LPWSTR AddressString,
58 IN OUT LPDWORD AddressStringLength)
69 IN LPINT lpiProtocols OPTIONAL,
70 IN LPWSTR lpTransportKeyName,
71 IN OUT LPVOID lpProtocolBuffer,
72 IN OUT LPDWORD lpdwBufferLength)
82 WSHGetBroadcastSockaddr(
83 IN PVOID HelperDllSocketContext,
84 OUT PSOCKADDR Sockaddr,
85 OUT PINT SockaddrLength)
96 IN LPWSTR ProviderName,
97 OUT LPGUID ProviderGuid)
108 IN PSOCKADDR Sockaddr,
109 IN DWORD SockaddrLength,
110 OUT PSOCKADDR_INFO SockaddrInfo)
120 WSHGetSocketInformation(
121 IN PVOID HelperDllSocketContext,
122 IN SOCKET SocketHandle,
123 IN HANDLE TdiAddressObjectHandle,
124 IN HANDLE TdiConnectionObjectHandle,
127 OUT PCHAR OptionValue,
128 OUT INT OptionLength)
138 WSHGetWildcardSockaddr(
139 IN PVOID HelperDllSocketContext,
140 OUT PSOCKADDR Sockaddr,
141 OUT PINT SockaddrLength)
151 WSHGetWinsockMapping(
152 OUT PWINSOCK_MAPPING Mapping,
153 IN DWORD MappingLength)
163 WSHGetWSAProtocolInfo(
164 IN LPWSTR ProviderName,
165 OUT LPWSAPROTOCOL_INFOW *ProtocolInfo,
166 OUT LPDWORD ProtocolInfoEntries)
177 IN PVOID HelperDllSocketContext,
178 IN SOCKET SocketHandle,
179 IN HANDLE TdiAddressObjectHandle,
180 IN HANDLE TdiConnectionObjectHandle,
181 IN DWORD IoControlCode,
182 IN LPVOID InputBuffer,
183 IN DWORD InputBufferLength,
184 IN LPVOID OutputBuffer,
185 IN DWORD OutputBufferLength,
186 OUT LPDWORD NumberOfBytesReturned,
187 IN LPWSAOVERLAPPED Overlapped,
188 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine,
189 OUT LPBOOL NeedsCompletion)
200 IN PVOID HelperDllSocketContext,
201 IN SOCKET SocketHandle,
202 IN HANDLE TdiAddressObjectHandle,
203 IN HANDLE TdiConnectionObjectHandle,
204 IN PVOID LeafHelperDllSocketContext,
205 IN SOCKET LeafSocketHandle,
206 IN PSOCKADDR Sockaddr,
207 IN DWORD SockaddrLength,
208 IN LPWSABUF CallerData,
209 IN LPWSABUF CalleeData,
223 IN PVOID HelperDllSocketContext,
224 IN SOCKET SocketHandle,
225 IN HANDLE TdiAddressObjectHandle,
226 IN HANDLE TdiConnectionObjectHandle,
227 IN DWORD NotifyEvent)
238 IN OUT PINT AddressFamily,
239 IN OUT PINT SocketType,
240 IN OUT PINT Protocol,
241 OUT PUNICODE_STRING TransportDeviceName,
242 OUT PVOID HelperDllSocketContext,
243 OUT PDWORD NotificationEvents)
245 * FUNCTION: Opens a socket
248 return WSHOpenSocket2(AddressFamily,
254 HelperDllSocketContext,
262 OUT PINT AddressFamily,
263 IN OUT PINT SocketType,
264 IN OUT PINT Protocol,
267 OUT PUNICODE_STRING TransportDeviceName,
268 OUT PVOID *HelperDllSocketContext,
269 OUT PDWORD NotificationEvents)
271 * FUNCTION: Opens a socket
273 * AddressFamily = Address of buffer with address family (updated)
274 * SocketType = Address of buffer with type of socket (updated)
275 * Protocol = Address of buffer with protocol number (updated)
276 * Group = Socket group
277 * Flags = Socket flags
278 * TransportDeviceName = Address of buffer to place name of transport device
279 * HelperDllSocketContext = Address of buffer to place socket context pointer
280 * NotificationEvents = Address of buffer to place flags for event notification
282 * Status of operation
284 * Mapping tripple is returned in an canonicalized form
287 PSOCKET_CONTEXT Context;
288 UNICODE_STRING String;
291 WSH_DbgPrint(MAX_TRACE, ("\n"));
293 switch (*SocketType) {
295 RtlInitUnicodeStringFromLiteral(&String, DD_TCP_DEVICE_NAME);
299 RtlInitUnicodeStringFromLiteral(&String, DD_UDP_DEVICE_NAME);
303 if ((*Protocol < 0) || (*Protocol > 255))
306 RtlInitUnicodeStringFromLiteral(&String, DD_RAW_IP_DEVICE_NAME);
313 RtlInitUnicodeString(TransportDeviceName, NULL);
315 TransportDeviceName->MaximumLength = String.Length + /* Transport device name */
316 (4 * sizeof(WCHAR) + /* Separator and protocol */
317 sizeof(UNICODE_NULL)); /* Terminating null */
319 TransportDeviceName->Buffer = HeapAlloc(
322 TransportDeviceName->MaximumLength);
324 if (!TransportDeviceName->Buffer)
327 /* Append the transport device name */
328 Status = RtlAppendUnicodeStringToString(TransportDeviceName, &String);
330 if (*SocketType == SOCK_RAW) {
331 /* Append a separator */
332 TransportDeviceName->Buffer[TransportDeviceName->Length / sizeof(WCHAR)] = OBJ_NAME_PATH_SEPARATOR;
333 TransportDeviceName->Length += sizeof(WCHAR);
334 TransportDeviceName->Buffer[TransportDeviceName->Length / sizeof(WCHAR)] = UNICODE_NULL;
336 /* Append the protocol number */
337 String.Buffer = TransportDeviceName->Buffer + (TransportDeviceName->Length / sizeof(WCHAR));
339 String.MaximumLength = TransportDeviceName->MaximumLength - TransportDeviceName->Length;
341 Status = RtlIntegerToUnicodeString((ULONG)*Protocol, 10, &String);
343 TransportDeviceName->Length += String.Length;
346 /* Setup a socket context area */
348 Context = HeapAlloc(GetProcessHeap(), 0, sizeof(SOCKET_CONTEXT));
350 RtlFreeUnicodeString(TransportDeviceName);
354 Context->AddressFamily = *AddressFamily;
355 Context->SocketType = *SocketType;
356 Context->Protocol = *Protocol;
357 Context->Flags = Flags;
359 *HelperDllSocketContext = Context;
367 WSHSetSocketInformation(
368 IN PVOID HelperDllSocketContext,
369 IN SOCKET SocketHandle,
370 IN HANDLE TdiAddressObjectHandle,
371 IN HANDLE TdiConnectionObjectHandle,
374 IN PCHAR OptionValue,
386 IN LPWSTR AddressString,
387 IN DWORD AddressFamily,
388 IN LPWSAPROTOCOL_INFOW ProtocolInfo OPTIONAL,
389 OUT LPSOCKADDR Address,
390 IN OUT LPDWORD AddressStringLength)