ReactOS 0.4.16-dev-1946-g52006dd
netio.c File Reference
#include <ntifs.h>
#include <netiodef.h>
#include <ws2def.h>
#include <wsk.h>
#include <ndis.h>
#include <reactos/debug.h>
#include <tdi.h>
#include <tcpioctl.h>
#include <tdikrnl.h>
#include <tdiinfo.h>
#include <tdi_proto.h>
#include <tdiconn.h>
Include dependency graph for netio.c:

Go to the source code of this file.

Classes

struct  _WSK_SOCKET_INTERNAL
 
struct  _NETIO_CONTEXT
 
struct  _LISTEN_CONTEXT
 

Macros

#define NDEBUG
 
#define TAG_NETIO   'OIEN'
 
#define TAG_AFD_TDI_CONNECTION_INFORMATION   'cTfA'
 
#define AFD_SHARE_UNIQUE   0x0L
 
#define AFD_SHARE_REUSE   0x1L
 
#define AFD_SHARE_WILDCARD   0x2L
 
#define AFD_SHARE_EXCLUSIVE   0x3L
 
#define FUNCTION_TRACE   do { } while (0)
 

Typedefs

typedef struct _WSK_SOCKET_INTERNAL WSK_SOCKET_INTERNAL
 
typedef struct _WSK_SOCKET_INTERNALPWSK_SOCKET_INTERNAL
 
typedef struct _NETIO_CONTEXT NETIO_CONTEXT
 
typedef struct _NETIO_CONTEXTPNETIO_CONTEXT
 
typedef struct _LISTEN_CONTEXT LISTEN_CONTEXT
 
typedef struct _LISTEN_CONTEXTPLISTEN_CONTEXT
 

Enumerations

enum  direction { DIR_SEND , DIR_RECEIVE }
 

Functions

static void ReferenceSocket (_In_ PWSK_SOCKET_INTERNAL Socket)
 
static void DereferenceSocket (_In_ PWSK_SOCKET_INTERNAL Socket)
 
static void SocketShutdown (_In_ PWSK_SOCKET_INTERNAL Socket)
 
static void SocketDestroy (_In_ PWSK_SOCKET_INTERNAL Socket)
 
static void DereferenceSocketSynchronous (_In_ PWSK_SOCKET_INTERNAL Socket)
 
static VOID NTAPI DereferenceSocketsThread (_In_opt_ void *p)
 
static NTSTATUS StartSocketDereferenceThread (void)
 
static void StopSocketDereferenceThread (void)
 
NTSTATUS NTAPI DriverEntry (_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
 
static NTSTATUS WSKAPI WskSocket (_In_ PWSK_CLIENT Client, _In_ ADDRESS_FAMILY AddressFamily, _In_ USHORT SocketType, _In_ ULONG Protocol, _In_ ULONG Flags, _In_opt_ PVOID SocketContext, _In_opt_ const VOID *Dispatch, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor, _Inout_ PIRP Irp)
 
static NTSTATUS NTAPI NetioComplete (_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PVOID ContextParam)
 
static NTSTATUS NTAPI CompletionFireEvent (_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PVOID Context)
 
static NTSTATUS CreateSocket (_In_ ADDRESS_FAMILY AddressFamily, _In_ USHORT SocketType, _In_ ULONG Protocol, _In_ ULONG Flags, _Outptr_ PWSK_SOCKET_INTERNAL *TheSocket)
 
static void QueueListening (_In_ PWSK_SOCKET_INTERNAL ListenSocket)
 
static NTSTATUS NTAPI ListenComplete (_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PVOID Context)
 
static NTSTATUS StartListening (_In_ PWSK_SOCKET_INTERNAL ListenSocket)
 
static VOID NTAPI RequeueListenThread (_In_ PVOID p)
 
static NTSTATUS WSKAPI WskControlSocket (_In_ PWSK_SOCKET SocketParam, _In_ WSK_CONTROL_SOCKET_TYPE RequestType, _In_ ULONG ControlCode, _In_ ULONG Level, _In_ SIZE_T InputSize, _In_reads_bytes_opt_(InputSize) PVOID InputBuffer, _In_ SIZE_T OutputSize, _Out_writes_bytes_opt_(OutputSize) PVOID OutputBuffer, _Out_opt_ SIZE_T *OutputSizeReturned, _Inout_opt_ PIRP Irp)
 
static NTSTATUS WSKAPI WskCloseSocket (_In_ PWSK_SOCKET SocketParam, _Inout_ PIRP Irp)
 
static PTRANSPORT_ADDRESS TdiTransportAddressFromSocketAddress (_In_ PSOCKADDR SocketAddress)
 
static PTDI_CONNECTION_INFORMATION TdiConnectionInfoFromSocketAddress (_In_ PSOCKADDR SocketAddress)
 
static NTSTATUS WSKAPI WskBind (_In_ PWSK_SOCKET SocketParam, _In_ PSOCKADDR LocalAddress, _Reserved_ ULONG Flags, _Inout_ PIRP Irp)
 
static NTSTATUS WSKAPI WskSendTo (_In_ PWSK_SOCKET SocketParam, _In_ PWSK_BUF Buffer, _Reserved_ ULONG Flags, _In_opt_ PSOCKADDR RemoteAddress, _In_ ULONG ControlInfoLength, _In_reads_bytes_opt_(ControlInfoLength) PCMSGHDR ControlInfo, _Inout_ PIRP Irp)
 
static NTSTATUS WSKAPI WskReceiveFrom (_In_ PWSK_SOCKET SocketParam, _In_ PWSK_BUF Buffer, _Reserved_ ULONG Flags, _Out_opt_ PSOCKADDR RemoteAddress, _Inout_ PULONG ControlLength, _Out_writes_bytes_opt_(*ControlLength) PCMSGHDR ControlInfo, _Out_opt_ PULONG ControlFlags, _Inout_ PIRP Irp)
 
static NTSTATUS WSKAPI WskReleaseUdp (_In_ PWSK_SOCKET SocketParam, _In_ PWSK_DATAGRAM_INDICATION DatagramIndication)
 
static NTSTATUS WSKAPI WskReleaseTcp (_In_ PWSK_SOCKET SocketParam, _In_ PWSK_DATA_INDICATION DataIndication)
 
static NTSTATUS WSKAPI WskGetLocalAddress (_In_ PWSK_SOCKET SocketParam, _Out_ PSOCKADDR LocalAddress, _Inout_ PIRP Irp)
 
static NTSTATUS WSKAPI WskGetRemoteAddress (_In_ PWSK_SOCKET SocketParam, _Out_ PSOCKADDR RemoteAddress, _Inout_ PIRP Irp)
 
static NTSTATUS WSKAPI WskSocketConnect (_In_ PWSK_CLIENT Client, _In_ USHORT SocketType, _In_ ULONG Protocol, _In_ PSOCKADDR LocalAddress, _In_ PSOCKADDR RemoteAddress, _In_ ULONG Flags, _In_opt_ PVOID SocketContext, _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH *Dispatch, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor, _Inout_ PIRP Irp)
 
static NTSTATUS WSKAPI WskControlClient (_In_ PWSK_CLIENT Client, _In_ ULONG ControlCode, _In_ SIZE_T InputSize, _In_reads_bytes_opt_(InputSize) PVOID InputBuffer, _In_ SIZE_T OutputSize, _Out_writes_bytes_opt_(OutputSize) PVOID OutputBuffer, _Out_opt_ SIZE_T *OutputSizeReturned, _Inout_opt_ PIRP Irp)
 
static NTSTATUS WSKAPI WskConnect (_In_ PWSK_SOCKET SocketParam, _In_ PSOCKADDR RemoteAddress, _Reserved_ ULONG Flags, _Inout_ PIRP Irp)
 
static NTSTATUS WSKAPI WskStreamIo (_In_ PWSK_SOCKET SocketParam, _In_ PWSK_BUF Buffer, _In_ ULONG Flags, _Inout_ PIRP Irp, _In_ enum direction Direction)
 
static NTSTATUS WSKAPI WskSend (_In_ PWSK_SOCKET SocketParam, _In_ PWSK_BUF Buffer, _In_ ULONG Flags, _Inout_ PIRP Irp)
 
static NTSTATUS WSKAPI WskReceive (_In_ PWSK_SOCKET SocketParam, _In_ PWSK_BUF Buffer, _In_ ULONG Flags, _Inout_ PIRP Irp)
 
static NTSTATUS WSKAPI WskDisconnect (_In_ PWSK_SOCKET SocketParam, _In_opt_ PWSK_BUF Buffer, _In_ ULONG Flags, _Inout_ PIRP Irp)
 
NTSTATUS WSKAPI WskRegister (_In_ PWSK_CLIENT_NPI client_npi, _Out_ PWSK_REGISTRATION reg)
 
NTSTATUS WSKAPI WskCaptureProviderNPI (_In_ PWSK_REGISTRATION reg, _In_ ULONG wait, _Out_ PWSK_PROVIDER_NPI npi)
 
VOID WSKAPI WskReleaseProviderNPI (_In_ PWSK_REGISTRATION reg)
 
VOID WSKAPI WskDeregister (_In_ PWSK_REGISTRATION reg)
 

Variables

static PWSK_SOCKET_INTERNAL SocketsToDereference = NULL
 
static KSPIN_LOCK SocketsToDereferenceListLock = 0
 
static volatile BOOLEAN DereferenceSocketsThreadShouldRun = FALSE
 
static KEVENT DereferenceSocketsEvent
 
static HANDLE DereferenceSocketsThreadHandle
 
static WSK_PROVIDER_DATAGRAM_DISPATCH UdpDispatch
 
static WSK_PROVIDER_CONNECTION_DISPATCH TcpDispatch
 
static WSK_PROVIDER_DISPATCH provider_dispatch
 

Macro Definition Documentation

◆ AFD_SHARE_EXCLUSIVE

#define AFD_SHARE_EXCLUSIVE   0x3L

Definition at line 70 of file netio.c.

◆ AFD_SHARE_REUSE

#define AFD_SHARE_REUSE   0x1L

Definition at line 68 of file netio.c.

◆ AFD_SHARE_UNIQUE

#define AFD_SHARE_UNIQUE   0x0L

Definition at line 67 of file netio.c.

◆ AFD_SHARE_WILDCARD

#define AFD_SHARE_WILDCARD   0x2L

Definition at line 69 of file netio.c.

◆ FUNCTION_TRACE

#define FUNCTION_TRACE   do { } while (0)

Definition at line 74 of file netio.c.

◆ NDEBUG

#define NDEBUG

Definition at line 50 of file netio.c.

◆ TAG_AFD_TDI_CONNECTION_INFORMATION

#define TAG_AFD_TDI_CONNECTION_INFORMATION   'cTfA'

Definition at line 63 of file netio.c.

◆ TAG_NETIO

#define TAG_NETIO   'OIEN'

Definition at line 60 of file netio.c.

Typedef Documentation

◆ LISTEN_CONTEXT

◆ NETIO_CONTEXT

◆ PLISTEN_CONTEXT

◆ PNETIO_CONTEXT

◆ PWSK_SOCKET_INTERNAL

◆ WSK_SOCKET_INTERNAL

Enumeration Type Documentation

◆ direction

Enumerator
DIR_SEND 
DIR_RECEIVE 

Definition at line 881 of file netio.c.

882{
883 DIR_SEND,
885};
@ DIR_SEND
Definition: netio.c:883
@ DIR_RECEIVE
Definition: netio.c:884

Function Documentation

◆ CompletionFireEvent()

static NTSTATUS NTAPI CompletionFireEvent ( _In_ PDEVICE_OBJECT  DeviceObject,
_In_ PIRP  Irp,
_In_ PVOID  Context 
)
static

Definition at line 414 of file netio.c.

415{
417
419
421
423}
#define FALSE
Definition: types.h:117
#define PKEVENT
Definition: env_spec_w32.h:70
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define FUNCTION_TRACE
Definition: netio.c:74
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:68
#define IO_NO_INCREMENT
Definition: iotypes.h:598

Referenced by CreateSocket().

◆ CreateSocket()

static NTSTATUS CreateSocket ( _In_ ADDRESS_FAMILY  AddressFamily,
_In_ USHORT  SocketType,
_In_ ULONG  Protocol,
_In_ ULONG  Flags,
_Outptr_ PWSK_SOCKET_INTERNAL TheSocket 
)
static

Definition at line 425 of file netio.c.

431{
432 PIRP NewSocketIrp;
433 KEVENT CompletionEvent;
435
437
438 NewSocketIrp = IoAllocateIrp(1, FALSE);
439 if (NewSocketIrp == NULL)
440 {
441 DPRINT1("Out of memory?\n");
443 }
444 KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE);
445 IoSetCompletionRoutine(NewSocketIrp, CompletionFireEvent, &CompletionEvent, TRUE, TRUE, TRUE);
446 NewSocketIrp->Tail.Overlay.Thread = PsGetCurrentThread();
447
449 NULL, NULL, NULL, NULL, NULL, NewSocketIrp);
450
451 if (Status == STATUS_PENDING)
452 {
454 Status = NewSocketIrp->IoStatus.Status;
455 }
456
457 if (NT_SUCCESS(Status))
458 {
459 *TheSocket = (PWSK_SOCKET_INTERNAL)NewSocketIrp->IoStatus.Information;
460 }
461
462 IoFreeIrp(NewSocketIrp);
463 return Status;
464}
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
Status
Definition: gdiplustypes.h:25
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:490
IN PCO_ADDRESS_FAMILY AddressFamily
Definition: ndis.h:1906
#define KernelMode
Definition: asm.h:38
static NTSTATUS NTAPI CompletionFireEvent(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PVOID Context)
Definition: netio.c:414
struct _WSK_SOCKET_INTERNAL * PWSK_SOCKET_INTERNAL
static NTSTATUS WSKAPI WskSocket(_In_ PWSK_CLIENT Client, _In_ ADDRESS_FAMILY AddressFamily, _In_ USHORT SocketType, _In_ ULONG Protocol, _In_ ULONG Flags, _In_opt_ PVOID SocketContext, _In_opt_ const VOID *Dispatch, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor, _Inout_ PIRP Irp)
Definition: netio.c:1309
@ NotificationEvent
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
Definition: irp.c:615
VOID NTAPI IoFreeIrp(IN PIRP Irp)
Definition: irp.c:1666
IO_STATUS_BLOCK IoStatus
#define STATUS_PENDING
Definition: telnetd.h:14
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ USHORT SocketType
Definition: wsk.h:182
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
@ Executive
Definition: ketypes.h:467

