ReactOS 0.4.17-dev-523-gf6fcb59
wshtcpip.c File Reference
#include "wshtcpip.h"
#include <debug.h>
Include dependency graph for wshtcpip.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

BOOL EXPORT DllMain (HANDLE hInstDll, ULONG dwReason, PVOID Reserved)
 
INT EXPORT WSHAddressToString (IN LPSOCKADDR Address, IN INT AddressLength, IN LPWSAPROTOCOL_INFOW ProtocolInfo OPTIONAL, OUT LPWSTR AddressString, IN OUT LPDWORD AddressStringLength)
 
INT EXPORT WSHEnumProtocols (IN LPINT lpiProtocols OPTIONAL, IN LPWSTR lpTransportKeyName, IN OUT LPVOID lpProtocolBuffer, IN OUT LPDWORD lpdwBufferLength)
 
INT EXPORT WSHGetBroadcastSockaddr (IN PVOID HelperDllSocketContext, OUT PSOCKADDR Sockaddr, OUT PINT SockaddrLength)
 
INT EXPORT WSHGetProviderGuid (IN LPWSTR ProviderName, OUT LPGUID ProviderGuid)
 
INT EXPORT WSHGetSockaddrType (IN PSOCKADDR Sockaddr, IN DWORD SockaddrLength, OUT PSOCKADDR_INFO SockaddrInfo)
 
static void GetTdiTypeId (_In_ INT Level, _In_ INT OptionName, _Out_ PULONG TdiType, _Out_ PULONG TdiId)
 
INT EXPORT WSHGetSocketInformation (IN PVOID HelperDllSocketContext, IN SOCKET SocketHandle, IN HANDLE TdiAddressObjectHandle, IN HANDLE TdiConnectionObjectHandle, IN INT Level, IN INT OptionName, OUT PCHAR OptionValue, OUT LPINT OptionLength)
 
INT EXPORT WSHGetWildcardSockaddr (IN PVOID HelperDllSocketContext, OUT PSOCKADDR Sockaddr, OUT PINT SockaddrLength)
 
DWORD EXPORT WSHGetWinsockMapping (OUT PWINSOCK_MAPPING Mapping, IN DWORD MappingLength)
 
INT EXPORT WSHGetWSAProtocolInfo (IN LPWSTR ProviderName, OUT LPWSAPROTOCOL_INFOW *ProtocolInfo, OUT LPDWORD ProtocolInfoEntries)
 
INT EXPORT WSHIoctl (IN PVOID HelperDllSocketContext, IN SOCKET SocketHandle, IN HANDLE TdiAddressObjectHandle, IN HANDLE TdiConnectionObjectHandle, IN DWORD IoControlCode, IN LPVOID InputBuffer, IN DWORD InputBufferLength, IN LPVOID OutputBuffer, IN DWORD OutputBufferLength, OUT LPDWORD NumberOfBytesReturned, IN LPWSAOVERLAPPED Overlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine, OUT LPBOOL NeedsCompletion)
 
INT EXPORT WSHJoinLeaf (IN PVOID HelperDllSocketContext, IN SOCKET SocketHandle, IN HANDLE TdiAddressObjectHandle, IN HANDLE TdiConnectionObjectHandle, IN PVOID LeafHelperDllSocketContext, IN SOCKET LeafSocketHandle, IN PSOCKADDR Sockaddr, IN DWORD SockaddrLength, IN LPWSABUF CallerData, IN LPWSABUF CalleeData, IN LPQOS SocketQOS, IN LPQOS GroupQOS, IN DWORD Flags)
 
INT SendRequest (IN PVOID Request, IN DWORD RequestSize, IN DWORD IOCTL)
 
INT EXPORT WSHNotify (IN PVOID HelperDllSocketContext, IN SOCKET SocketHandle, IN HANDLE TdiAddressObjectHandle, IN HANDLE TdiConnectionObjectHandle, IN DWORD NotifyEvent)
 
INT EXPORT WSHOpenSocket (IN OUT PINT AddressFamily, IN OUT PINT SocketType, IN OUT PINT Protocol, OUT PUNICODE_STRING TransportDeviceName, OUT PVOID HelperDllSocketContext, OUT PDWORD NotificationEvents)
 
INT EXPORT WSHOpenSocket2 (OUT PINT AddressFamily, IN OUT PINT SocketType, IN OUT PINT Protocol, IN GROUP Group, IN DWORD Flags, OUT PUNICODE_STRING TransportDeviceName, OUT PVOID *HelperDllSocketContext, OUT PDWORD NotificationEvents)
 
INT EXPORT WSHSetSocketInformation (IN PVOID HelperDllSocketContext, IN SOCKET SocketHandle, IN HANDLE TdiAddressObjectHandle, IN HANDLE TdiConnectionObjectHandle, IN INT Level, IN INT OptionName, IN PCHAR OptionValue, IN INT OptionLength)
 
INT EXPORT WSHStringToAddress (IN LPWSTR AddressString, IN DWORD AddressFamily, IN LPWSAPROTOCOL_INFOW ProtocolInfo OPTIONAL, OUT LPSOCKADDR Address, IN OUT LPDWORD AddressStringLength)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 11 of file wshtcpip.c.

