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
)