◆ DereferenceSocket()

static void DereferenceSocket ( _In_ PWSK_SOCKET_INTERNAL  Socket)
static

Definition at line 311 of file netio.c.

312{
314
316
317 /* We are doing calls like ZwClose, TdiDisassociateAddressFile, ...
318 which require IRQL to be PASSIVE_LEVEL. So if we get here
319 when IRQL is greater than PASSIVE_LEVEL, defer the DereferenceSocket()
320 to a separate thread. */
321
323 {
325 if (Socket->NumSocketDereferences == 0)
326 {
327 Socket->NextSocketToDereference = SocketsToDereference;
328 SocketsToDereference = Socket;
329 Socket->NumSocketDereferences = 1;
330 }
331 else
332 {
333 Socket->NumSocketDereferences++;
334 }
336
338
339 return;
340 }
342}
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
static void DereferenceSocketSynchronous(_In_ PWSK_SOCKET_INTERNAL Socket)
Definition: netio.c:232
static PWSK_SOCKET_INTERNAL SocketsToDereference
Definition: netio.c:240
static KEVENT DereferenceSocketsEvent
Definition: netio.c:243
static KSPIN_LOCK SocketsToDereferenceListLock
Definition: netio.c:241
ULONG NumSocketDereferences
Definition: netio.c:125
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778

Referenced by ListenComplete(), NetioComplete(), SocketShutdown(), StartListening(), WskCloseSocket(), WskConnect(), and WskSendTo().

◆ DereferenceSocketsThread()

static VOID NTAPI DereferenceSocketsThread ( _In_opt_ void p)
static

Definition at line 246 of file netio.c.

247{
249 PWSK_SOCKET_INTERNAL SocketToDereference;
251 ULONG NumSocketDereferences;
252
254
256 {
258 if (!NT_SUCCESS(status))
259 {
260 DPRINT1("KeWaitForSingleObject failed with status 0x%08x!\n", status);
261 }
262
264 while (SocketsToDereference != NULL)
265 {
266 SocketToDereference = SocketsToDereference;
267 SocketsToDereference = SocketToDereference->NextSocketToDereference;
268 NumSocketDereferences = SocketToDereference->NumSocketDereferences;
269
270 while (NumSocketDereferences > 0)
271 {
272 SocketToDereference->NumSocketDereferences--;
273 NumSocketDereferences = SocketToDereference->NumSocketDereferences;
274
276 DereferenceSocketSynchronous(SocketToDereference);
278 }
279 }
281 }
282
284}
static volatile BOOLEAN DereferenceSocketsThreadShouldRun
Definition: netio.c:242
NTSTATUS NTAPI PsTerminateSystemThread(IN NTSTATUS ExitStatus)
Definition: kill.c:1145
#define STATUS_SUCCESS
Definition: shellext.h:65
struct _WSK_SOCKET_INTERNAL * NextSocketToDereference
Definition: netio.c:124
Definition: ps.c:97
uint32_t ULONG
Definition: typedefs.h:59

Referenced by StartSocketDereferenceThread().

◆ DereferenceSocketSynchronous()

static void DereferenceSocketSynchronous ( _In_ PWSK_SOCKET_INTERNAL  Socket)
static

Definition at line 232 of file netio.c.

233{
234 if (InterlockedDecrement(&Socket->RefCount) == 0)
235 {
236 SocketDestroy(Socket);
237 }
238}
#define InterlockedDecrement
Definition: armddk.h:52
static void SocketDestroy(_In_ PWSK_SOCKET_INTERNAL Socket)
Definition: netio.c:206

Referenced by DereferenceSocket(), and DereferenceSocketsThread().

◆ DriverEntry()

NTSTATUS NTAPI DriverEntry ( _In_ PDRIVER_OBJECT  DriverObject,
_In_ PUNICODE_STRING  RegistryPath 
)

Definition at line 345 of file netio.c.

346{
348
349 return STATUS_SUCCESS;
350}

◆ ListenComplete()

static NTSTATUS NTAPI ListenComplete ( _In_ PDEVICE_OBJECT  DeviceObject,
_In_ PIRP  Irp,
_In_ PVOID  Context 
)
static

Definition at line 474 of file netio.c.