Function Documentation

◆ DllMain()

BOOL EXPORT DllMain ( HANDLE  hInstDll,
ULONG  dwReason,
PVOID  Reserved 
)

Definition at line 16 of file wshtcpip.c.

19{
20 DPRINT("DllMain of wshtcpip.dll\n");
21
22 switch (dwReason) {
24 /* Don't need thread attach notifications
25 so disable them to improve performance */
27 break;
28
30 break;
31
33 break;
34
36 break;
37 }
38 return TRUE;
39}
DWORD dwReason
Definition: misc.cpp:135
#define TRUE
Definition: types.h:120
#define DLL_THREAD_DETACH
Definition: compat.h:133
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
#define DLL_THREAD_ATTACH
Definition: compat.h:132
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
#define DPRINT
Definition: sndvol32.h:73

◆ GetTdiTypeId()

static void GetTdiTypeId ( _In_ INT  Level,
_In_ INT  OptionName,
_Out_ PULONG  TdiType,
_Out_ PULONG  TdiId 
)
static

Definition at line 161 of file wshtcpip.c.

166{
167 switch (Level)
168 {
169 case SOL_SOCKET:
170 *TdiType = INFO_TYPE_CONNECTION;
171 switch (OptionName)
172 {
173 case SO_KEEPALIVE:
174 *TdiId = TCP_SOCKET_KEEPALIVE;
175 return;
176 default:
177 break;
178 }
179 break;
180
181 case IPPROTO_IP:
182 *TdiType = INFO_TYPE_ADDRESS_OBJECT;
183 switch (OptionName)
184 {
185 case IP_TTL:
186 *TdiId = AO_OPTION_TTL;
187 return;
188
189 case IP_DONTFRAGMENT:
191 return;
192
193#if 0
195 *TdiId = AO_OPTION_BROADCAST;
196 return;
197#endif
198
199 case IP_HDRINCL:
200 *TdiId = AO_OPTION_IP_HDRINCL;
201 return;
202
203 default:
204 break;
205 }
206 break;
207
208 case IPPROTO_TCP:
209 *TdiType = INFO_TYPE_CONNECTION;
210 switch (OptionName)
211 {
212 case TCP_NODELAY:
213 *TdiId = TCP_SOCKET_NODELAY;
214 return;
215 default:
216 break;
217 }
218
219 default:
220 break;
221 }
222
223 DPRINT1("Unknown level/option name: %d %d\n", Level, OptionName);
224 *TdiType = 0;
225 *TdiId = 0;
226}
#define DPRINT1
Definition: precomp.h:8
#define IPPROTO_TCP
Definition: ip.h:197
#define TCP_NODELAY
Definition: tcpdef.h:117
#define AO_OPTION_BROADCAST
Definition: tcpioctl.h:77
#define AO_OPTION_IP_DONTFRAGMENT
Definition: tcpioctl.h:75
#define TCP_SOCKET_NODELAY
Definition: tcpioctl.h:107
#define TCP_SOCKET_KEEPALIVE
Definition: tcpioctl.h:110
#define AO_OPTION_TTL
Definition: tcpioctl.h:67
#define AO_OPTION_IP_HDRINCL
Definition: tcpioctl.h:78
#define INFO_TYPE_ADDRESS_OBJECT
Definition: tdiinfo.h:70
#define INFO_TYPE_CONNECTION
Definition: tdiinfo.h:71
#define SO_KEEPALIVE
Definition: winsock.h:175
#define IP_DONTFRAGMENT
Definition: winsock.h:320
#define IP_TTL
Definition: winsock.h:318
#define SOL_SOCKET
Definition: winsock.h:392
#define IPPROTO_IP
Definition: winsock.h:249
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:56
#define IP_HDRINCL
Definition: ws2ipdef.h:28
#define IP_RECEIVE_BROADCAST
Definition: ws2ipdef.h:43

Referenced by WSHSetSocketInformation().

◆ SendRequest()

INT SendRequest ( IN PVOID  Request,
IN DWORD  RequestSize,
IN DWORD  IOCTL 
)

Definition at line 460 of file wshtcpip.c.

