33 if (
FCB->RemoteAddress)
41 if( !
FCB->RemoteAddress )
81 IPAddr->Address[0].AddressType));
83 IPAddr->Address[0].AddressLength));
85 IPAddr->Address[0].Address[0].sin_port));
87 IPAddr->Address[0].Address[0].in_addr));
106 Irp->Tail.Overlay.DriverContext[2] =
NULL;
149 LONG LocalAddressLength =
min(AcceptInfo->LocalAddressLength,
Buffer->Address.Address->AddressLength);
150 BufferPtr += AcceptInfo->ReceiveDataLength;
152 *(
USHORT *)(BufferPtr + AcceptInfo->LocalAddressLength -
sizeof(
USHORT)) = LocalAddressLength;
156 LONG RemoteAddressLength =
min(AcceptInfo->RemoteAddressLength,
RemoteAddress->Address[0].AddressLength);
157 BufferPtr += AcceptInfo->LocalAddressLength;
160 *(
USHORT *)(BufferPtr + AcceptInfo->RemoteAddressLength -
sizeof(
USHORT)) = RemoteAddressLength;
162 if (AcceptInfo->ReceiveDataLength)
170 AcceptInfo->ReceiveDataLength,
207 Irp->IoStatus.Information = 0;
232 FCB->ListenIrp.InFlightRequest =
NULL;
247 if (
FCB->ListenIrp.ConnectionReturnInfo)
252 FCB->ListenIrp.ConnectionReturnInfo =
NULL;
255 if (
FCB->ListenIrp.ConnectionCallInfo)
260 FCB->ListenIrp.ConnectionCallInfo =
NULL;
273 return Irp->IoStatus.Status;
284 FCB->LocalAddress->Address[0].AddressType;
287 Qelt->
Seq =
FCB->ConnSeq++;
291 ConnectionReturnInfo->RemoteAddress));
297 FCB->ListenIrp.ConnectionReturnInfo->RemoteAddress );
310 if (PendingIrpPtr->Tail.Overlay.DriverContext[2] && PendingIrpPtr->Tail.Overlay.DriverContext[3])
327 FCB->LocalAddress->Address[0].AddressType);
331 FCB->LocalAddress->Address[0].AddressType);
335 FCB->Connection.Object,
336 &
FCB->ListenIrp.ConnectionCallInfo,
337 &
FCB->ListenIrp.ConnectionReturnInfo,
351 FCB->PollState &= ~AFD_EVENT_ACCEPT;
392 ( &
FCB->ListenIrp.ConnectionCallInfo,
393 FCB->LocalAddress->Address[0].AddressType );
398 ( &
FCB->ListenIrp.ConnectionReturnInfo,
399 FCB->LocalAddress->Address[0].AddressType );
406 FCB->ListenIrp.ConnectionCallInfo =
NULL;
413 FCB->Connection.Object,
414 &
FCB->ListenIrp.ConnectionCallInfo,
415 &
FCB->ListenIrp.ConnectionReturnInfo,
455 FCB->PollState &= ~AFD_EVENT_ACCEPT;
459 }
else if (
FCB->NonBlocking) {
484 FCB->EventSelectDisabled &= ~AFD_EVENT_ACCEPT;
486 for( PendingConn =
FCB->PendingConnections.Flink;
487 PendingConn != &
FCB->PendingConnections;
488 PendingConn = PendingConn->Flink ) {
493 AcceptData->SequenceNumber,
494 PendingConnObj->
Seq));
496 if( PendingConnObj->
Seq == AcceptData->SequenceNumber ) {
502 ( AcceptData->ListenHandle,
529 FCB->PollState &= ~AFD_EVENT_ACCEPT;
558 Fcb->EventSelectDisabled &= ~AFD_EVENT_ACCEPT;
579 Irp->Tail.Overlay.DriverContext[3] =
NULL;
595 Irp->Tail.Overlay.DriverContext[3] =
NULL;
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
IO_COMPLETION_ROUTINE AcceptExReceiveComplete
#define SOCKET_STATE_CLOSED
IO_COMPLETION_ROUTINE ReceiveComplete
#define SOCKET_STATE_CONNECTED
#define SOCKET_STATE_CREATED
struct _AFD_FCB * PAFD_FCB
#define TAG_AFD_TDI_CONNECTION_INFORMATION
#define FUNCTION_PREACCEPT
#define TAG_AFD_ACCEPT_QUEUE
#define SOCKET_STATE_LISTENING
#define SOCKET_STATE_CONNECTING
#define SOCKET_STATE_BOUND
struct _AFD_DEVICE_EXTENSION * PAFD_DEVICE_EXTENSION
#define TAG_AFD_TRANSPORT_ADDRESS
#define NT_SUCCESS(StatCode)
_In_ PIO_STACK_LOCATION IrpSp
NTSTATUS MakeSocketIntoConnection(PAFD_FCB FCB, BOOL Receive)
NTSTATUS WarmSocketForConnection(PAFD_FCB FCB)
static IO_COMPLETION_ROUTINE ListenComplete
NTSTATUS AfdAccept(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
NTSTATUS AfdSuperAccept(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
static NTSTATUS SatisfyPreAccept(PIRP Irp, PAFD_TDI_OBJECT_QELT Qelt)
static NTSTATUS SatisfySuperAccept(PAFD_FCB FCB, PIRP Irp, PAFD_TDI_OBJECT_QELT Qelt)
NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
static NTSTATUS SatisfyAccept(PAFD_DEVICE_EXTENSION DeviceExt, PIRP Irp, PFILE_OBJECT NewFileObject, PAFD_TDI_OBJECT_QELT Qelt, BOOL SuperAccept)
NTSTATUS AfdWaitForListen(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
PVOID LockRequest(PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output, KPROCESSOR_MODE *LockMode)
VOID UnlockRequest(PIRP Irp, PIO_STACK_LOCATION IrpSp)
NTSTATUS LostSocket(PIRP Irp)
NTSTATUS NTAPI UnlockAndMaybeComplete(PAFD_FCB FCB, NTSTATUS Status, PIRP Irp, UINT Information)
VOID SocketStateUnlock(PAFD_FCB FCB)
NTSTATUS LeaveIrpUntilLater(PAFD_FCB FCB, PIRP Irp, UINT Function)
BOOLEAN SocketAcquireStateLock(PAFD_FCB FCB)
VOID PollReeval(PAFD_DEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
#define AFD_DbgPrint(_t_, _x_)
#define IO_NETWORK_INCREMENT
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IsListEmpty(ListHead)
#define RemoveHeadList(ListHead)
_Must_inspect_result_ _In_ PFILE_OBJECT NewFileObject
#define EXCEPTION_EXECUTE_HANDLER
IoSetCancelRoutine(Irp, CancelRoutine)
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
#define ExFreePoolWithTag(_P, _T)
#define UNREFERENCED_PARAMETER(P)
#define IoCompleteRequest
#define STATUS_FILE_CLOSED
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)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
struct _AFD_RECEIVED_ACCEPT_DATA * PAFD_RECEIVED_ACCEPT_DATA
AFD_IN_FLIGHT_REQUEST ReceiveIrp
AFD_TDI_OBJECT Connection
SOCK_SHARED_INFO SharedData
BOOLEAN UseDelayedAcceptance
TRANSPORT_ADDRESS Address
PTDI_CONNECTION_INFORMATION ConnInfo
union _IO_STACK_LOCATION::@1803 Parameters
struct _IO_STACK_LOCATION::@1803::@1804 DeviceIoControl
struct _TRANSPORT_ADDRESS * PTRANSPORT_ADDRESS
struct _TA_ADDRESS_IP * PTA_IP_ADDRESS
#define TDI_RECEIVE_NORMAL
#define TDI_QUERY_ADDRESS_INFO
NTSTATUS TdiQueryInformation(PFILE_OBJECT FileObject, LONG QueryType, PMDL MdlBuffer)
Query for information.
NTSTATUS TdiBuildNullConnectionInfo(PTDI_CONNECTION_INFORMATION *ConnectionInfo, ULONG Type)
Builds a NULL TDI connection information structure.
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.
VOID TaCopyTransportAddressInPlace(PTRANSPORT_ADDRESS Target, PTRANSPORT_ADDRESS Source)
NTSTATUS TdiBuildConnectionInfo(PTDI_CONNECTION_INFORMATION *ConnectionInfo, PTRANSPORT_ADDRESS Name)
NTSTATUS TdiReceive(PIRP *Irp, PFILE_OBJECT ConnectionObject, USHORT Flags, PCHAR Buffer, UINT BufferLength, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
NTSTATUS TdiBuildNullConnectionInfoInPlace(PTDI_CONNECTION_INFORMATION ConnInfo, ULONG Type)
Builds a NULL TDI connection information structure.
PTRANSPORT_ADDRESS TaCopyTransportAddress(PTRANSPORT_ADDRESS OtherAddress)
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR RemoteAddress
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
#define ObDereferenceObject