475{
476 PLISTEN_CONTEXT ListenContext = (PLISTEN_CONTEXT)Context;
477 PWSK_SOCKET_INTERNAL ListenSocket = ListenContext->ListenSocket;
479 PWSK_CLIENT_LISTEN_DISPATCH ListenDispatch =
481
482 /* A PTRANSPORT_ADDRESS address field has an additional
483 * AddressLength field so the struct sockaddr_in starts
484 * at the AddressType (the address family, 2 for AF_INET)
485 * field.
486 */
487
489 (PSOCKADDR)(&((PTRANSPORT_ADDRESS)ListenContext->ReturnConnectionInfo->RemoteAddress)->Address[0].AddressType);
493
495
496 if (ListenSocket->CallbackMask & WSK_EVENT_ACCEPT &&
497 ListenDispatch->WskAcceptEvent != NULL &&
498 ListenSocket->ListenIrp != NULL &&
499 !ListenSocket->ListenCancelled &&
500 Irp->IoStatus.Status != STATUS_CANCELLED)
501 {
502 ListenSocket->ListenIrp = NULL;
503
504 Status = ListenDispatch->WskAcceptEvent(ListenSocket->user_context,
505 0,
506 &ListenSocket->LocalAddress,
508 &AcceptSocket->Socket,
511
512 if (!NT_SUCCESS(Status))
513 {
514 DPRINT1("ListenDispatch->WskAcceptEvent returned non-successful status 0x%08x\n", Status);
515 }
516 else
517 {
518 memcpy(&AcceptSocket->RemoteAddress, RemoteAddress, sizeof(AcceptSocket->RemoteAddress));
519 }
520 }
521 else
522 {
523 DereferenceSocket(AcceptSocket); /* close the AcceptSocket */
524 }
525 ListenSocket->ListenIrp = NULL;
526
528 DereferenceSocket(ListenSocket);
529
532 ExFreePoolWithTag(ListenContext, TAG_NETIO);
533
534 /* And wait for the next incoming connection.
535 * This is done in a separate thread at IRQL = PASSIVE_LEVEL
536 */
537
538 QueueListening(ListenSocket);
539
540 return STATUS_SUCCESS;
541}
_In_ PIRP Irp
Definition: csq.h:116
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define TAG_NETIO
Definition: netio.c:60
struct _LISTEN_CONTEXT * PLISTEN_CONTEXT
#define TAG_AFD_TDI_CONNECTION_INFORMATION
Definition: netio.c:63
static void DereferenceSocket(_In_ PWSK_SOCKET_INTERNAL Socket)
Definition: netio.c:311
static void QueueListening(_In_ PWSK_SOCKET_INTERNAL ListenSocket)
Definition: netio.c:466
PWSK_SOCKET_INTERNAL ListenSocket
Definition: netio.c:408
PTDI_CONNECTION_INFORMATION ReturnConnectionInfo
Definition: netio.c:410
PWSK_SOCKET_INTERNAL AcceptSocket
Definition: netio.c:409
PTDI_CONNECTION_INFORMATION RequestConnectionInfo
Definition: netio.c:410
PFN_WSK_ACCEPT_EVENT WskAcceptEvent
Definition: wsk.h:527
struct sockaddr LocalAddress
Definition: netio.c:87
const WSK_CLIENT_LISTEN_DISPATCH * ListenDispatch
Definition: netio.c:101
PVOID user_context
Definition: netio.c:84
volatile BOOLEAN ListenCancelled
Definition: netio.c:108
struct _TRANSPORT_ADDRESS * PTRANSPORT_ADDRESS
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _In_opt_ PWSK_SOCKET _Outptr_result_maybenull_ PVOID * AcceptSocketContext
Definition: wsk.h:174
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _In_opt_ PWSK_SOCKET AcceptSocket
Definition: wsk.h:173
#define WSK_EVENT_ACCEPT
Definition: wsk.h:59
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR RemoteAddress
Definition: wsk.h:172
struct _WSK_CLIENT_LISTEN_DISPATCH * PWSK_CLIENT_LISTEN_DISPATCH
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _In_opt_ PWSK_SOCKET _Outptr_result_maybenull_ PVOID _Outptr_result_maybenull_ const WSK_CLIENT_CONNECTION_DISPATCH ** AcceptSocketDispatch
Definition: wsk.h:175

◆ NetioComplete()

static NTSTATUS NTAPI NetioComplete ( _In_ PDEVICE_OBJECT  DeviceObject,
_In_ PIRP  Irp,
_In_ PVOID  ContextParam 
)
static

Definition at line 367 of file netio.c.

368{
369 PNETIO_CONTEXT Context = (PNETIO_CONTEXT)ContextParam;
370 PIRP UserIrp = Context->UserIrp;
371
373
374 if (Irp->IoStatus.Status != STATUS_CANCELLED)
375 {
376 UserIrp->IoStatus.Status = Irp->IoStatus.Status;
377 UserIrp->IoStatus.Information = Irp->IoStatus.Information;
378 }
379
380 if (Context->PeerAddrRet != NULL)
381 {
383 (PSOCKADDR)(&((PTRANSPORT_ADDRESS)Context->PeerAddrRet->RemoteAddress)->Address[0].AddressType);
384
385 memcpy(&Context->socket->RemoteAddress, RemoteAddress, sizeof(Context->socket->RemoteAddress));
386 }
387 if (Irp->IoStatus.Status != STATUS_CANCELLED)
388 {
390 }
391
392 DereferenceSocket(Context->socket);
393 if (Context->TargetConnectionInfo != NULL)
394 {
396 }
397 if (Context->PeerAddrRet != NULL)
398 {
400 }
402
403 return STATUS_SUCCESS;
404}
#define IO_NETWORK_INCREMENT
Definition: tcpip.h:43
struct _NETIO_CONTEXT * PNETIO_CONTEXT
#define IoCompleteRequest
Definition: irp.c:1240
static WCHAR Address[46]
Definition: ping.c:68
struct sockaddr * PSOCKADDR
Definition: winsock.h:479

Referenced by WskConnect(), WskSendTo(), and WskStreamIo().

◆ QueueListening()

static void QueueListening ( _In_ PWSK_SOCKET_INTERNAL  ListenSocket)
static

Definition at line 466 of file netio.c.

467{
469
470 KeSetEvent(&ListenSocket->StartListenEvent, IO_NO_INCREMENT, FALSE);
471}

Referenced by ListenComplete(), and WskControlSocket().

◆ ReferenceSocket()

static void ReferenceSocket ( _In_ PWSK_SOCKET_INTERNAL  Socket)
static

Definition at line 137 of file netio.c.

138{
140
141 InterlockedIncrement(&Socket->RefCount);
142}
#define InterlockedIncrement
Definition: armddk.h:53

Referenced by StartListening(), WskConnect(), WskSendTo(), and WskStreamIo().

◆ RequeueListenThread()

static VOID NTAPI RequeueListenThread ( _In_ PVOID  p)
static

Definition at line 641 of file netio.c.

642{
645
647
648 while (ListenSocket->ListenThreadShouldRun)
649 {
651 if (!NT_SUCCESS(status))
652 {
653 DPRINT1("KeWaitForSingleObject failed with status 0x%08x!\n", status);
654 }
655 if (!ListenSocket->ListenThreadShouldRun)
656 {
657 break;
658 }
659 StartListening(ListenSocket);
660 }
662}
GLfloat GLfloat p
Definition: glext.h:8902
static NTSTATUS StartListening(_In_ PWSK_SOCKET_INTERNAL ListenSocket)
Definition: netio.c:544
volatile BOOLEAN ListenThreadShouldRun
Definition: netio.c:112
KEVENT StartListenEvent
Definition: netio.c:111

Referenced by WskSocket().

◆ SocketDestroy()

static void SocketDestroy ( _In_ PWSK_SOCKET_INTERNAL  Socket)
static

Definition at line 206 of file netio.c.

207{
208 SocketShutdown(Socket);
209
210 /* Especially listen sockets must keep the LocalAddressFile
211 * open when being closed and there are still accepted sockets
212 * somewhere. Else the accepted socket I/O will fail with
213 * STATUS_INVALID_DEVICE_STATE. So do not close the
214 * address file in Shutdown only close it here when all AcceptSockets
215 * are gone (AcceptSockets hold a reference to the listen socket).
216 */
217
218 if (Socket->LocalAddressFile != NULL)
219 {
220 ObDereferenceObject(Socket->LocalAddressFile);
221 Socket->LocalAddressFile = NULL;
222 }
223 if (Socket->LocalAddressHandle != NULL)
224 {
225 ZwClose(Socket->LocalAddressHandle);
226 Socket->LocalAddressHandle = NULL;
227 }
229}
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
static void SocketShutdown(_In_ PWSK_SOCKET_INTERNAL Socket)
Definition: netio.c:153
#define ObDereferenceObject
Definition: obfuncs.h:203

Referenced by DereferenceSocketSynchronous().

◆ SocketShutdown()

static void SocketShutdown ( _In_ PWSK_SOCKET_INTERNAL  Socket)
static

Definition at line 153 of file netio.c.

154{
156
158
159 if (Socket->ListenSocket != NULL)
160 {
161 DereferenceSocket(Socket->ListenSocket);
162 Socket->ListenSocket = NULL;
163 }
164 if (Socket->ListenThreadHandle != NULL)
165 {
166 Socket->ListenThreadShouldRun = FALSE;
167 KeSetEvent(&Socket->StartListenEvent, IO_NO_INCREMENT, FALSE);
169 if (!NT_SUCCESS(status))
170 {
171 DPRINT1("KeWaitForSingleObject failed with status 0x%08x!\n", status);
172 }
173 ObDereferenceObject(Socket->ListenThread);
174 Socket->ListenThread = NULL;
175 Socket->ListenThreadHandle = NULL;
176 }
177 if (Socket->ListenIrp != NULL)
178 {
179 Socket->ListenCancelled = TRUE;
180 IoCancelIrp(Socket->ListenIrp);
181 Socket->ListenIrp = NULL;
182 }
183 if (Socket->ConnectionFile != NULL)
184 {
185 if (Socket->ConnectionFileAssociated)
186 {
187 /* This fails with error STATUS_CONNECTION_ACTIVE on Windows 2003 */
188 status = TdiDisassociateAddressFile(Socket->ConnectionFile);
189 if (!NT_SUCCESS(status))
190 {
191 DPRINT1("Warning: TdiDisassociateAddressFile returned status %08x\n", status);
192 }
193 Socket->ConnectionFileAssociated = FALSE;
194 }
195 ObDereferenceObject(Socket->ConnectionFile);
196 Socket->ConnectionFile = NULL;
197 }
198 if (Socket->ConnectionHandle != NULL)
199 {
200 ZwClose(Socket->ConnectionHandle);
201 Socket->ConnectionHandle = NULL;
202 }
203}
BOOLEAN NTAPI IoCancelIrp(IN PIRP Irp)
Definition: irp.c:1101
NTSTATUS TdiDisassociateAddressFile(PFILE_OBJECT ConnectionObject)
Disassociates a connection endpoint from an address file object.
Definition: tdi.c:416

Referenced by SocketDestroy(), WskCloseSocket(), and WskDisconnect().

◆ StartListening()

static NTSTATUS StartListening ( _In_ PWSK_SOCKET_INTERNAL  ListenSocket)
static

Definition at line 544 of file netio.c.

545{
546 PIRP tdiIrp;
550
552
553 if (ListenSocket->LocalAddressHandle == NULL)
554 {
555 DPRINT1("LocalAddressHandle is not set, need to bind your socket before listening\n");
557 }
558
559 status = CreateSocket(ListenSocket->family, ListenSocket->type, ListenSocket->proto, WSK_FLAG_CONNECTION_SOCKET, &AcceptSocket);
560 if (!NT_SUCCESS(status))
561 {
562 DPRINT1("Could not create AcceptSocket, status is 0x%08x\n", status);
563 return status;
564 }
565 AcceptSocket->ListenSocket = ListenSocket;
566 /* Dereferenced when the AcceptSocket is closed */
567 ReferenceSocket(AcceptSocket->ListenSocket);
568
571 if (lc == NULL)
572 {
573 goto err_out_free_accept_socket;
574 }
575 lc->ListenSocket = ListenSocket;
577
578 tdiIrp = NULL;
579
580 status = TdiAssociateAddressFile(ListenSocket->LocalAddressHandle, AcceptSocket->ConnectionFile);
581 if (!NT_SUCCESS(status))
582 {
583 goto err_out_free_lc;
584 }
585 AcceptSocket->ConnectionFileAssociated = TRUE;
586
589 if (lc->RequestConnectionInfo == NULL)
590 {
591 goto err_out_free_lc_and_disassociate;
592 }
594
597 if (lc->ReturnConnectionInfo == NULL)
598 {
599 goto err_out_free_lc_and_req_conn_info;
600 }
602
603 ReferenceSocket(ListenSocket);
605
606 ListenSocket->ListenCancelled = FALSE;
607 /* pass the ConnectionFile from accept socket, not from ListenSocket ... */
608 status = TdiListen(&tdiIrp, AcceptSocket->ConnectionFile, &lc->RequestConnectionInfo, &lc->ReturnConnectionInfo, ListenComplete, lc);
609
610 if (!NT_SUCCESS(status))
611 {
613 DereferenceSocket(ListenSocket);
615 goto err_out_free_lc_and_req_conn_info;
616 }
617 ListenSocket->ListenIrp = tdiIrp;
618
619 return STATUS_PENDING;
620
621err_out_free_lc_and_req_conn_info:
623
624err_out_free_lc_and_disassociate:
626 if (!NT_SUCCESS(status))
627 {
628 DPRINT1("Warning: TdiDisassociateAddressFile returned status %08x\n", status);
629 }
630 AcceptSocket->ConnectionFileAssociated = FALSE;
631
632err_out_free_lc:
634
635err_out_free_accept_socket:
637
638 return status;
639}
#define ExAllocatePoolUninitialized
static IO_COMPLETION_ROUTINE ListenComplete
Definition: listen.c:89
#define NonPagedPool
Definition: env_spec_w32.h:307
static void ReferenceSocket(_In_ PWSK_SOCKET_INTERNAL Socket)
Definition: netio.c:137
#define TDI_ADDRESS_TYPE_IP
Definition: tdi.h:345
NTSTATUS TdiBuildNullConnectionInfo(PTDI_CONNECTION_INFORMATION *ConnectionInfo, ULONG Type)
Builds a NULL TDI connection information structure.
Definition: tdiconn.c:181
NTSTATUS TdiListen(PIRP *Irp, PFILE_OBJECT ConnectionObject, PTDI_CONNECTION_INFORMATION *RequestConnectionInfo, PTDI_CONNECTION_INFORMATION *ReturnConnectionInfo, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Listen on a connection endpoint for a connection request from a remote peer.
Definition: tdi.c:463
NTSTATUS TdiAssociateAddressFile(HANDLE AddressHandle, PFILE_OBJECT ConnectionObject)
Associates a connection endpoint to an address file object.
Definition: tdi.c:366
static void CreateSocket(void)
Definition: telnetd.c:102
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define WSK_FLAG_CONNECTION_SOCKET
Definition: wsk.h:46

Referenced by RequeueListenThread().

◆ StartSocketDereferenceThread()

static NTSTATUS StartSocketDereferenceThread ( void  )
static

Definition at line 286 of file netio.c.

287{
289
293
295 if (!NT_SUCCESS(status))
296 {
297 DPRINT1("Could not start put sockets thread, status is %x\n", status);
298 }
299 return status;
300}
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
static HANDLE DereferenceSocketsThreadHandle
Definition: netio.c:244
static VOID NTAPI DereferenceSocketsThread(_In_opt_ void *p)
Definition: netio.c:246
#define THREAD_ALL_ACCESS
Definition: nt_native.h:1342
@ SynchronizationEvent
NTSTATUS NTAPI PsCreateSystemThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle, IN PCLIENT_ID ClientId, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext)
Definition: thread.c:602

Referenced by WskCaptureProviderNPI().

◆ StopSocketDereferenceThread()

static void StopSocketDereferenceThread ( void  )
static

Definition at line 302 of file netio.c.

303{
306
307 /* eventually it will terminate, no need to wait for that. */
308}

Referenced by WskReleaseProviderNPI().

◆ TdiConnectionInfoFromSocketAddress()

static PTDI_CONNECTION_INFORMATION TdiConnectionInfoFromSocketAddress ( _In_ PSOCKADDR  SocketAddress)
static

Definition at line 822 of file netio.c.

823{
825 PTDI_CONNECTION_INFORMATION ConnectionInformation = NULL;
827
829 if (TargetAddress == NULL)
830 return NULL;
831
832 status = TdiBuildConnectionInfo(&ConnectionInformation, TargetAddress);
834
835 if (!NT_SUCCESS(status))
836 {
837 if (ConnectionInformation != NULL)
838 {
840 }
841 return NULL;
842 }
843 ConnectionInformation->OptionsLength = 0;
844 return ConnectionInformation;
845}
static PTRANSPORT_ADDRESS TdiTransportAddressFromSocketAddress(_In_ PSOCKADDR SocketAddress)
Definition: netio.c:797
NTSTATUS TdiBuildConnectionInfo(PTDI_CONNECTION_INFORMATION *ConnectionInfo, PTRANSPORT_ADDRESS Name)
Definition: tdiconn.c:247
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER _Outptr_ PVOID * TargetAddress
Definition: iotypes.h:1037

Referenced by WskConnect(), and WskSendTo().

◆ TdiTransportAddressFromSocketAddress()

static PTRANSPORT_ADDRESS TdiTransportAddressFromSocketAddress ( _In_ PSOCKADDR  SocketAddress)
static

Definition at line 797 of file netio.c.

798{
800 ULONG Size;
801
803 FIELD_OFFSET(TA_ADDRESS, Address[sizeof(SocketAddress->sa_data)]);
804
806 if (ta == NULL)
807 {
808 DPRINT1("TdiTransportAddressFromSocketAddress: Out of memory\n");
809 return NULL;
810 }
811
812 ta->TAAddressCount = 1;
813 ta->Address[0].AddressLength = sizeof(SocketAddress->sa_data);
814 ta->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; /* AF_INET */
815
816 memcpy(&ta->Address[0].Address[0], &SocketAddress->sa_data, ta->Address[0].AddressLength);
817
818 return ta;
819}
UCHAR Address[1]
Definition: tdi.h:340
USHORT AddressLength
Definition: tdi.h:338
USHORT AddressType
Definition: tdi.h:339
TA_ADDRESS Address[1]
Definition: tdi.h:377
LONG TAAddressCount
Definition: tdi.h:376
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539

Referenced by TdiConnectionInfoFromSocketAddress(), and WskBind().

◆ WskBind()

static NTSTATUS WSKAPI WskBind ( _In_ PWSK_SOCKET  SocketParam,
_In_ PSOCKADDR  LocalAddress,
_Reserved_ ULONG  Flags,
_Inout_ PIRP  Irp 
)
static

Definition at line 848 of file netio.c.

849{
851 PWSK_SOCKET_INTERNAL Socket = CONTAINING_RECORD(SocketParam, WSK_SOCKET_INTERNAL, Socket);
852
854
857
858 if (ta == NULL)
859 {
861 goto err_out;
862 }
863 if (Socket->LocalAddressHandle != NULL)
864 {
866 goto err_out;
867 }
868
870 ta, AFD_SHARE_REUSE, &Socket->LocalAddressHandle, &Socket->LocalAddressFile);
871
873
874err_out:
875 Irp->IoStatus.Status = status;
877
878 return STATUS_PENDING;
879}
#define AFD_SHARE_REUSE
Definition: netio.c:68
HANDLE LocalAddressHandle
Definition: netio.c:89
PFILE_OBJECT LocalAddressFile
Definition: netio.c:88
UNICODE_STRING TdiName
Definition: netio.c:85
NTSTATUS TdiOpenAddressFile(PUNICODE_STRING DeviceName, PTRANSPORT_ADDRESS Name, ULONG ShareType, PHANDLE AddressHandle, PFILE_OBJECT *AddressObject)
Opens an IPv4 address file object.
Definition: tdi.c:148
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR LocalAddress
Definition: wsk.h:171
FORCEINLINE VOID IoSetNextIrpStackLocation(_Inout_ PIRP Irp)
Definition: iofuncs.h:2680