464{
466 HANDLE TcpCC;
468
470 return WSAEINVAL;
471
472 Success = DeviceIoControl(TcpCC,
473 IOCTL,
474 Request,
476 NULL,
477 0,
479 NULL);
480
481 closeTcpFile(TcpCC);
482
483 DPRINT("DeviceIoControl: %ld\n", (Success ? NO_ERROR : GetLastError()));
484
485 if (!Success)
486 return WSAEINVAL;
487
488 return NO_ERROR;
489}
unsigned char BOOLEAN
Definition: actypes.h:127
#define NO_ERROR
Definition: dderror.h:5
BOOL WINAPI DeviceIoControl(IN HANDLE hDevice, IN DWORD dwIoControlCode, IN LPVOID lpInBuffer OPTIONAL, IN DWORD nInBufferSize OPTIONAL, OUT LPVOID lpOutBuffer OPTIONAL, IN DWORD nOutBufferSize OPTIONAL, OUT LPDWORD lpBytesReturned OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: deviceio.c:136
#define NULL
Definition: types.h:112
@ Success
Definition: eventcreate.c:712
unsigned long DWORD
Definition: ntddk_ex.h:95
#define FILE_WRITE_DATA
Definition: nt_native.h:631
#define FILE_READ_DATA
Definition: nt_native.h:628
static ULONG RequestSize
Definition: ping.c:63
NTSTATUS openTcpFile(PHANDLE tcpFile, ACCESS_MASK DesiredAccess)
Definition: handle.c:12
VOID closeTcpFile(HANDLE h)
Definition: handle.c:43
#define STATUS_SUCCESS
Definition: shellext.h:65
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_ ULONG _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesReturned
Definition: wdfiotarget.h:1052
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define WSAEINVAL
Definition: winerror.h:2845

Referenced by WSHIoctl(), WSHNotify(), and WSHSetSocketInformation().

◆ WSHAddressToString()

INT EXPORT WSHAddressToString ( IN LPSOCKADDR  Address,
IN INT  AddressLength,
IN LPWSAPROTOCOL_INFOW ProtocolInfo  OPTIONAL,
OUT LPWSTR  AddressString,
IN OUT LPDWORD  AddressStringLength 
)

Definition at line 44 of file wshtcpip.c.

50{
52
53 return NO_ERROR;
54}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

◆ WSHEnumProtocols()

INT EXPORT WSHEnumProtocols ( IN LPINT lpiProtocols  OPTIONAL,
IN LPWSTR  lpTransportKeyName,
IN OUT LPVOID  lpProtocolBuffer,
IN OUT LPDWORD  lpdwBufferLength 
)

Definition at line 59 of file wshtcpip.c.

64{
66
67 return NO_ERROR;
68}

◆ WSHGetBroadcastSockaddr()

INT EXPORT WSHGetBroadcastSockaddr ( IN PVOID  HelperDllSocketContext,
OUT PSOCKADDR  Sockaddr,
OUT PINT  SockaddrLength 
)

Definition at line 73 of file wshtcpip.c.

77{
78 INT Size = 2 * sizeof(UINT);
79
80 if (*SockaddrLength < Size)
81 {
82 DPRINT1("Socket address length too small: %d\n", *SockaddrLength);
83 return WSAEFAULT;
84 }
85
86 RtlZeroMemory(Sockaddr, *SockaddrLength);
87
88 Sockaddr->sa_family = AF_INET;
89 *((PUINT)Sockaddr->sa_data) = INADDR_BROADCAST;
90
91 /* *SockaddrLength = Size; */
92
93 return NO_ERROR;
94}
#define AF_INET
Definition: tcpip.h:117
unsigned int UINT
Definition: sysinfo.c:13
#define INADDR_BROADCAST
Definition: inet.h:82
unsigned int * PUINT
Definition: ndis.h:50
int32_t INT
Definition: typedefs.h:58
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
#define WSAEFAULT
Definition: winerror.h:2844

◆ WSHGetProviderGuid()

INT EXPORT WSHGetProviderGuid ( IN LPWSTR  ProviderName,
OUT LPGUID  ProviderGuid 
)

Definition at line 99 of file wshtcpip.c.

102{
104
105 return NO_ERROR;
106}

◆ WSHGetSockaddrType()

INT EXPORT WSHGetSockaddrType ( IN PSOCKADDR  Sockaddr,
IN DWORD  SockaddrLength,
OUT PSOCKADDR_INFO  SockaddrInfo 
)

Definition at line 116 of file wshtcpip.c.

120{
121 PSOCKADDR_IN ipv4 = (PSOCKADDR_IN)Sockaddr;
122
123 if (!ipv4 || !SockaddrInfo || SockaddrLength < sizeof(SOCKADDR_IN) ||
124 ipv4->sin_family != AF_INET)
125 {
126 DPRINT1("Invalid parameter: %x %x %d %u\n", ipv4, SockaddrInfo, SockaddrLength, (ipv4 ? ipv4->sin_family : 0));
127 return WSAEINVAL;
128 }
129
130 switch (ntohl(ipv4->sin_addr.s_addr))
131 {
132 case INADDR_ANY:
133 SockaddrInfo->AddressInfo = SockaddrAddressInfoWildcard;
134 break;
135
136 case INADDR_BROADCAST:
137 SockaddrInfo->AddressInfo = SockaddrAddressInfoBroadcast;
138 break;
139
140 case INADDR_LOOPBACK:
141 SockaddrInfo->AddressInfo = SockaddrAddressInfoLoopback;
142 break;
143
144 default:
145 SockaddrInfo->AddressInfo = SockaddrAddressInfoNormal;
146 break;
147 }
148
149 if (ntohs(ipv4->sin_port) == 0)
150 SockaddrInfo->EndpointInfo = SockaddrEndpointInfoWildcard;
151 else if (ntohs(ipv4->sin_port) < IPPORT_RESERVED)
152 SockaddrInfo->EndpointInfo = SockaddrEndpointInfoReserved;
153 else
154 SockaddrInfo->EndpointInfo = SockaddrEndpointInfoNormal;
155
156 return NO_ERROR;
157}
#define INADDR_ANY
Definition: inet.h:80
#define INADDR_LOOPBACK
Definition: inet.h:78
#define ntohl(x)
Definition: module.h:205
#define ntohs(x)
Definition: module.h:210
struct in_addr sin_addr
Definition: winsock.h:506
short sin_family
Definition: winsock.h:504
u_short sin_port
Definition: winsock.h:505
#define IPPORT_RESERVED
Definition: winsock.h:284
struct sockaddr_in * PSOCKADDR_IN
Definition: winsock.h:482
@ SockaddrEndpointInfoReserved
Definition: wsahelp.h:32
@ SockaddrEndpointInfoNormal
Definition: wsahelp.h:30
@ SockaddrEndpointInfoWildcard
Definition: wsahelp.h:31
@ SockaddrAddressInfoNormal
Definition: wsahelp.h:24
@ SockaddrAddressInfoLoopback
Definition: wsahelp.h:27
@ SockaddrAddressInfoWildcard
Definition: wsahelp.h:25
@ SockaddrAddressInfoBroadcast
Definition: wsahelp.h:26

◆ WSHGetSocketInformation()

INT EXPORT WSHGetSocketInformation ( IN PVOID  HelperDllSocketContext,
IN SOCKET  SocketHandle,
IN HANDLE  TdiAddressObjectHandle,
IN HANDLE  TdiConnectionObjectHandle,
IN INT  Level,
IN INT  OptionName,
OUT PCHAR  OptionValue,
OUT LPINT  OptionLength 
)

Definition at line 230 of file wshtcpip.c.

239{
241
242 DPRINT1("Get: Unknown level/option name: %d %d\n", Level, OptionName);
243
244 *OptionLength = 0;
245
246 return NO_ERROR;
247}

◆ WSHGetWildcardSockaddr()

INT EXPORT WSHGetWildcardSockaddr ( IN PVOID  HelperDllSocketContext,
OUT PSOCKADDR  Sockaddr,
OUT PINT  SockaddrLength 
)

Definition at line 252 of file wshtcpip.c.

256{
257 INT Size = 2 * sizeof(UINT);
258
259 if (*SockaddrLength < Size)
260 {
261 DPRINT1("Socket address length too small: %d\n", *SockaddrLength);
262 return WSAEFAULT;
263 }
264
265 RtlZeroMemory(Sockaddr, *SockaddrLength);
266
267 Sockaddr->sa_family = AF_INET;
268 *((PUINT)Sockaddr->sa_data) = INADDR_ANY;
269
270 /* *SockaddrLength = Size; */
271
272 return NO_ERROR;
273}

◆ WSHGetWinsockMapping()

DWORD EXPORT WSHGetWinsockMapping ( OUT PWINSOCK_MAPPING  Mapping,
IN DWORD  MappingLength 
)

Definition at line 278 of file wshtcpip.c.

281{
282 DWORD Rows = 6;
283 DWORD Columns = 3;
284 DWORD Size = 2 * sizeof(DWORD) + Columns * Rows * sizeof(DWORD);
285
286 if (MappingLength < Size)
287 {
288 DPRINT1("Mapping length too small: %d\n", MappingLength);
289 return Size;
290 }
291
292 Mapping->Rows = Rows;
293 Mapping->Columns = Columns;
294
295 Mapping->Mapping[0].AddressFamily = AF_INET;
296 Mapping->Mapping[0].SocketType = SOCK_STREAM;
297 Mapping->Mapping[0].Protocol = 0;
298
299 Mapping->Mapping[1].AddressFamily = AF_INET;
300 Mapping->Mapping[1].SocketType = SOCK_STREAM;
301 Mapping->Mapping[1].Protocol = IPPROTO_TCP;
302
303 Mapping->Mapping[2].AddressFamily = AF_INET;
304 Mapping->Mapping[2].SocketType = SOCK_DGRAM;
305 Mapping->Mapping[2].Protocol = 0;
306
307 Mapping->Mapping[3].AddressFamily = AF_INET;
308 Mapping->Mapping[3].SocketType = SOCK_DGRAM;
309 Mapping->Mapping[3].Protocol = IPPROTO_UDP;
310
311 Mapping->Mapping[4].AddressFamily = AF_INET;
312 Mapping->Mapping[4].SocketType = SOCK_RAW;
313 Mapping->Mapping[4].Protocol = 0;
314
315 Mapping->Mapping[5].AddressFamily = AF_INET;
316 Mapping->Mapping[5].SocketType = SOCK_RAW;
317 Mapping->Mapping[5].Protocol = IPPROTO_ICMP;
318
319 return NO_ERROR;
320}
static const COLUMN_LIST Columns[]
Definition: listview.c:19
#define IPPROTO_ICMP
Definition: ip.h:195
#define IPPROTO_UDP
Definition: ip.h:198
#define SOCK_STREAM
Definition: tcpip.h:118
static PVOID Mapping[EMS_PHYSICAL_PAGES]
Definition: emsdrv.c:41
#define DWORD
Definition: nt_native.h:44
#define SOCK_RAW
Definition: winsock.h:331
#define SOCK_DGRAM
Definition: winsock.h:330
_In_ ULONG Rows
Definition: haltypes.h:17

◆ WSHGetWSAProtocolInfo()

INT EXPORT WSHGetWSAProtocolInfo ( IN LPWSTR  ProviderName,
OUT LPWSAPROTOCOL_INFOW ProtocolInfo,
OUT LPDWORD  ProtocolInfoEntries 
)

Definition at line 325 of file wshtcpip.c.

329{
331
332 return NO_ERROR;
333}

◆ WSHIoctl()

INT EXPORT WSHIoctl ( IN PVOID  HelperDllSocketContext,
IN SOCKET  SocketHandle,
IN HANDLE  TdiAddressObjectHandle,
IN HANDLE  TdiConnectionObjectHandle,
IN DWORD  IoControlCode,
IN LPVOID  InputBuffer,
IN DWORD  InputBufferLength,
IN LPVOID  OutputBuffer,
IN DWORD  OutputBufferLength,
OUT LPDWORD  NumberOfBytesReturned,
IN LPWSAOVERLAPPED  Overlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE  CompletionRoutine,
OUT LPBOOL  NeedsCompletion 
)

Definition at line 338 of file wshtcpip.c.

352{
353 INT res;
354 PSOCKET_CONTEXT Context = HelperDllSocketContext;
356 PQUEUED_REQUEST Queued, NextQueued;
357
359 {
363 NumberOfBytesReturned,
364 NeedsCompletion);
365 return res;
366 }
368 {
369 if (!InputBuffer || InputBufferLength != sizeof(struct tcp_keepalive))
370 {
371 return WSAEINVAL;
372 }
373
375 if (!Info)
376 return WSAENOBUFS;
377
378 Info->ID.toi_entity.tei_entity = Context->AddrFileEntityType;
379 Info->ID.toi_entity.tei_instance = Context->AddrFileInstance;
380 Info->ID.toi_class = INFO_CLASS_PROTOCOL;
381 Info->ID.toi_type = INFO_TYPE_CONNECTION;
382 Info->ID.toi_id = TCP_SOCKET_KEEPALIVEVALS;
383 Info->BufferSize = InputBufferLength;
385
386 if (Context->SocketState == SocketStateCreated)
387 {
388 if (Context->RequestQueue)
389 {
390 Queued = Context->RequestQueue;
391 while ((NextQueued = Queued->Next))
392 {
393 Queued = NextQueued;
394 }
395
396 Queued->Next = HeapAlloc(GetProcessHeap(), 0, sizeof(QUEUED_REQUEST));
397 if (!Queued->Next)
398 {
400 return WSAENOBUFS;
401 }
402
403 NextQueued = Queued->Next;
404 NextQueued->Next = NULL;
405 NextQueued->Info = Info;
406 }
407 else
408 {
409 Context->RequestQueue = HeapAlloc(GetProcessHeap(), 0, sizeof(QUEUED_REQUEST));
410 if (!Context->RequestQueue)
411 {
413 return WSAENOBUFS;
414 }
415
416 Context->RequestQueue->Next = NULL;
417 Context->RequestQueue->Info = Info;
418 }
419
420 return 0;
421 }
422
423 res = SendRequest(Info, sizeof(*Info) + Info->BufferSize, IOCTL_TCP_SET_INFORMATION_EX);
424
426 return res;
427 }
428
430
431 DPRINT1("Ioctl: Unknown IOCTL code: %x\n", IoControlCode);
432
433 return WSAEINVAL;
434}
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
GLuint res
Definition: glext.h:9613
INT WSHIoctl_GetInterfaceList(IN LPVOID OutputBuffer, IN DWORD OutputBufferLength, OUT LPDWORD NumberOfBytesReturned, OUT LPBOOL NeedsCompletion)
Definition: iflist.c:215
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define SIO_KEEPALIVE_VALS
Definition: mstcpip.h:29
_In_ PVOID Context
Definition: storport.h:2269
PTCP_REQUEST_SET_INFORMATION_EX Info
Definition: wshtcpip.h:40
#define TCP_SOCKET_KEEPALIVEVALS
Definition: tcpioctl.h:111
#define INFO_CLASS_PROTOCOL
Definition: tdiinfo.h:65
#define IOCTL_TCP_SET_INFORMATION_EX
Definition: tditest.h:112
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
_In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
Definition: wdfio.h:325
_In_ WDFREQUEST _In_ size_t OutputBufferLength
Definition: wdfio.h:320
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
Definition: wdfio.h:322
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
Definition: wdfiotarget.h:953
#define WSAENOBUFS
Definition: winerror.h:2871
#define SIO_GET_INTERFACE_LIST
Definition: ws2ipdef.h:62
INT SendRequest(IN PVOID Request, IN DWORD RequestSize, IN DWORD IOCTL)
Definition: wshtcpip.c:460
@ SocketStateCreated
Definition: wshtcpip.h:33

