ReactOS 0.4.17-dev-999-g4b3f691
listen.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/net/afd/afd/listen.c
5 * PURPOSE: Ancillary functions driver
6 * PROGRAMMER: Art Yerkes (ayerkes@speakeasy.net)
7 * UPDATE HISTORY:
8 * 20040708 Created
9 */
10
11#include "afd.h"
12#include "ntdef.h"
13
15 PIRP Irp,
18 BOOL SuperAccept)
19{
20 PAFD_FCB FCB = NewFileObject->FsContext;
22
23 UNREFERENCED_PARAMETER(DeviceExt);
24
26 return LostSocket( Irp );
27
28 /* Transfer the connection to the new socket, launch the opening read */
29 AFD_DbgPrint(MID_TRACE,("Completing a real accept (FCB %p)\n", FCB));
30
31 FCB->Connection = Qelt->Object;
32
33 if (FCB->RemoteAddress)
34 {
36 }
37
38 FCB->RemoteAddress =
40
41 if( !FCB->RemoteAddress )
43 else
44 Status = MakeSocketIntoConnection(FCB, !SuperAccept);
45
46 if (NT_SUCCESS(Status))
47 Status = TdiBuildConnectionInfo(&FCB->ConnectCallInfo, FCB->RemoteAddress);
48
49 if (NT_SUCCESS(Status))
50 Status = TdiBuildConnectionInfo(&FCB->ConnectReturnInfo, FCB->RemoteAddress);
51
52 if (SuperAccept)
53 {
55 return Status;
56 }
57
59}
60
62 PAFD_RECEIVED_ACCEPT_DATA ListenReceive =
63 (PAFD_RECEIVED_ACCEPT_DATA)Irp->AssociatedIrp.SystemBuffer;
65
66 ListenReceive->SequenceNumber = Qelt->Seq;
67
68 AFD_DbgPrint(MID_TRACE,("Giving SEQ %u to userland\n", Qelt->Seq));
69 AFD_DbgPrint(MID_TRACE,("Socket Address (K) %p (U) %p\n",
70 &ListenReceive->Address,
71 Qelt->ConnInfo->RemoteAddress));
72
74 Qelt->ConnInfo->RemoteAddress );
75
76 IPAddr = (PTA_IP_ADDRESS)&ListenReceive->Address;
77
78 AFD_DbgPrint(MID_TRACE,("IPAddr->TAAddressCount %d\n",
79 IPAddr->TAAddressCount));
80 AFD_DbgPrint(MID_TRACE,("IPAddr->Address[0].AddressType %u\n",
81 IPAddr->Address[0].AddressType));
82 AFD_DbgPrint(MID_TRACE,("IPAddr->Address[0].AddressLength %u\n",
83 IPAddr->Address[0].AddressLength));
84 AFD_DbgPrint(MID_TRACE,("IPAddr->Address[0].Address[0].sin_port %x\n",
85 IPAddr->Address[0].Address[0].sin_port));
86 AFD_DbgPrint(MID_TRACE,("IPAddr->Address[0].Address[0].sin_addr %x\n",
87 IPAddr->Address[0].Address[0].in_addr));
88
89 if( Irp->MdlAddress ) UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) );
90
91 Irp->IoStatus.Information = ((PCHAR)&IPAddr[1]) - ((PCHAR)ListenReceive);
92 Irp->IoStatus.Status = STATUS_SUCCESS;
95 return STATUS_SUCCESS;
96}
97
99{
100 PFILE_OBJECT NewFileObject = (PFILE_OBJECT)Irp->Tail.Overlay.DriverContext[2];
101 PAFD_SUPER_ACCEPT_INFO AcceptInfo = (PAFD_SUPER_ACCEPT_INFO)Irp->Tail.Overlay.DriverContext[0]; /* LockRequest stores the request in index 0 */
102 PAFD_FCB FCB2 = NewFileObject->FsContext;
104
106 Irp->Tail.Overlay.DriverContext[2] = NULL;
107
108 BYTE *BufferPtr = MmGetSystemAddressForMdlSafe((PMDL)Irp->Tail.Overlay.DriverContext[3], NormalPagePriority);
109 if (!BufferPtr)
110 goto end;
111
112 /* Query TCPIP to find the local address of the socket */
113 LONG RequestSize = (FIELD_OFFSET(TDI_ADDRESS_INFO, Address.Address[0].Address) + FCB->LocalAddress->Address[0].AddressLength);
116 if (Buffer == NULL)
117 {
119 goto end;
120 }
121
123 if (Mdl == NULL)
124 {
127 goto end;
128 }
129
131 {
132 /* TCP eventually calls MmUnlockPages and IoFreeMdl*/
134 }
136 {
139 goto end;
140 }
141 _SEH2_END;
142
145 if (!NT_SUCCESS(Status))
146 goto end;
147
148 /* Write the local address */
149 LONG LocalAddressLength = min(AcceptInfo->LocalAddressLength, Buffer->Address.Address->AddressLength);
150 BufferPtr += AcceptInfo->ReceiveDataLength;
151 RtlCopyMemory(BufferPtr, &Buffer->Address.Address->AddressType, LocalAddressLength);
152 *(USHORT *)(BufferPtr + AcceptInfo->LocalAddressLength - sizeof(USHORT)) = LocalAddressLength;
154
155 /* Write the remote address*/
156 LONG RemoteAddressLength = min(AcceptInfo->RemoteAddressLength, RemoteAddress->Address[0].AddressLength);
157 BufferPtr += AcceptInfo->LocalAddressLength;
158 RtlCopyMemory(BufferPtr, &RemoteAddress->Address[0].AddressType, RemoteAddressLength);
159
160 *(USHORT *)(BufferPtr + AcceptInfo->RemoteAddressLength - sizeof(USHORT)) = RemoteAddressLength;
161
162 if (AcceptInfo->ReceiveDataLength)
163 {
164 /* Save this IRP so that it can be completed once the data is received */
165 FCB2->AcceptIrp = Irp;
166
169 (PCHAR)BufferPtr,
170 AcceptInfo->ReceiveDataLength,
172 FCB2);
173
174 if (Status == STATUS_PENDING)
176 return Status;
177 }
178 else
179 {
180 /* Begin receive buffer */
183 FCB2->Connection.Object,
185 FCB2->Recv.Window,
186 FCB2->Recv.Size,
188 FCB2);
189
190 if (Status == STATUS_PENDING)
192 }
193
194end:
195 /* Complete the IRP, there is no data to receive */
196 if (NT_SUCCESS(Status))
197 {
199 }
200 else
201 {
203 }
204
205 MmUnlockPages((PMDL)Irp->Tail.Overlay.DriverContext[3]);
206 IoFreeMdl((PMDL)Irp->Tail.Overlay.DriverContext[3]);
207 Irp->IoStatus.Information = 0;
208 Irp->IoStatus.Status = Status;
209 if( Irp->MdlAddress ) UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) );
212
213 return STATUS_SUCCESS;
214}
215
216static IO_COMPLETION_ROUTINE ListenComplete;
218 PIRP Irp,
219 PVOID Context ) {
223 PLIST_ENTRY NextIrpEntry;
224 PIRP NextIrp;
225
227
229 return STATUS_FILE_CLOSED;
230
231 ASSERT(FCB->ListenIrp.InFlightRequest == Irp);
232 FCB->ListenIrp.InFlightRequest = NULL;
233
234 if( FCB->SharedData.State == SOCKET_STATE_CLOSED ) {
235 /* Cleanup our IRP queue because the FCB is being destroyed */
236 while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_PREACCEPT] ) ) {
237 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_PREACCEPT]);
238 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
240 NextIrp->IoStatus.Information = 0;
241 if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
242 (void)IoSetCancelRoutine(NextIrp, NULL);
244 }
245
246 /* Free ConnectionReturnInfo and ConnectionCallInfo */
247 if (FCB->ListenIrp.ConnectionReturnInfo)
248 {
249 ExFreePoolWithTag(FCB->ListenIrp.ConnectionReturnInfo,
251
252 FCB->ListenIrp.ConnectionReturnInfo = NULL;
253 }
254
255 if (FCB->ListenIrp.ConnectionCallInfo)
256 {
257 ExFreePoolWithTag(FCB->ListenIrp.ConnectionCallInfo,
259
260 FCB->ListenIrp.ConnectionCallInfo = NULL;
261 }
262
264 return STATUS_FILE_CLOSED;
265 }
266
267 AFD_DbgPrint(MID_TRACE,("Completing listen request.\n"));
268 AFD_DbgPrint(MID_TRACE,("IoStatus was %x\n", Irp->IoStatus.Status));
269
270 if (Irp->IoStatus.Status != STATUS_SUCCESS)
271 {
273 return Irp->IoStatus.Status;
274 }
275
277 sizeof(*Qelt),
279
280 if( !Qelt ) {
282 } else {
283 UINT AddressType =
284 FCB->LocalAddress->Address[0].AddressType;
285
286 Qelt->Object = FCB->Connection;
287 Qelt->Seq = FCB->ConnSeq++;
288 AFD_DbgPrint(MID_TRACE,("Address Type: %u (RA %p)\n",
289 AddressType,
290 FCB->ListenIrp.
291 ConnectionReturnInfo->RemoteAddress));
292
293 Status = TdiBuildNullConnectionInfo( &Qelt->ConnInfo, AddressType );
294 if( NT_SUCCESS(Status) ) {
296 ( Qelt->ConnInfo->RemoteAddress,
297 FCB->ListenIrp.ConnectionReturnInfo->RemoteAddress );
298 InsertTailList( &FCB->PendingConnections, &Qelt->ListEntry );
299 }
300 }
301
302 /* Satisfy a pre-accept request if one is available */
303 if( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_PREACCEPT] ) &&
304 !IsListEmpty( &FCB->PendingConnections ) ) {
305 PLIST_ENTRY PendingIrp =
306 RemoveHeadList( &FCB->PendingIrpList[FUNCTION_PREACCEPT] );
307 PLIST_ENTRY PendingConn = FCB->PendingConnections.Flink;
308 PIRP PendingIrpPtr = CONTAINING_RECORD(PendingIrp, IRP, Tail.Overlay.ListEntry);
309 PAFD_TDI_OBJECT_QELT ConnectionData = CONTAINING_RECORD( PendingConn, AFD_TDI_OBJECT_QELT, ListEntry);
310 if (PendingIrpPtr->Tail.Overlay.DriverContext[2] && PendingIrpPtr->Tail.Overlay.DriverContext[3])
311 {
312 RemoveEntryList(PendingConn);
313 SatisfySuperAccept(FCB, PendingIrpPtr, ConnectionData);
314 }
315 else
316 {
317 SatisfyPreAccept(PendingIrpPtr, ConnectionData);
318 }
319 }
320
321 /* Launch new accept socket */
323
324 if (NT_SUCCESS(Status))
325 {
326 Status = TdiBuildNullConnectionInfoInPlace(FCB->ListenIrp.ConnectionCallInfo,
327 FCB->LocalAddress->Address[0].AddressType);
329
330 Status = TdiBuildNullConnectionInfoInPlace(FCB->ListenIrp.ConnectionReturnInfo,
331 FCB->LocalAddress->Address[0].AddressType);
333
334 Status = TdiListen( &FCB->ListenIrp.InFlightRequest,
335 FCB->Connection.Object,
336 &FCB->ListenIrp.ConnectionCallInfo,
337 &FCB->ListenIrp.ConnectionReturnInfo,
339 FCB );
340
341 if (Status == STATUS_PENDING)
343 }
344
345 /* Trigger a select return if appropriate */
346 if( !IsListEmpty( &FCB->PendingConnections ) ) {
347 FCB->PollState |= AFD_EVENT_ACCEPT;
348 FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS;
349 PollReeval( FCB->DeviceExt, FCB->FileObject );
350 } else
351 FCB->PollState &= ~AFD_EVENT_ACCEPT;
352
354
355 return Status;
356}
357
362 PAFD_FCB FCB = FileObject->FsContext;
363 PAFD_LISTEN_DATA ListenReq;
364
366
367 AFD_DbgPrint(MID_TRACE,("Called on %p\n", FCB));
368
369 if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
370
371 if( !(ListenReq = LockRequest( Irp, IrpSp, FALSE, NULL )) )
373 0 );
374
375 if( FCB->SharedData.State != SOCKET_STATE_BOUND ) {
377 AFD_DbgPrint(MIN_TRACE,("Could not listen an unbound socket\n"));
378 return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
379 }
380
381 FCB->DelayedAccept = ListenReq->UseDelayedAcceptance;
382
383 AFD_DbgPrint(MID_TRACE,("ADDRESSFILE: %p\n", FCB->AddressFile.Handle));
384
386
387 AFD_DbgPrint(MID_TRACE,("Status from warmsocket %x\n", Status));
388
389 if( !NT_SUCCESS(Status) ) return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
390
392 ( &FCB->ListenIrp.ConnectionCallInfo,
393 FCB->LocalAddress->Address[0].AddressType );
394
396
398 ( &FCB->ListenIrp.ConnectionReturnInfo,
399 FCB->LocalAddress->Address[0].AddressType );
400
401 if (!NT_SUCCESS(Status))
402 {
403 ExFreePoolWithTag(FCB->ListenIrp.ConnectionCallInfo,
405
406 FCB->ListenIrp.ConnectionCallInfo = NULL;
408 }
409
410 FCB->SharedData.State = SOCKET_STATE_LISTENING;
411
412 Status = TdiListen( &FCB->ListenIrp.InFlightRequest,
413 FCB->Connection.Object,
414 &FCB->ListenIrp.ConnectionCallInfo,
415 &FCB->ListenIrp.ConnectionReturnInfo,
417 FCB );
418
419 if( Status == STATUS_PENDING )
421
422 AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
423 return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
424}
425
429 PAFD_FCB FCB = FileObject->FsContext;
431
433
434 AFD_DbgPrint(MID_TRACE,("Called\n"));
435
436 if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
437
438 if( !IsListEmpty( &FCB->PendingConnections ) ) {
439 PLIST_ENTRY PendingConn = FCB->PendingConnections.Flink;
440
441 /* We have a pending connection ... complete this irp right away */
443 ( Irp,
445 ( PendingConn, AFD_TDI_OBJECT_QELT, ListEntry ) );
446
447 AFD_DbgPrint(MID_TRACE,("Completed a wait for accept\n"));
448
449 if ( !IsListEmpty( &FCB->PendingConnections ) )
450 {
451 FCB->PollState |= AFD_EVENT_ACCEPT;
452 FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS;
453 PollReeval( FCB->DeviceExt, FCB->FileObject );
454 } else
455 FCB->PollState &= ~AFD_EVENT_ACCEPT;
456
458 return Status;
459 } else if (FCB->NonBlocking) {
460 AFD_DbgPrint(MIN_TRACE,("No connection ready on a non-blocking socket\n"));
461
463 } else {
464 AFD_DbgPrint(MID_TRACE,("Holding\n"));
465
467 }
468}
469
474 PAFD_DEVICE_EXTENSION DeviceExt =
475 (PAFD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
476 PAFD_FCB FCB = FileObject->FsContext;
477 PAFD_ACCEPT_DATA AcceptData = Irp->AssociatedIrp.SystemBuffer;
478 PLIST_ENTRY PendingConn;
479
480 AFD_DbgPrint(MID_TRACE,("Called\n"));
481
482 if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
483
484 FCB->EventSelectDisabled &= ~AFD_EVENT_ACCEPT;
485
486 for( PendingConn = FCB->PendingConnections.Flink;
487 PendingConn != &FCB->PendingConnections;
488 PendingConn = PendingConn->Flink ) {
489 PAFD_TDI_OBJECT_QELT PendingConnObj =
490 CONTAINING_RECORD( PendingConn, AFD_TDI_OBJECT_QELT, ListEntry );
491
492 AFD_DbgPrint(MID_TRACE,("Comparing Seq %u to Q %u\n",
493 AcceptData->SequenceNumber,
494 PendingConnObj->Seq));
495
496 if( PendingConnObj->Seq == AcceptData->SequenceNumber ) {
498
499 RemoveEntryList( PendingConn );
500
502 ( AcceptData->ListenHandle,
504 NULL,
507 NULL );
508
509 if( !NT_SUCCESS(Status) ) return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
510
512 ASSERT(NewFileObject->FsContext != FCB);
513
514 /* We have a pending connection ... complete this irp right away */
515 Status = SatisfyAccept( DeviceExt, Irp, NewFileObject, PendingConnObj, FALSE );
516
518
519 AFD_DbgPrint(MID_TRACE,("Completed a wait for accept\n"));
520
522
523 if( !IsListEmpty( &FCB->PendingConnections ) )
524 {
525 FCB->PollState |= AFD_EVENT_ACCEPT;
526 FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS;
527 PollReeval( FCB->DeviceExt, FCB->FileObject );
528 } else
529 FCB->PollState &= ~AFD_EVENT_ACCEPT;
530
532 return Status;
533 }
534 }
535
536 AFD_DbgPrint(MIN_TRACE,("No connection waiting\n"));
537
539}
540
545 PAFD_FCB Fcb = FileObject->FsContext;
546 PAFD_SUPER_ACCEPT_INFO AcceptRequest;
547
549
550 AFD_DbgPrint(MID_TRACE,("Called\n"));
551
552 if( !SocketAcquireStateLock( Fcb ) ) return LostSocket( Irp );
553
554 if( !(AcceptRequest = LockRequest( Irp, IrpSp, FALSE, NULL )) )
556 0 );
557
558 Fcb->EventSelectDisabled &= ~AFD_EVENT_ACCEPT;
559
560 /* Allow the IRP to access UserBuffer later */
561 Irp->Tail.Overlay.DriverContext[3] = IoAllocateMdl(Irp->UserBuffer, IrpSp->Parameters.DeviceIoControl.OutputBufferLength, FALSE, FALSE, NULL);
563 {
564 MmProbeAndLockPages((PMDL)Irp->Tail.Overlay.DriverContext[3], Irp->RequestorMode, IoWriteAccess);
565 }
567 {
570 }
571 _SEH2_END;
572
573 /* Validate that accepting socket is valid, and has not been bound or connected */
576 if (!NT_SUCCESS(Status))
577 {
578 IoFreeMdl((PMDL)Irp->Tail.Overlay.DriverContext[3]);
579 Irp->Tail.Overlay.DriverContext[3] = NULL;
581 }
582
583 PAFD_FCB Fcb2 = NewFileObject->FsContext;
584
585 if (!SocketAcquireStateLock(Fcb2))
586 {
588 return LostSocket(Irp);
589 }
590
591 /* Verify that the acceptor socket has not been already binded/connected or that it has been used by AcceptEx */
593 {
594 IoFreeMdl((PMDL)Irp->Tail.Overlay.DriverContext[3]);
595 Irp->Tail.Overlay.DriverContext[3] = NULL;
596 SocketStateUnlock(Fcb2);
599 }
601
602 Irp->Tail.Overlay.DriverContext[2] = NewFileObject;
603
604 /* Proceed later in SatisfyAcceptEx */
605 SocketStateUnlock(Fcb2);
606
608}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
IO_COMPLETION_ROUTINE AcceptExReceiveComplete
Definition: afd.h:319
#define SOCKET_STATE_CLOSED
Definition: afd.h:83
IO_COMPLETION_ROUTINE ReceiveComplete
Definition: afd.h:321
#define SOCKET_STATE_CONNECTED
Definition: afd.h:77
#define SOCKET_STATE_CREATED
Definition: afd.h:74
struct _AFD_FCB * PAFD_FCB
#define TAG_AFD_TDI_CONNECTION_INFORMATION
Definition: afd.h:54
#define FUNCTION_PREACCEPT
Definition: afd.h:88
#define TAG_AFD_ACCEPT_QUEUE
Definition: afd.h:47
#define SOCKET_STATE_LISTENING
Definition: afd.h:78
#define SOCKET_STATE_CONNECTING
Definition: afd.h:76
#define SOCKET_STATE_BOUND
Definition: afd.h:75
struct _AFD_DEVICE_EXTENSION * PAFD_DEVICE_EXTENSION
#define TAG_AFD_TRANSPORT_ADDRESS
Definition: afd.h:39
LONG NTSTATUS
Definition: precomp.h:26
#define MIN_TRACE
Definition: debug.h:14
#define MID_TRACE
Definition: debug.h:15
_In_ PFCB Fcb
Definition: cdprocs.h:159
Definition: bufpool.h:45
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4138
NTSTATUS MakeSocketIntoConnection(PAFD_FCB FCB, BOOL Receive)
Definition: connect.c:259
NTSTATUS WarmSocketForConnection(PAFD_FCB FCB)
Definition: connect.c:238
static IO_COMPLETION_ROUTINE ListenComplete
Definition: listen.c:216
NTSTATUS AfdAccept(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: listen.c:470
NTSTATUS AfdSuperAccept(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: listen.c:541
static NTSTATUS SatisfyPreAccept(PIRP Irp, PAFD_TDI_OBJECT_QELT Qelt)
Definition: listen.c:61
static NTSTATUS SatisfySuperAccept(PAFD_FCB FCB, PIRP Irp, PAFD_TDI_OBJECT_QELT Qelt)
Definition: listen.c:98
NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: listen.c:358
static NTSTATUS SatisfyAccept(PAFD_DEVICE_EXTENSION DeviceExt, PIRP Irp, PFILE_OBJECT NewFileObject, PAFD_TDI_OBJECT_QELT Qelt, BOOL SuperAccept)
Definition: listen.c:14
NTSTATUS AfdWaitForListen(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: listen.c:426
PVOID LockRequest(PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output, KPROCESSOR_MODE *LockMode)
Definition: lock.c:24
VOID UnlockRequest(PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: lock.c:180
NTSTATUS LostSocket(PIRP Irp)
Definition: lock.c:387
NTSTATUS NTAPI UnlockAndMaybeComplete(PAFD_FCB FCB, NTSTATUS Status, PIRP Irp, UINT Information)
Definition: lock.c:375
VOID SocketStateUnlock(PAFD_FCB FCB)
Definition: lock.c:370
NTSTATUS LeaveIrpUntilLater(PAFD_FCB FCB, PIRP Irp, UINT Function)
Definition: lock.c:433
BOOLEAN SocketAcquireStateLock(PAFD_FCB FCB)
Definition: lock.c:360
VOID PollReeval(PAFD_DEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
Definition: select.c:407
#define AFD_DbgPrint(_t_, _x_)
Definition: debug.h:60
#define IO_NETWORK_INCREMENT
Definition: tcpip.h:43
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define InsertTailList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define RemoveHeadList(ListHead)
Definition: env_spec_w32.h:964
#define NonPagedPool
Definition: env_spec_w32.h:307
unsigned int BOOL
Definition: ntddk_ex.h:94
_Must_inspect_result_ _In_ PFILE_OBJECT NewFileObject
Definition: fsrtlfuncs.h:1357
#define IoFreeMdl
Definition: fxmdl.h:89
#define IoAllocateMdl
Definition: fxmdl.h:88
Status
Definition: gdiplustypes.h:24
GLuint GLuint end
Definition: gl.h:1545
unsigned int UINT
Definition: sysinfo.c:13
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
IoSetCancelRoutine(Irp, CancelRoutine)
#define PCHAR
Definition: match.c:90
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
Definition: mdlsup.c:931
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
Definition: mdlsup.c:1435
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
@ NormalPagePriority
Definition: imports.h:54
#define min(a, b)
Definition: monoChain.cc:55
#define KernelMode
Definition: asm.h:38
#define FILE_ALL_ACCESS
Definition: nt_native.h:651
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define IoCompleteRequest
Definition: irp.c:1272
#define STATUS_CANT_WAIT
Definition: ntstatus.h:546
#define STATUS_FILE_CLOSED
Definition: ntstatus.h:626
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:493
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
ULONG IPAddr
Definition: pfhook.h:35
static WCHAR Address[46]
Definition: ping.c:68
static ULONG RequestSize
Definition: ping.c:63
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:204
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:104
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
#define AFD_EVENT_ACCEPT
Definition: shared.h:226
struct _AFD_RECEIVED_ACCEPT_DATA * PAFD_RECEIVED_ACCEPT_DATA
#define STATUS_SUCCESS
Definition: shellext.h:65
_In_ PVOID Context
Definition: storport.h:2269
UINT Size
Definition: afd.h:151
PCHAR Window
Definition: afd.h:150
Definition: afd.h:161
AFD_IN_FLIGHT_REQUEST ReceiveIrp
Definition: afd.h:177
PIRP AcceptIrp
Definition: afd.h:178
AFD_TDI_OBJECT Connection
Definition: afd.h:176
AFD_DATA_WINDOW Recv
Definition: afd.h:179
SOCK_SHARED_INFO SharedData
Definition: afd.h:162
PIRP InFlightRequest
Definition: afd.h:144
BOOLEAN UseDelayedAcceptance
Definition: shared.h:46
TRANSPORT_ADDRESS Address
Definition: shared.h:80
AFD_TDI_OBJECT Object
Definition: afd.h:140
PTDI_CONNECTION_INFORMATION ConnInfo
Definition: afd.h:139
LIST_ENTRY ListEntry
Definition: afd.h:137
PFILE_OBJECT Object
Definition: afd.h:132
Definition: cdstruc.h:902
PFILE_OBJECT FileObject
Definition: ntfs.h:520
PFILE_OBJECT FileObject
Definition: iotypes.h:3171
union _IO_STACK_LOCATION::@1803 Parameters
struct _IO_STACK_LOCATION::@1803::@1804 DeviceIoControl
IO_STATUS_BLOCK IoStatus
Definition: typedefs.h:120
SOCKET_STATE State
Definition: shared.h:383
struct _TRANSPORT_ADDRESS * PTRANSPORT_ADDRESS
struct _TA_ADDRESS_IP * PTA_IP_ADDRESS
#define TDI_RECEIVE_NORMAL
Definition: tdi.h:122
#define TDI_QUERY_ADDRESS_INFO
Definition: tdi.h:181
NTSTATUS TdiQueryInformation(PFILE_OBJECT FileObject, LONG QueryType, PMDL MdlBuffer)
Query for information.
Definition: tdi.c:691
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:461
VOID TaCopyTransportAddressInPlace(PTRANSPORT_ADDRESS Target, PTRANSPORT_ADDRESS Source)
Definition: tdiconn.c:84
NTSTATUS TdiBuildConnectionInfo(PTDI_CONNECTION_INFORMATION *ConnectionInfo, PTRANSPORT_ADDRESS Name)
Definition: tdiconn.c:247
NTSTATUS TdiReceive(PIRP *Irp, PFILE_OBJECT ConnectionObject, USHORT Flags, PCHAR Buffer, UINT BufferLength, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:995
NTSTATUS TdiBuildNullConnectionInfoInPlace(PTDI_CONNECTION_INFORMATION ConnInfo, ULONG Type)
Builds a NULL TDI connection information structure.
Definition: tdiconn.c:147
PTRANSPORT_ADDRESS TaCopyTransportAddress(PTRANSPORT_ADDRESS OtherAddress)
Definition: tdiconn.c:90
#define STATUS_PENDING
Definition: telnetd.h:14
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define NTAPI
Definition: typedefs.h:36
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
char * PCHAR
Definition: typedefs.h:51
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
#define FD_ACCEPT_BIT
Definition: winsock2.h:293
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR RemoteAddress
Definition: wsk.h:172
* PFILE_OBJECT
Definition: iotypes.h:1998
@ IoWriteAccess
Definition: ketypes.h:932
@ IoModifyAccess
Definition: ketypes.h:933
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
#define ObDereferenceObject
Definition: obfuncs.h:203
unsigned char BYTE
Definition: xxhash.c:193