◆ WskCaptureProviderNPI()

NTSTATUS WSKAPI WskCaptureProviderNPI ( _In_ PWSK_REGISTRATION  reg,
_In_ ULONG  wait,
_Out_ PWSK_PROVIDER_NPI  npi 
)

Definition at line 1477 of file netio.c.

1478{
1480
1481 npi->Client = NULL;
1482 npi->Dispatch = &provider_dispatch;
1483
1485}
static NTSTATUS StartSocketDereferenceThread(void)
Definition: netio.c:286
static WSK_PROVIDER_DISPATCH provider_dispatch
Definition: netio.c:1456

◆ WskCloseSocket()

static NTSTATUS WSKAPI WskCloseSocket ( _In_ PWSK_SOCKET  SocketParam,
_Inout_ PIRP  Irp 
)
static

Definition at line 775 of file netio.c.

776{
778 PWSK_SOCKET_INTERNAL Socket = CONTAINING_RECORD(SocketParam, WSK_SOCKET_INTERNAL, Socket);
779
781
782 /* There might be a reference from (for example) a pending
783 * receive. Shutdown the socket here explicitly. We expect
784 * all pending I/O operations to be cancelled, then.
785 */
786
787 SocketShutdown(Socket);
788 DereferenceSocket(Socket);
789
790 Irp->IoStatus.Status = status;
792
793 return STATUS_PENDING;
794}