◆ WSHJoinLeaf()

INT EXPORT WSHJoinLeaf ( IN PVOID  HelperDllSocketContext,
IN SOCKET  SocketHandle,
IN HANDLE  TdiAddressObjectHandle,
IN HANDLE  TdiConnectionObjectHandle,
IN PVOID  LeafHelperDllSocketContext,
IN SOCKET  LeafSocketHandle,
IN PSOCKADDR  Sockaddr,
IN DWORD  SockaddrLength,
IN LPWSABUF  CallerData,
IN LPWSABUF  CalleeData,
IN LPQOS  SocketQOS,
IN LPQOS  GroupQOS,
IN DWORD  Flags 
)

Definition at line 439 of file wshtcpip.c.

453{
455
456 return NO_ERROR;
457}

◆ WSHNotify()

INT EXPORT WSHNotify ( IN PVOID  HelperDllSocketContext,
IN SOCKET  SocketHandle,
IN HANDLE  TdiAddressObjectHandle,
IN HANDLE  TdiConnectionObjectHandle,
IN DWORD  NotifyEvent 
)

Definition at line 493 of file wshtcpip.c.

499{
500 PSOCKET_CONTEXT Context = HelperDllSocketContext;
502 HANDLE TcpCC;
503 TDIEntityID *EntityIDs;
505 PQUEUED_REQUEST QueuedRequest, NextQueuedRequest;
506
507 switch (NotifyEvent)
508 {
509 case WSH_NOTIFY_CLOSE:
510 DPRINT("WSHNotify: WSH_NOTIFY_CLOSE\n");
511 QueuedRequest = Context->RequestQueue;
512 while (QueuedRequest)
513 {
514 NextQueuedRequest = QueuedRequest->Next;
515
516 HeapFree(GetProcessHeap(), 0, QueuedRequest->Info);
517 HeapFree(GetProcessHeap(), 0, QueuedRequest);
518
519 QueuedRequest = NextQueuedRequest;
520 }
521 HeapFree(GetProcessHeap(), 0, HelperDllSocketContext);
522 break;
523
524
525 case WSH_NOTIFY_BIND:
526 DPRINT("WSHNotify: WSH_NOTIFY_BIND\n");
528 if (Status != STATUS_SUCCESS)
529 return WSAEINVAL;
530
532 &EntityIDs,
533 &EntityCount);
534
535 closeTcpFile(TcpCC);
536
537 if (Status != STATUS_SUCCESS)
538 return WSAEINVAL;
539
540 for (i = 0; i < EntityCount; i++)
541 {
542 if (EntityIDs[i].tei_entity == CO_TL_ENTITY ||
543 EntityIDs[i].tei_entity == CL_TL_ENTITY ||
544 EntityIDs[i].tei_entity == ER_ENTITY)
545 {
546 Context->AddrFileInstance = EntityIDs[i].tei_instance;
547 Context->AddrFileEntityType = EntityIDs[i].tei_entity;
548 }
549 }
550
551 DPRINT("Instance: %lx Type: %lx\n", Context->AddrFileInstance, Context->AddrFileEntityType);
552
553 tdiFreeThingSet(EntityIDs);
554
555 Context->SocketState = SocketStateBound;
556
557 QueuedRequest = Context->RequestQueue;
558 while (QueuedRequest)
559 {
560 QueuedRequest->Info->ID.toi_entity.tei_entity = Context->AddrFileEntityType;
561 QueuedRequest->Info->ID.toi_entity.tei_instance = Context->AddrFileInstance;
562
563 SendRequest(QueuedRequest->Info,
564 sizeof(*QueuedRequest->Info) + QueuedRequest->Info->BufferSize,
566
567 NextQueuedRequest = QueuedRequest->Next;
568
569 HeapFree(GetProcessHeap(), 0, QueuedRequest->Info);
570 HeapFree(GetProcessHeap(), 0, QueuedRequest);
571
572 QueuedRequest = NextQueuedRequest;
573 }
574 Context->RequestQueue = NULL;
575 break;
576
577 default:
578 DPRINT1("Unwanted notification received! (%ld)\n", NotifyEvent);
579 break;
580 }
581
582 return NO_ERROR;
583}
LONG NTSTATUS
Definition: precomp.h:26
ULONG EntityCount
Definition: main.c:28
Status
Definition: gdiplustypes.h:24
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
VOID tdiFreeThingSet(PVOID things)
Definition: enum.c:118
NTSTATUS tdiGetEntityIDSet(HANDLE tcpFile, TDIEntityID **entitySet, PDWORD numEntities)
Definition: enum.c:122
ULONG tei_entity
Definition: tdiinfo.h:31
ULONG tei_instance
Definition: tdiinfo.h:32
TDIEntityID toi_entity
Definition: tdiinfo.h:74
#define ER_ENTITY
Definition: tdiinfo.h:46
#define CL_TL_ENTITY
Definition: tdiinfo.h:43
#define CO_TL_ENTITY
Definition: tdiinfo.h:45
#define WSH_NOTIFY_CLOSE
Definition: wsahelp.h:17
#define WSH_NOTIFY_BIND
Definition: wsahelp.h:10
@ SocketStateBound
Definition: wshtcpip.h:34

◆ WSHOpenSocket()

INT EXPORT WSHOpenSocket ( IN OUT PINT  AddressFamily,
IN OUT PINT  SocketType,
IN OUT PINT  Protocol,
OUT PUNICODE_STRING  TransportDeviceName,
OUT PVOID  HelperDllSocketContext,
OUT PDWORD  NotificationEvents 
)

Definition at line 588 of file wshtcpip.c.

598{
601 Protocol,
602 0,
603 0,
604 TransportDeviceName,
605 HelperDllSocketContext,
606 NotificationEvents);
607}
IN PCO_ADDRESS_FAMILY AddressFamily
Definition: ndis.h:1906
INT EXPORT WSHOpenSocket2(OUT PINT AddressFamily, IN OUT PINT SocketType, IN OUT PINT Protocol, IN GROUP Group, IN DWORD Flags, OUT PUNICODE_STRING TransportDeviceName, OUT PVOID *HelperDllSocketContext, OUT PDWORD NotificationEvents)
Definition: wshtcpip.c:612
_In_ USHORT SocketType
Definition: wsk.h:182

◆ WSHOpenSocket2()

INT EXPORT WSHOpenSocket2 ( OUT PINT  AddressFamily,
IN OUT PINT  SocketType,
IN OUT PINT  Protocol,
IN GROUP  Group,
IN DWORD  Flags,
OUT PUNICODE_STRING  TransportDeviceName,
OUT PVOID HelperDllSocketContext,
OUT PDWORD  NotificationEvents 
)