◆ WskConnect()

static NTSTATUS WSKAPI WskConnect ( _In_ PWSK_SOCKET  SocketParam,
_In_ PSOCKADDR  RemoteAddress,
_Reserved_ ULONG  Flags,
_Inout_ PIRP  Irp 
)
static

Definition at line 1098 of file netio.c.

1099{
1100 PTDI_CONNECTION_INFORMATION TargetConnectionInfo, PeerAddrRet;
1101 PIRP tdiIrp;
1102 PWSK_SOCKET_INTERNAL Socket = CONTAINING_RECORD(SocketParam, WSK_SOCKET_INTERNAL, Socket);
1103 NTSTATUS status, status2;
1104 PNETIO_CONTEXT NetioContext;
1105
1107
1109
1111 if (Socket->LocalAddressHandle == NULL)
1112 {
1113 DPRINT1("LocalAddressHandle is not set, need to bind your socket before connecting\n");
1114 goto err_out;
1115 }
1116
1118 NetioContext = ExAllocatePoolUninitialized(NonPagedPool, sizeof(*NetioContext), TAG_NETIO);
1119 if (NetioContext == NULL)
1120 {
1121 goto err_out;
1122 }
1123 NetioContext->socket = Socket;
1124 NetioContext->UserIrp = Irp;
1125
1126 tdiIrp = NULL;
1127
1129 if (!NT_SUCCESS(status))
1130 {
1131 goto err_out_free_nc;
1132 }
1134
1135 TargetConnectionInfo = TdiConnectionInfoFromSocketAddress(RemoteAddress);
1136 if (TargetConnectionInfo == NULL)
1137 {
1138 goto err_out_free_nc_and_disassociate;
1139 }
1140 NetioContext->TargetConnectionInfo = TargetConnectionInfo;
1141
1142 PeerAddrRet = NULL;
1144 if (PeerAddrRet == NULL)
1145 {
1146 goto err_out_free_nc_and_tci;
1147 }
1148 PeerAddrRet->OptionsLength = 0;
1149 NetioContext->PeerAddrRet = PeerAddrRet;
1150
1152 ReferenceSocket(Socket);
1153
1154 status = TdiConnect(&tdiIrp, Socket->ConnectionFile, TargetConnectionInfo, PeerAddrRet, NetioComplete, NetioContext);
1155
1156 if (!NT_SUCCESS(status))
1157 {
1158 /* If allocating tdiIrp fails we get here.
1159 * Call the IoCompletion of the application's Irp so this Irp
1160 * gets freed.
1161 */
1162 ExFreePoolWithTag(PeerAddrRet, TAG_NETIO);
1163 DereferenceSocket(Socket);
1164 goto err_out_free_nc_and_tci;
1165 }
1166 return STATUS_PENDING;
1167
1168err_out_free_nc_and_tci:
1170
1171err_out_free_nc_and_disassociate:
1172 status2 = TdiDisassociateAddressFile(Socket->ConnectionFile);
1173 if (!NT_SUCCESS(status2))
1174 {
1175 DPRINT1("Warning: TdiDisassociateAddressFile returned status %08x\n", status);
1176 }
1178
1179err_out_free_nc:
1180 ExFreePoolWithTag(NetioContext, TAG_NETIO);
1181
1182err_out:
1183 Irp->IoStatus.Status = status;
1185
1186 return status;
1187}
IoMarkIrpPending(Irp)
static PTDI_CONNECTION_INFORMATION TdiConnectionInfoFromSocketAddress(_In_ PSOCKADDR SocketAddress)
Definition: netio.c:822
static NTSTATUS NTAPI NetioComplete(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PVOID ContextParam)
Definition: netio.c:367
PTDI_CONNECTION_INFORMATION TargetConnectionInfo
Definition: netio.c:132
PTDI_CONNECTION_INFORMATION PeerAddrRet
Definition: netio.c:133
PIRP UserIrp
Definition: netio.c:130
PWSK_SOCKET_INTERNAL socket
Definition: netio.c:131
BOOLEAN ConnectionFileAssociated
Definition: netio.c:98
PFILE_OBJECT ConnectionFile
Definition: netio.c:96
NTSTATUS TdiConnect(PIRP *PendingIrp, PFILE_OBJECT ConnectionObject, PTDI_CONNECTION_INFORMATION ConnectionCallInfo, PTDI_CONNECTION_INFORMATION ConnectionReturnInfo, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Connect a connection endpoint to a remote peer.
Definition: tdi.c:311

◆ WskControlClient()

static NTSTATUS WSKAPI WskControlClient ( _In_ PWSK_CLIENT  Client,
_In_ ULONG  ControlCode,
_In_ SIZE_T  InputSize,
_In_reads_bytes_opt_(InputSize) PVOID  InputBuffer,
_In_ SIZE_T  OutputSize,
_Out_writes_bytes_opt_(OutputSize) PVOID  OutputBuffer,
_Out_opt_ SIZE_T OutputSizeReturned,
_Inout_opt_ PIRP  Irp 
)
static

Definition at line 1065 of file netio.c.

1073{
1075
1077 if (Irp != NULL)
1078 {
1079 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
1081 }
1083}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42

◆ WskControlSocket()

static NTSTATUS WSKAPI WskControlSocket ( _In_ PWSK_SOCKET  SocketParam,
_In_ WSK_CONTROL_SOCKET_TYPE  RequestType,
_In_ ULONG  ControlCode,
_In_ ULONG  Level,
_In_ SIZE_T  InputSize,
_In_reads_bytes_opt_(InputSize) PVOID  InputBuffer,
_In_ SIZE_T  OutputSize,
_Out_writes_bytes_opt_(OutputSize) PVOID  OutputBuffer,
_Out_opt_ SIZE_T OutputSizeReturned,
_Inout_opt_ PIRP  Irp 
)
static

Definition at line 665 of file netio.c.

676{
677 PWSK_SOCKET_INTERNAL Socket = CONTAINING_RECORD(SocketParam, WSK_SOCKET_INTERNAL, Socket);
679
681
682 if (Socket == NULL)
683 {
685 goto err_out;
686 }
688
689 switch (RequestType)
690 {
691 case WskSetOption:
692 switch (Level)
693 {
694 case SOL_SOCKET:
695 switch (ControlCode)
696 {
697 case SO_REUSEADDR: /* add more supported flags here */
698 if (InputBuffer == NULL)
699 {
700 DPRINT1("WskControlSocket: Need an InputBuffer for this operation\n");
702 break;
703 }
704 if (InputSize < sizeof(UINT))
705 {
706 DPRINT1("WskControlSocket: InputBuffer too small for this operation\n");
708 break;
709 }
711 if (enable != 0)
712 {
713 Socket->Flags |= ControlCode;
714 }
715 else
716 {
717 Socket->Flags &= ~ControlCode;
718 }
720 break;
721
722 /* Windows specific. This sets the mask for callback functions. */
724 if (InputBuffer == NULL)
725 {
726 DPRINT1("WskControlSocket: Need an InputBuffer for this operation\n");
728 break;
729 }
730 if (InputSize < sizeof(WSK_EVENT_CALLBACK_CONTROL))
731 {
732 DPRINT1("WskControlSocket: InputBuffer too small for this operation\n");
734 break;
735 }
737
738 if (((Socket->CallbackMask & WSK_EVENT_ACCEPT) == 0) &&
739 ((Control->EventMask & WSK_EVENT_ACCEPT) == WSK_EVENT_ACCEPT))
740 {
741 Socket->CallbackMask = Control->EventMask;
742 QueueListening(Socket);
743 }
744 else
745 {
746 Socket->CallbackMask = Control->EventMask;
747 }
748
750 break;
751
752 default:
753 DPRINT1("WskControlSocket: ControlCode %d Not implemented\n", ControlCode);
754 }
755 break;
756 default:
757 DPRINT1("WskControlSocket: Level %d Not implemented\n", Level);
758 }
759 break;
760
761 case WskGetOption:
762 case WskIoctl:
763 default:
764 DPRINT1("WskControlSocket: Option %d Not implemented\n", RequestType);
765 }
766
767err_out:
768 Irp->IoStatus.Status = status;
770
771 return STATUS_PENDING;
772}
GLboolean enable
Definition: glext.h:11120
unsigned int * PUINT
Definition: ndis.h:50
unsigned int UINT
Definition: ndis.h:50
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFQUEUE _In_ _Strict_type_match_ WDF_REQUEST_TYPE RequestType
Definition: wdfdevice.h:4239
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
Definition: wdfiotarget.h:953
_In_ WDF_WMI_PROVIDER_CONTROL Control
Definition: wdfwmi.h:166
#define SO_REUSEADDR
Definition: winsock.h:174
#define SOL_SOCKET
Definition: winsock.h:392
_IRQL_requires_same_ typedef _In_ ULONG ControlCode
Definition: wmitypes.h:55
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:56
#define SO_WSK_EVENT_CALLBACK
Definition: wsk.h:57
@ WskIoctl
Definition: wsk.h:88
@ WskGetOption
Definition: wsk.h:87
@ WskSetOption
Definition: wsk.h:86

◆ WskDeregister()

VOID WSKAPI WskDeregister ( _In_ PWSK_REGISTRATION  reg)

Definition at line 1496 of file netio.c.

1497{
1499
1500 reg->ReservedRegistrationState = 0;
1501 reg->ReservedRegistrationContext = NULL;
1502}
static int reg
Definition: i386-dis.c:1290

◆ WskDisconnect()

static NTSTATUS WSKAPI WskDisconnect ( _In_ PWSK_SOCKET  SocketParam,
_In_opt_ PWSK_BUF  Buffer,
_In_ ULONG  Flags,
_Inout_ PIRP  Irp 
)
static

Definition at line 1278 of file netio.c.

1279{
1280 PWSK_SOCKET_INTERNAL Socket = CONTAINING_RECORD(SocketParam, WSK_SOCKET_INTERNAL, Socket);
1281
1283
1284 SocketShutdown(Socket);
1285
1287
1288 Irp->IoStatus.Status = STATUS_SUCCESS;
1290
1291 return STATUS_PENDING;
1292}

◆ WskGetLocalAddress()

static NTSTATUS WSKAPI WskGetLocalAddress ( _In_ PWSK_SOCKET  SocketParam,
_Out_ PSOCKADDR  LocalAddress,
_Inout_ PIRP  Irp 
)
static

Definition at line 1005 of file netio.c.

1006{
1008
1010 if (Irp != NULL)
1011 {
1012 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
1014 }
1016}

◆ WskGetRemoteAddress()

static NTSTATUS WSKAPI WskGetRemoteAddress ( _In_ PWSK_SOCKET  SocketParam,
_Out_ PSOCKADDR  RemoteAddress,
_Inout_ PIRP  Irp 
)
static

Definition at line 1019 of file netio.c.

1020{
1022
1023 PWSK_SOCKET_INTERNAL Socket = CONTAINING_RECORD(SocketParam, WSK_SOCKET_INTERNAL, Socket);
1025
1027 if (Socket != NULL)
1028 {
1029 memcpy(RemoteAddress, &Socket->RemoteAddress, sizeof(*RemoteAddress));
1031 }
1032 Irp->IoStatus.Status = Status;
1034
1035 return STATUS_PENDING; /* Caller has to wait for his completion routine */
1036}
struct sockaddr RemoteAddress
Definition: netio.c:91

◆ WskReceive()

static NTSTATUS WSKAPI WskReceive ( _In_ PWSK_SOCKET  SocketParam,
_In_ PWSK_BUF  Buffer,
_In_ ULONG  Flags,
_Inout_ PIRP  Irp 
)
static

Definition at line 1270 of file netio.c.

1271{
1273
1274 return WskStreamIo(SocketParam, Buffer, Flags, Irp, DIR_RECEIVE);
1275}
Definition: bufpool.h:45
static NTSTATUS WSKAPI WskStreamIo(_In_ PWSK_SOCKET SocketParam, _In_ PWSK_BUF Buffer, _In_ ULONG Flags, _Inout_ PIRP Irp, _In_ enum direction Direction)
Definition: netio.c:1190

◆ WskReceiveFrom()

static NTSTATUS WSKAPI WskReceiveFrom ( _In_ PWSK_SOCKET  SocketParam,
_In_ PWSK_BUF  Buffer,
_Reserved_ ULONG  Flags,
_Out_opt_ PSOCKADDR  RemoteAddress,
_Inout_ PULONG  ControlLength,
_Out_writes_bytes_opt_ *ControlLength PCMSGHDR  ControlInfo,
_Out_opt_ PULONG  ControlFlags,
_Inout_ PIRP  Irp 
)
static

Definition at line 964 of file netio.c.

972{
974
976 if (Irp != NULL)
977 {
978 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
980 }
982}

◆ WskRegister()

NTSTATUS WSKAPI WskRegister ( _In_ PWSK_CLIENT_NPI  client_npi,
_Out_ PWSK_REGISTRATION  reg 
)

Definition at line 1465 of file netio.c.

1466{
1468
1469 reg->ReservedRegistrationState = 0;
1470 reg->ReservedRegistrationContext = NULL;
1471 KeInitializeSpinLock(&reg->ReservedRegistrationLock);
1472
1473 return STATUS_SUCCESS;
1474}

◆ WskReleaseProviderNPI()

VOID WSKAPI WskReleaseProviderNPI ( _In_ PWSK_REGISTRATION  reg)

Definition at line 1488 of file netio.c.

1489{
1491
1493}
static void StopSocketDereferenceThread(void)
Definition: netio.c:302

◆ WskReleaseTcp()

static NTSTATUS WSKAPI WskReleaseTcp ( _In_ PWSK_SOCKET  SocketParam,
_In_ PWSK_DATA_INDICATION  DataIndication 
)
static

Definition at line 995 of file netio.c.

996{
998
1000
1002}

◆ WskReleaseUdp()

static NTSTATUS WSKAPI WskReleaseUdp ( _In_ PWSK_SOCKET  SocketParam,
_In_ PWSK_DATAGRAM_INDICATION  DatagramIndication 
)
static

Definition at line 985 of file netio.c.

986{
988
990
992}

◆ WskSend()

static NTSTATUS WSKAPI WskSend ( _In_ PWSK_SOCKET  SocketParam,
_In_ PWSK_BUF  Buffer,
_In_ ULONG  Flags,
_Inout_ PIRP  Irp 
)
static

Definition at line 1262 of file netio.c.

1263{
1265
1266 return WskStreamIo(SocketParam, Buffer, Flags, Irp, DIR_SEND);
1267}

◆ WskSendTo()

static NTSTATUS WSKAPI WskSendTo ( _In_ PWSK_SOCKET  SocketParam,
_In_ PWSK_BUF  Buffer,
_Reserved_ ULONG  Flags,
_In_opt_ PSOCKADDR  RemoteAddress,
_In_ ULONG  ControlInfoLength,
_In_reads_bytes_opt_(ControlInfoLength) PCMSGHDR  ControlInfo,
_Inout_ PIRP  Irp 
)
static

Definition at line 888 of file netio.c.

896{
897 PIRP tdiIrp = NULL;
898 PWSK_SOCKET_INTERNAL Socket = CONTAINING_RECORD(SocketParam, WSK_SOCKET_INTERNAL, Socket);
899 PTDI_CONNECTION_INFORMATION TargetConnectionInfo;
901 void *BufferData;
902 PNETIO_CONTEXT NetioContext;
903
905
907
909 NetioContext = ExAllocatePoolUninitialized(NonPagedPool, sizeof(*NetioContext), TAG_NETIO);
910 if (NetioContext == NULL)
911 {
912 goto err_out;
913 }
914 NetioContext->socket = Socket;
915 NetioContext->UserIrp = Irp;
916
918 if (TargetConnectionInfo == NULL)
919 {
920 goto err_out_free_nc;
921 }
922 NetioContext->TargetConnectionInfo = TargetConnectionInfo;
923 NetioContext->PeerAddrRet = NULL;
924
926 if (BufferData == NULL)
927 {
928 DPRINT1("Error mapping MDL\n");
929 goto err_out_free_nc_and_tci;
930 }
931
933 ReferenceSocket(Socket);
934
935 /* This will create a tdiIrp */
936 status = TdiSendDatagram(&tdiIrp, Socket->LocalAddressFile, ((char *)BufferData) + Buffer->Offset,
937 Buffer->Length, TargetConnectionInfo, NetioComplete, NetioContext);
938
939 /* If allocating tdiIrp fails we get here.
940 * Call the IoCompletion of the application's Irp so this Irp
941 * gets freed.
942 */
943 if (!NT_SUCCESS(status))
944 {
945 DereferenceSocket(Socket);
946 goto err_out_free_nc_and_tci; /* caller has to clean up mdl mapping */
947 }
948 return STATUS_PENDING;
949
950err_out_free_nc_and_tci:
952
953err_out_free_nc:
954 ExFreePoolWithTag(NetioContext, TAG_NETIO);
955
956err_out:
957 Irp->IoStatus.Status = status;
959
960 return status;
961}
@ NormalPagePriority
Definition: imports.h:54
NTSTATUS TdiSendDatagram(PIRP *Irp, PFILE_OBJECT TransportObject, PCHAR Buffer, UINT BufferLength, PTDI_CONNECTION_INFORMATION To, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Sends a datagram.
Definition: tdi.c:1170
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)

◆ WskSocket()

static NTSTATUS WSKAPI WskSocket ( _In_ PWSK_CLIENT  Client,
_In_ ADDRESS_FAMILY  AddressFamily,
_In_ USHORT  SocketType,
_In_ ULONG  Protocol,
_In_ ULONG  Flags,
_In_opt_ PVOID  SocketContext,
_In_opt_ const VOID Dispatch,
_In_opt_ PEPROCESS  OwningProcess,
_In_opt_ PETHREAD  OwningThread,
_In_opt_ PSECURITY_DESCRIPTOR  SecurityDescriptor,
_Inout_ PIRP  Irp 
)
static

Definition at line 1309 of file netio.c.

1321{
1322 PWSK_SOCKET_INTERNAL Socket;
1324
1326
1328
1329 if (AddressFamily != AF_INET)
1330 {
1331 DPRINT1("Address family %d not supported\n", AddressFamily);
1333 goto err_out;
1334 }
1335 switch (SocketType)
1336 {
1337 case SOCK_DGRAM:
1338 if (Protocol != IPPROTO_UDP)
1339 {
1340 DPRINT1("SOCK_DGRAM only supports IPPROTO_UDP\n");
1342 goto err_out;
1343 }
1345 {
1346 DPRINT1("SOCK_DGRAM flags must be WSK_FLAG_DATAGRAM_SOCKET\n");
1348 goto err_out;
1349 }
1350 break;
1351
1352 case SOCK_STREAM:
1353 if (Protocol != IPPROTO_TCP)
1354 {
1355 DPRINT1("SOCK_STREAM only supports IPPROTO_TCP\n");
1357 goto err_out;
1358 }
1360 {
1361 DPRINT1("SOCK_STREAM flags must be either WSK_FLAG_CONNECTION_SOCKET or WSK_FLAG_LISTEN_SOCKET\n");
1363 goto err_out;
1364 }
1365 break;
1366
1367 case SOCK_RAW:
1368 DPRINT1("SOCK_RAW not supported\n");
1370 goto err_out;
1371
1372 default:
1374 goto err_out;
1375 }
1376
1377 Socket = ExAllocatePoolZero(NonPagedPool, sizeof(*Socket), TAG_NETIO);
1378 if (Socket == NULL)
1379 {
1380 DPRINT1("WskSocket: Out of memory\n");
1382 goto err_out;
1383 }
1384 Socket->family = AddressFamily;
1385 Socket->type = SocketType;
1386 Socket->proto = Protocol;
1387 Socket->WskFlags = Flags;
1388 Socket->user_context = SocketContext;
1389 Socket->ListenDispatch = Dispatch;
1390 Socket->RefCount = 1; /* DereferenceSocket() is in WskCloseSocket */
1391
1392 switch (SocketType)
1393 {
1394 case SOCK_DGRAM:
1395 Socket->Socket.Dispatch = &UdpDispatch;
1396 RtlInitUnicodeString(&Socket->TdiName, L"\\Device\\Udp");
1397 break;
1398 case SOCK_STREAM:
1399 Socket->Socket.Dispatch = &TcpDispatch;
1400 RtlInitUnicodeString(&Socket->TdiName, L"\\Device\\Tcp");
1401
1403 {
1405 if (!NT_SUCCESS(status))
1406 {
1407 DPRINT1("Could not open TDI handle, status is %x\n", status);
1409 goto err_out;
1410 }
1411 }
1412 else
1413 {
1415 Socket->ListenThreadShouldRun = TRUE;
1416
1418 if (!NT_SUCCESS(status))
1419 {
1420 DPRINT1("Could not start listen thread, status is %x\n", status);
1422 goto err_out;
1423 }
1425 if (!NT_SUCCESS(status))
1426 {
1427 DPRINT1("Could not get a PKTHREAD object, status is %x\n", status);
1429 goto err_out;
1430 }
1431 ZwClose(Socket->ListenThreadHandle);
1432 }
1433
1434 if (Flags == WSK_FLAG_LISTEN_SOCKET && Socket->ListenDispatch == NULL)
1435 {
1436 DPRINT1("Warning: no callbacks given for listen socket\n");
1437 }
1438 break;
1439
1440 default:
1441 DPRINT1("Socket type not yet supported\n");
1443 goto err_out;
1444 }
1445
1446 Irp->IoStatus.Information = (ULONG_PTR)Socket;
1448
1449err_out:
1450 Irp->IoStatus.Status = status;
1452
1453 return STATUS_PENDING;
1454}
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define L(x)
Definition: resources.c:13
#define IPPROTO_TCP
Definition: ip.h:196
#define IPPROTO_UDP
Definition: ip.h:197
#define SOCK_STREAM
Definition: tcpip.h:118
#define AF_INET
Definition: tcpip.h:117
#define ULONG_PTR
Definition: config.h:101
FORCEINLINE PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
Definition: precomp.h:45
static WSK_PROVIDER_DATAGRAM_DISPATCH UdpDispatch
Definition: netio.c:1085
static VOID NTAPI RequeueListenThread(_In_ PVOID p)
Definition: netio.c:641
static WSK_PROVIDER_CONNECTION_DISPATCH TcpDispatch
Definition: netio.c:1295
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:494
ADDRESS_FAMILY family
Definition: netio.c:80
PKTHREAD ListenThread
Definition: netio.c:110
HANDLE ListenThreadHandle
Definition: netio.c:109
HANDLE ConnectionHandle
Definition: netio.c:97
WSK_SOCKET Socket
Definition: netio.c:78
const VOID * Dispatch
Definition: wsk.h:96
NTSTATUS TdiOpenConnectionEndpointFile(PUNICODE_STRING DeviceName, PHANDLE ConnectionHandle, PFILE_OBJECT *ConnectionObject)
Opens a connection endpoint file object.
Definition: tdi.c:258
#define SOCK_RAW
Definition: winsock.h:331
#define SOCK_DGRAM
Definition: winsock.h:330
#define WSK_FLAG_LISTEN_SOCKET
Definition: wsk.h:45
_In_ USHORT _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _Reserved_ ULONG _In_opt_ PVOID _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH * Dispatch
Definition: wsk.h:188
_In_ USHORT _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _Reserved_ ULONG _In_opt_ PVOID SocketContext
Definition: wsk.h:187
#define WSK_FLAG_DATAGRAM_SOCKET
Definition: wsk.h:47

Referenced by CreateSocket().

◆ WskSocketConnect()

static NTSTATUS WSKAPI WskSocketConnect ( _In_ PWSK_CLIENT  Client,
_In_ USHORT  SocketType,
_In_ ULONG  Protocol,
_In_ PSOCKADDR  LocalAddress,
_In_ PSOCKADDR  RemoteAddress,
_In_ ULONG  Flags,
_In_opt_ PVOID  SocketContext,
_In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH Dispatch,
_In_opt_ PEPROCESS  OwningProcess,
_In_opt_ PETHREAD  OwningThread,
_In_opt_ PSECURITY_DESCRIPTOR  SecurityDescriptor,
_Inout_ PIRP  Irp 
)
static

Definition at line 1039 of file netio.c.

1052{
1054
1056 if (Irp != NULL)
1057 {
1058 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
1060 }
1062}

◆ WskStreamIo()

static NTSTATUS WSKAPI WskStreamIo ( _In_ PWSK_SOCKET  SocketParam,
_In_ PWSK_BUF  Buffer,
_In_ ULONG  Flags,
_Inout_ PIRP  Irp,
_In_ enum direction  Direction 
)
static

Definition at line 1190 of file netio.c.

1196{
1197 PIRP tdiIrp = NULL;
1198 PWSK_SOCKET_INTERNAL Socket = CONTAINING_RECORD(SocketParam, WSK_SOCKET_INTERNAL, Socket);
1200 void *BufferData;
1201 PNETIO_CONTEXT NetioContext;
1202
1204
1207
1208 NetioContext = ExAllocatePoolUninitialized(NonPagedPool, sizeof(*NetioContext), TAG_NETIO);
1209 if (NetioContext == NULL)
1210 {
1211 goto err_out;
1212 }
1213 NetioContext->socket = Socket;
1214 NetioContext->UserIrp = Irp;
1215
1216 NetioContext->TargetConnectionInfo = NULL;
1217 NetioContext->PeerAddrRet = NULL;
1218
1220 if (BufferData == NULL)
1221 {
1222 DPRINT1("Error mapping MDL\n");
1223 goto err_out_free_nc;
1224 }
1225
1227 ReferenceSocket(Socket);
1228
1229 if (Direction == DIR_SEND)
1230 {
1231 /* This will create a tdiIrp */
1232 status = TdiSend(&tdiIrp, Socket->ConnectionFile, 0, ((char *)BufferData) + Buffer->Offset,
1233 Buffer->Length, NetioComplete, NetioContext);
1234 }
1235 else
1236 {
1237 status = TdiReceive(&tdiIrp, Socket->ConnectionFile, 0, ((char *)BufferData) + Buffer->Offset,
1238 Buffer->Length, NetioComplete, NetioContext);
1239 }
1240
1241 /* If allocating tdiIrp fails we get here.
1242 * Call the IoCompletion of the application's Irp so this Irp
1243 * gets freed.
1244 */
1245 if (!NT_SUCCESS(status))
1246 {
1247 goto err_out_free_nc; /* caller has to clean up mdl mapping */
1248 }
1249 return STATUS_PENDING;
1250
1251err_out_free_nc:
1252 ExFreePoolWithTag(NetioContext, TAG_NETIO);
1253
1254err_out:
1255 Irp->IoStatus.Status = status;
1257
1258 return status;
1259}
NTSTATUS TdiReceive(PIRP *Irp, PFILE_OBJECT ConnectionObject, USHORT Flags, PCHAR Buffer, UINT BufferLength, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:999
NTSTATUS TdiSend(PIRP *Irp, PFILE_OBJECT ConnectionObject, USHORT Flags, PCHAR Buffer, UINT BufferLength, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:923
WDF_EXTERN_C_START typedef _In_ WDFDEVICE _In_ WDFCONTEXT _In_ WDF_DMA_DIRECTION Direction

Referenced by WskReceive(), and WskSend().

Variable Documentation

◆ DereferenceSocketsEvent

KEVENT DereferenceSocketsEvent
static

◆ DereferenceSocketsThreadHandle

HANDLE DereferenceSocketsThreadHandle
static

Definition at line 244 of file netio.c.

Referenced by StartSocketDereferenceThread().

◆ DereferenceSocketsThreadShouldRun

volatile BOOLEAN DereferenceSocketsThreadShouldRun = FALSE
static

◆ provider_dispatch

WSK_PROVIDER_DISPATCH provider_dispatch
static
Initial value:
= {
.Version = 0,
.Reserved = 0,
.WskSocket = WskSocket,
.WskSocketConnect = WskSocketConnect,
.WskControlClient = WskControlClient
}
static NTSTATUS WSKAPI WskControlClient(_In_ PWSK_CLIENT Client, _In_ ULONG ControlCode, _In_ SIZE_T InputSize, _In_reads_bytes_opt_(InputSize) PVOID InputBuffer, _In_ SIZE_T OutputSize, _Out_writes_bytes_opt_(OutputSize) PVOID OutputBuffer, _Out_opt_ SIZE_T *OutputSizeReturned, _Inout_opt_ PIRP Irp)
Definition: netio.c:1065
static NTSTATUS WSKAPI WskSocketConnect(_In_ PWSK_CLIENT Client, _In_ USHORT SocketType, _In_ ULONG Protocol, _In_ PSOCKADDR LocalAddress, _In_ PSOCKADDR RemoteAddress, _In_ ULONG Flags, _In_opt_ PVOID SocketContext, _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH *Dispatch, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor, _Inout_ PIRP Irp)
Definition: netio.c:1039

Definition at line 1456 of file netio.c.

Referenced by WskCaptureProviderNPI().

◆ SocketsToDereference

PWSK_SOCKET_INTERNAL SocketsToDereference = NULL
static

Definition at line 240 of file netio.c.

Referenced by DereferenceSocket(), and DereferenceSocketsThread().

◆ SocketsToDereferenceListLock

KSPIN_LOCK SocketsToDereferenceListLock = 0
static

◆ TcpDispatch

Initial value:
= {
.WskControlSocket = WskControlSocket,
.WskCloseSocket = WskCloseSocket,
.WskBind = WskBind,
.WskConnect = WskConnect,
.WskGetLocalAddress = WskGetLocalAddress,
.WskGetRemoteAddress = WskGetRemoteAddress,
.WskSend = WskSend,
.WskReceive = WskReceive,
.WskDisconnect = WskDisconnect,
.WskRelease = WskReleaseTcp,
}
static NTSTATUS WSKAPI WskSend(_In_ PWSK_SOCKET SocketParam, _In_ PWSK_BUF Buffer, _In_ ULONG Flags, _Inout_ PIRP Irp)
Definition: netio.c:1262
static NTSTATUS WSKAPI WskCloseSocket(_In_ PWSK_SOCKET SocketParam, _Inout_ PIRP Irp)
Definition: netio.c:775
static NTSTATUS WSKAPI WskDisconnect(_In_ PWSK_SOCKET SocketParam, _In_opt_ PWSK_BUF Buffer, _In_ ULONG Flags, _Inout_ PIRP Irp)
Definition: netio.c:1278
static NTSTATUS WSKAPI WskControlSocket(_In_ PWSK_SOCKET SocketParam, _In_ WSK_CONTROL_SOCKET_TYPE RequestType, _In_ ULONG ControlCode, _In_ ULONG Level, _In_ SIZE_T InputSize, _In_reads_bytes_opt_(InputSize) PVOID InputBuffer, _In_ SIZE_T OutputSize, _Out_writes_bytes_opt_(OutputSize) PVOID OutputBuffer, _Out_opt_ SIZE_T *OutputSizeReturned, _Inout_opt_ PIRP Irp)
Definition: netio.c:665
static NTSTATUS WSKAPI WskConnect(_In_ PWSK_SOCKET SocketParam, _In_ PSOCKADDR RemoteAddress, _Reserved_ ULONG Flags, _Inout_ PIRP Irp)
Definition: netio.c:1098
static NTSTATUS WSKAPI WskReceive(_In_ PWSK_SOCKET SocketParam, _In_ PWSK_BUF Buffer, _In_ ULONG Flags, _Inout_ PIRP Irp)
Definition: netio.c:1270
static NTSTATUS WSKAPI WskReleaseTcp(_In_ PWSK_SOCKET SocketParam, _In_ PWSK_DATA_INDICATION DataIndication)
Definition: netio.c:995
static NTSTATUS WSKAPI WskBind(_In_ PWSK_SOCKET SocketParam, _In_ PSOCKADDR LocalAddress, _Reserved_ ULONG Flags, _Inout_ PIRP Irp)
Definition: netio.c:848
static NTSTATUS WSKAPI WskGetLocalAddress(_In_ PWSK_SOCKET SocketParam, _Out_ PSOCKADDR LocalAddress, _Inout_ PIRP Irp)
Definition: netio.c:1005
static NTSTATUS WSKAPI WskGetRemoteAddress(_In_ PWSK_SOCKET SocketParam, _Out_ PSOCKADDR RemoteAddress, _Inout_ PIRP Irp)
Definition: netio.c:1019

Definition at line 1295 of file netio.c.

Referenced by WskSocket().

◆ UdpDispatch

WSK_PROVIDER_DATAGRAM_DISPATCH UdpDispatch
static
Initial value:
= {
.WskControlSocket = WskControlSocket,
.WskCloseSocket = WskCloseSocket,
.WskBind = WskBind,
.WskSendTo = WskSendTo,
.WskReceiveFrom = WskReceiveFrom,
.WskRelease = WskReleaseUdp,
.WskGetLocalAddress = WskGetLocalAddress,
}
static NTSTATUS WSKAPI WskReleaseUdp(_In_ PWSK_SOCKET SocketParam, _In_ PWSK_DATAGRAM_INDICATION DatagramIndication)
Definition: netio.c:985
static NTSTATUS WSKAPI WskSendTo(_In_ PWSK_SOCKET SocketParam, _In_ PWSK_BUF Buffer, _Reserved_ ULONG Flags, _In_opt_ PSOCKADDR RemoteAddress, _In_ ULONG ControlInfoLength, _In_reads_bytes_opt_(ControlInfoLength) PCMSGHDR ControlInfo, _Inout_ PIRP Irp)
Definition: netio.c:888
static NTSTATUS WSKAPI WskReceiveFrom(_In_ PWSK_SOCKET SocketParam, _In_ PWSK_BUF Buffer, _Reserved_ ULONG Flags, _Out_opt_ PSOCKADDR RemoteAddress, _Inout_ PULONG ControlLength, _Out_writes_bytes_opt_(*ControlLength) PCMSGHDR ControlInfo, _Out_opt_ PULONG ControlFlags, _Inout_ PIRP Irp)
Definition: netio.c:964

Definition at line 1085 of file netio.c.

Referenced by WskSocket().