Definition at line 612 of file wshtcpip.c.

637{
643
644 DPRINT("WSHOpenSocket2 called\n");
645
646 switch (*SocketType) {
647 case SOCK_STREAM:
648 String = TcpDeviceName;
649 break;
650
651 case SOCK_DGRAM:
652 String = UdpDeviceName;
653 break;
654
655 case SOCK_RAW:
656 if ((*Protocol < 0) || (*Protocol > 255))
657 return WSAEINVAL;
658
659 String = RawDeviceName;
660 break;
661
662 default:
663 return WSAEINVAL;
664 }
665
666 RtlInitUnicodeString(TransportDeviceName, NULL);
667
668 TransportDeviceName->MaximumLength = String.Length + /* Transport device name */
669 (4 * sizeof(WCHAR) + /* Separator and protocol */
670 sizeof(UNICODE_NULL)); /* Terminating null */
671
672 TransportDeviceName->Buffer = HeapAlloc(
674 0,
675 TransportDeviceName->MaximumLength);
676
677 if (!TransportDeviceName->Buffer)
678 return WSAENOBUFS;
679
680 /* Append the transport device name */
681 RtlAppendUnicodeStringToString(TransportDeviceName, &String);
682
683 if (*SocketType == SOCK_RAW) {
684 /* Append a separator */
685 TransportDeviceName->Buffer[TransportDeviceName->Length / sizeof(WCHAR)] = OBJ_NAME_PATH_SEPARATOR;
686 TransportDeviceName->Length += sizeof(WCHAR);
687 TransportDeviceName->Buffer[TransportDeviceName->Length / sizeof(WCHAR)] = UNICODE_NULL;
688
689 /* Append the protocol number */
690 String.Buffer = TransportDeviceName->Buffer + (TransportDeviceName->Length / sizeof(WCHAR));
691 String.Length = 0;
692 String.MaximumLength = TransportDeviceName->MaximumLength - TransportDeviceName->Length;
693
695
696 TransportDeviceName->Length += String.Length;
697 }
698
699 /* Setup a socket context area */
700
702 if (!Context) {
703 RtlFreeUnicodeString(TransportDeviceName);
704 return WSAENOBUFS;
705 }
706
707 Context->AddressFamily = *AddressFamily;
708 Context->SocketType = *SocketType;
709 Context->Protocol = *Protocol;
710 Context->Flags = Flags;
711 Context->SocketState = SocketStateCreated;
712
713 *HelperDllSocketContext = Context;
714 *NotificationEvents = WSH_NOTIFY_CLOSE | WSH_NOTIFY_BIND;
715
716 return NO_ERROR;
717}
#define OBJ_NAME_PATH_SEPARATOR
Definition: arcname_tests.c:25
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString(ULONG Value, ULONG Base, PUNICODE_STRING String)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define UNICODE_NULL
short WCHAR
Definition: pedump.c:58
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2439
#define DD_RAW_IP_DEVICE_NAME
Definition: wshtcpip.h:30
#define DD_UDP_DEVICE_NAME
Definition: wshtcpip.h:29
#define DD_TCP_DEVICE_NAME
Definition: wshtcpip.h:28
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170

Referenced by WSHOpenSocket().

◆ WSHSetSocketInformation()

INT EXPORT WSHSetSocketInformation ( IN PVOID  HelperDllSocketContext,
IN SOCKET  SocketHandle,
IN HANDLE  TdiAddressObjectHandle,
IN HANDLE  TdiConnectionObjectHandle,
IN INT  Level,
IN INT  OptionName,
IN PCHAR  OptionValue,
IN INT  OptionLength 
)

Definition at line 721 of file wshtcpip.c.

730{
731 PSOCKET_CONTEXT Context = HelperDllSocketContext;
732 ULONG TdiType, TdiId;
733 INT Status;
735 PQUEUED_REQUEST Queued, NextQueued;
736
737 DPRINT("WSHSetSocketInformation\n");
738
739 /* FIXME: We only handle address file object here */
740
741 switch (Level)
742 {
743 case SOL_SOCKET:
744 switch (OptionName)
745 {
746 case SO_DONTROUTE:
747 if (OptionLength < sizeof(BOOL))
748 {
749 return WSAEFAULT;
750 }
751 Context->DontRoute = *(BOOL*)OptionValue;
752 /* This is silently ignored on Windows */
753 return 0;
754
755 case SO_KEEPALIVE:
756 if (OptionLength < sizeof(DWORD))
757 {
758 return WSAEFAULT;
759 }
760 break;
761
762 default:
763 /* Invalid option */
764 DPRINT1("Set: Received unexpected SOL_SOCKET option %d\n", OptionName);
765 return WSAENOPROTOOPT;
766 }
767 break;
768
769 case IPPROTO_IP:
770 switch (OptionName)
771 {
772 case IP_TTL:
773 case IP_DONTFRAGMENT:
774 case IP_HDRINCL:
775 /* Send these to TCPIP */
776 break;
777
778 default:
779 /* Invalid option -- FIXME */
780 DPRINT1("Set: Received unsupported IPPROTO_IP option %d\n", OptionName);
781 return 0;
782 }
783 break;
784
785 case IPPROTO_TCP:
786 switch (OptionName)
787 {
788 case TCP_NODELAY:
789 if (OptionLength < sizeof(CHAR))
790 {
791 return WSAEFAULT;
792 }
793 break;
794
795 default:
796 /* Invalid option */
797 DPRINT1("Set: Received unexpected IPPROTO_TCP option %d\n", OptionName);
798 return 0;
799 }
800 break;
801
802 default:
803 DPRINT1("Set: Received unexpected %d option %d\n", Level, OptionName);
804 return 0;
805 }
806
807 /* If we get here, GetAddressOption must return something valid */
808 GetTdiTypeId(Level, OptionName, &TdiType, &TdiId);
809 ASSERT((TdiId != 0) && (TdiType != 0));
810
811 Info = HeapAlloc(GetProcessHeap(), 0, sizeof(*Info) + OptionLength);
812 if (!Info)
813 return WSAENOBUFS;
814
815 Info->ID.toi_entity.tei_entity = Context->AddrFileEntityType;
816 Info->ID.toi_entity.tei_instance = Context->AddrFileInstance;
817 Info->ID.toi_class = INFO_CLASS_PROTOCOL;
818 Info->ID.toi_type = TdiType;
819 Info->ID.toi_id = TdiId;
820 Info->BufferSize = OptionLength;
821 memcpy(Info->Buffer, OptionValue, OptionLength);
822
823 if (Context->SocketState == SocketStateCreated)
824 {
825 if (Context->RequestQueue)
826 {
827 Queued = Context->RequestQueue;
828 while ((NextQueued = Queued->Next))
829 {
830 Queued = NextQueued;
831 }
832
833 Queued->Next = HeapAlloc(GetProcessHeap(), 0, sizeof(QUEUED_REQUEST));
834 if (!Queued->Next)
835 {
837 return WSAENOBUFS;
838 }
839
840 NextQueued = Queued->Next;
841 NextQueued->Next = NULL;
842 NextQueued->Info = Info;
843 }
844 else
845 {
846 Context->RequestQueue = HeapAlloc(GetProcessHeap(), 0, sizeof(QUEUED_REQUEST));
847 if (!Context->RequestQueue)
848 {
850 return WSAENOBUFS;
851 }
852
853 Context->RequestQueue->Next = NULL;
854 Context->RequestQueue->Info = Info;
855 }
856
857 return 0;
858 }
859
860 Status = SendRequest(Info, sizeof(*Info) + Info->BufferSize, IOCTL_TCP_SET_INFORMATION_EX);
861
863
864 return Status;
865}
unsigned int BOOL
Definition: ntddk_ex.h:94
#define ASSERT(a)
Definition: mode.c:44
char CHAR
Definition: pedump.c:57
#define WSAENOPROTOOPT
Definition: winerror.h:2858
#define SO_DONTROUTE
Definition: winsock.h:176
static void GetTdiTypeId(_In_ INT Level, _In_ INT OptionName, _Out_ PULONG TdiType, _Out_ PULONG TdiId)
Definition: wshtcpip.c:161

◆ WSHStringToAddress()

INT EXPORT WSHStringToAddress ( IN LPWSTR  AddressString,
IN DWORD  AddressFamily,
IN LPWSAPROTOCOL_INFOW ProtocolInfo  OPTIONAL,
OUT LPSOCKADDR  Address,
IN OUT LPDWORD  AddressStringLength 
)

Definition at line 870 of file wshtcpip.c.

876{
878
879 return NO_ERROR;
880}