ReactOS 0.4.16-dev-2300-g249be9e
connect.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/connect.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
17{
19 PAFD_FCB FCB = FileObject->FsContext;
20 UINT BufferSize = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
21
23
25
26 if (FCB->ConnectOptionsSize == 0)
27 {
28 AFD_DbgPrint(MIN_TRACE,("Invalid parameter\n"));
30 }
31
32 ASSERT(FCB->ConnectOptions);
33
34 if (FCB->FilledConnectOptions < BufferSize) BufferSize = FCB->FilledConnectOptions;
35
36 RtlCopyMemory(Irp->UserBuffer,
37 FCB->ConnectOptions,
39
41}
42
47{
49 PAFD_FCB FCB = FileObject->FsContext;
50 PVOID ConnectOptions = LockRequest(Irp, IrpSp, FALSE, NULL);
51 UINT ConnectOptionsSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
52
54
56
57 if (!ConnectOptions)
59
60 if (FCB->ConnectOptions)
61 {
63 FCB->ConnectOptions = NULL;
64 FCB->ConnectOptionsSize = 0;
65 FCB->FilledConnectOptions = 0;
66 }
67
68 FCB->ConnectOptions = ExAllocatePoolWithTag(PagedPool,
69 ConnectOptionsSize,
71
72 if (!FCB->ConnectOptions)
74
75 RtlCopyMemory(FCB->ConnectOptions,
76 ConnectOptions,
77 ConnectOptionsSize);
78
79 FCB->ConnectOptionsSize = ConnectOptionsSize;
80
82}
83
88{
90 PAFD_FCB FCB = FileObject->FsContext;
91 PUINT ConnectOptionsSize = LockRequest(Irp, IrpSp, FALSE, NULL);
92 UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
93
95
97
98 if (!ConnectOptionsSize)
100
101 if (BufferSize < sizeof(UINT))
102 {
103 AFD_DbgPrint(MIN_TRACE,("Buffer too small\n"));
105 }
106
107 if (FCB->ConnectOptions)
108 {
110 FCB->ConnectOptionsSize = 0;
111 FCB->FilledConnectOptions = 0;
112 }
113
114 FCB->ConnectOptions = ExAllocatePoolWithTag(PagedPool,
115 *ConnectOptionsSize,
117
118 if (!FCB->ConnectOptions) return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
119
120 FCB->ConnectOptionsSize = *ConnectOptionsSize;
121
123}
124
126NTAPI
129{
131 PAFD_FCB FCB = FileObject->FsContext;
132 UINT BufferSize = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
133
135
137
138 if (FCB->ConnectDataSize == 0)
139 {
140 AFD_DbgPrint(MIN_TRACE,("Invalid parameter\n"));
142 }
143
144 ASSERT(FCB->ConnectData);
145
146 if (FCB->FilledConnectData < BufferSize) BufferSize = FCB->FilledConnectData;
147
148 RtlCopyMemory(Irp->UserBuffer,
149 FCB->ConnectData,
150 BufferSize);
151
153}
154
156NTAPI
159{
161 PAFD_FCB FCB = FileObject->FsContext;
162 PVOID ConnectData = LockRequest(Irp, IrpSp, FALSE, NULL);
163 UINT ConnectDataSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
164
166
168
169 if (!ConnectData)
171
172 if (FCB->ConnectData)
173 {
175 FCB->ConnectData = NULL;
176 FCB->ConnectDataSize = 0;
177 FCB->FilledConnectData = 0;
178 }
179
180 FCB->ConnectData = ExAllocatePoolWithTag(PagedPool,
181 ConnectDataSize,
183
184 if (!FCB->ConnectData) return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
185
186 RtlCopyMemory(FCB->ConnectData,
187 ConnectData,
188 ConnectDataSize);
189
190 FCB->ConnectDataSize = ConnectDataSize;
191
193}
194
196NTAPI
199{
201 PAFD_FCB FCB = FileObject->FsContext;
202 PUINT ConnectDataSize = LockRequest(Irp, IrpSp, FALSE, NULL);
203 UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
204
206
208
209 if (!ConnectDataSize)
211
212 if (BufferSize < sizeof(UINT))
213 {
214 AFD_DbgPrint(MIN_TRACE,("Buffer too small\n"));
216 }
217
218 if (FCB->ConnectData)
219 {
221 FCB->ConnectDataSize = 0;
222 FCB->FilledConnectData = 0;
223 }
224
225 FCB->ConnectData = ExAllocatePoolWithTag(PagedPool,
226 *ConnectDataSize,
228
229 if (!FCB->ConnectData) return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
230
231 FCB->ConnectDataSize = *ConnectDataSize;
232
234}
235
236
240
241 if( !FCB->TdiDeviceName.Length || !FCB->TdiDeviceName.Buffer ) {
242 AFD_DbgPrint(MIN_TRACE,("Null Device\n"));
244 }
245
246 Status = TdiOpenConnectionEndpointFile(&FCB->TdiDeviceName,
247 &FCB->Connection.Handle,
248 &FCB->Connection.Object );
249
250 if( NT_SUCCESS(Status) ) {
251 Status = TdiAssociateAddressFile( FCB->AddressFile.Handle,
252 FCB->Connection.Object );
253 }
254
255 return Status;
256}
257
261
262 ASSERT(!FCB->Recv.Window);
263 ASSERT(!FCB->Send.Window);
264
265 if (!FCB->Recv.Size)
266 {
267 Status = TdiQueryMaxDatagramLength(FCB->Connection.Object,
268 &FCB->Recv.Size);
269 if (!NT_SUCCESS(Status))
270 return Status;
271 }
272
273 if (!FCB->Send.Size)
274 {
275 Status = TdiQueryMaxDatagramLength(FCB->Connection.Object,
276 &FCB->Send.Size);
277 if (!NT_SUCCESS(Status))
278 return Status;
279 }
280
281 /* Allocate the receive area and start receiving */
282 if (!FCB->Recv.Window)
283 {
284 FCB->Recv.Window = ExAllocatePoolWithTag(PagedPool,
285 FCB->Recv.Size,
287
288 if( !FCB->Recv.Window ) return STATUS_NO_MEMORY;
289 }
290
291 if (!FCB->Send.Window)
292 {
293 FCB->Send.Window = ExAllocatePoolWithTag(PagedPool,
294 FCB->Send.Size,
296
297 if( !FCB->Send.Window ) return STATUS_NO_MEMORY;
298 }
299
300 FCB->SharedData.State = SOCKET_STATE_CONNECTED;
301 FCB->SharedData.ConnectTime = 0; // Not used
302
303 Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
304 FCB->Connection.Object,
306 FCB->Recv.Window,
307 FCB->Recv.Size,
309 FCB );
310
312
313 FCB->PollState |= AFD_EVENT_CONNECT | AFD_EVENT_SEND;
314 FCB->PollStatus[FD_CONNECT_BIT] = STATUS_SUCCESS;
315 FCB->PollStatus[FD_WRITE_BIT] = STATUS_SUCCESS;
316 PollReeval( FCB->DeviceExt, FCB->FileObject );
317
318 return Status;
319}
320
321static IO_COMPLETION_ROUTINE StreamSocketConnectSendComplete;
322
323static
325NTAPI
328 PIRP Irp,
330{
332 PLIST_ENTRY NextIrpEntry;
333 PIRP NextIrp;
334
336 return STATUS_FILE_CLOSED;
337
338 ASSERT(FCB->SendIrp.InFlightRequest == Irp);
339 FCB->SendIrp.InFlightRequest = NULL;
340
341 while (!IsListEmpty(&FCB->PendingIrpList[FUNCTION_CONNECTEX]))
342 {
343 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECTEX]);
344 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
345
346 AFD_DbgPrint(MID_TRACE,("Completing connectex %p\n", NextIrp));
347 NextIrp->IoStatus.Status = Irp->IoStatus.Status;
348 NextIrp->IoStatus.Information = Irp->IoStatus.Information;
349 if (NextIrp->MdlAddress)
351 (void)IoSetCancelRoutine(NextIrp, NULL);
353 }
354
355 if (FCB->OnConnectSendBuffer)
356 {
358 FCB->OnConnectSendBuffer = NULL;
359 FCB->OnConnectSendBufferSize = 0;
360 }
361
363
364 return STATUS_SUCCESS;
365}
366
367static IO_COMPLETION_ROUTINE StreamSocketConnectComplete;
368static
370NTAPI
372 PVOID Context) {
373 NTSTATUS Status = Irp->IoStatus.Status;
375 PLIST_ENTRY NextIrpEntry;
376 PIRP NextIrp;
377
378 AFD_DbgPrint(MID_TRACE,("Called: FCB %p, FO %p\n",
380
381 /* I was wrong about this before as we can have pending writes to a not
382 * yet connected socket */
384 return STATUS_FILE_CLOSED;
385
386 AFD_DbgPrint(MID_TRACE,("Irp->IoStatus.Status = %x\n",
387 Irp->IoStatus.Status));
388
389 ASSERT(FCB->ConnectIrp.InFlightRequest == Irp);
390 FCB->ConnectIrp.InFlightRequest = NULL;
391
392 if( FCB->SharedData.State == SOCKET_STATE_CLOSED ) {
393 /* Cleanup our IRP queue because the FCB is being destroyed */
394 while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_CONNECT] ) ) {
395 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECT]);
396 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
398 NextIrp->IoStatus.Information = 0;
399 if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
400 (void)IoSetCancelRoutine(NextIrp, NULL);
402 }
403 while (!IsListEmpty(&FCB->PendingIrpList[FUNCTION_CONNECTEX]))
404 {
405 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECTEX]);
406 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
408 NextIrp->IoStatus.Information = Irp->IoStatus.Information;
409 if (NextIrp->MdlAddress)
411 (void)IoSetCancelRoutine(NextIrp, NULL);
413 }
415 return STATUS_FILE_CLOSED;
416 }
417
418 if( !NT_SUCCESS(Irp->IoStatus.Status) ) {
419 FCB->PollState |= AFD_EVENT_CONNECT_FAIL;
420 FCB->PollStatus[FD_CONNECT_BIT] = Irp->IoStatus.Status;
421 AFD_DbgPrint(MID_TRACE,("Going to bound state\n"));
422 FCB->SharedData.State = SOCKET_STATE_BOUND;
423 PollReeval( FCB->DeviceExt, FCB->FileObject );
424 }
425
426 /* Succeed pending irps on the FUNCTION_CONNECT list */
427 while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_CONNECT] ) ) {
428 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECT]);
429 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
430 AFD_DbgPrint(MID_TRACE,("Completing connect %p\n", NextIrp));
431 NextIrp->IoStatus.Status = Status;
432 NextIrp->IoStatus.Information = NT_SUCCESS(Status) ? ((ULONG_PTR)FCB->Connection.Handle) : 0;
433 if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
434 (void)IoSetCancelRoutine(NextIrp, NULL);
436 }
437
438 if( NT_SUCCESS(Status) ) {
440
441 if( !NT_SUCCESS(Status) ) {
442 goto end;
443 }
444
445 FCB->FilledConnectData = MIN(FCB->ConnectReturnInfo->UserDataLength, FCB->ConnectDataSize);
446 if (FCB->FilledConnectData)
447 {
448 RtlCopyMemory(FCB->ConnectData,
449 FCB->ConnectReturnInfo->UserData,
450 FCB->FilledConnectData);
451 }
452
453 FCB->FilledConnectOptions = MIN(FCB->ConnectReturnInfo->OptionsLength, FCB->ConnectOptionsSize);
454 if (FCB->FilledConnectOptions)
455 {
456 RtlCopyMemory(FCB->ConnectOptions,
457 FCB->ConnectReturnInfo->Options,
458 FCB->FilledConnectOptions);
459 }
460
461 if( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_SEND] ) ) {
462 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_SEND]);
463 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP,
464 Tail.Overlay.ListEntry);
465 AFD_DbgPrint(MID_TRACE,("Launching send request %p\n", NextIrp));
467 ( DeviceObject,
468 NextIrp,
470 FALSE );
471 }
472
473 if( Status == STATUS_PENDING )
475
476 if (FCB->OnConnectSendBuffer)
477 {
478 PFILE_OBJECT object = FCB->Connection.Object;
479 PVOID sendBuffer = FCB->OnConnectSendBuffer;
480 UINT sendBufferLength = FCB->OnConnectSendBufferSize;
482
483 Status = TdiSend(&FCB->SendIrp.InFlightRequest,
484 object,
486 sendBuffer,
487 sendBufferLength,
489 FCB);
490
492 }
493 }
494
495end:
496 while (!IsListEmpty(&FCB->PendingIrpList[FUNCTION_CONNECTEX]))
497 {
498 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECTEX]);
499 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
500
501 AFD_DbgPrint(MID_TRACE,("Completing connectex %p\n", NextIrp));
502 NextIrp->IoStatus.Status = Status;
503 NextIrp->IoStatus.Information = 0;
504 if (NextIrp->MdlAddress)
506 (void)IoSetCancelRoutine(NextIrp, NULL);
508 }
510
511 AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
512
513 return Status;
514}
515
516/* Return the socket object for ths request only if it is a connected or
517 stream type. */
519NTAPI
524 PAFD_FCB FCB = FileObject->FsContext;
525 PAFD_CONNECT_INFO ConnectReq;
526 AFD_DbgPrint(MID_TRACE,("Called on %p\n", FCB));
527
529
530 if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
531 if( !(ConnectReq = LockRequest( Irp, IrpSp, FALSE, NULL )) )
533 0 );
534
535 AFD_DbgPrint(MID_TRACE,("Connect request:\n"));
536#if 0
538 ( (PCHAR)ConnectReq,
539 IrpSp->Parameters.DeviceIoControl.InputBufferLength );
540#endif
541
543 {
544 if (FCB->RemoteAddress)
545 {
547 }
548
549 FCB->RemoteAddress =
551
552 if( !FCB->RemoteAddress )
554 else
556
557 return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
558 }
559
560 switch(FCB->SharedData.State)
561 {
564 break;
565
568
570 if (FCB->LocalAddress)
571 {
573 }
574
575 FCB->LocalAddress =
577
578 if( FCB->LocalAddress ) {
580
581 if( NT_SUCCESS(Status) )
582 FCB->SharedData.State = SOCKET_STATE_BOUND;
583 else
584 return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
585 } else
587 ( FCB, STATUS_NO_MEMORY, Irp, 0 );
588
589 /* Drop through to SOCKET_STATE_BOUND */
590
592 if (FCB->RemoteAddress)
593 {
595 }
596
597 FCB->RemoteAddress =
599
600 if( !FCB->RemoteAddress ) {
602 break;
603 }
604
606
607 if( !NT_SUCCESS(Status) )
608 break;
609
610 if (FCB->ConnectReturnInfo)
611 {
613 }
614
616 ( &FCB->ConnectReturnInfo,
617 &ConnectReq->RemoteAddress );
618
619 if( NT_SUCCESS(Status) )
620 {
621 if (FCB->ConnectCallInfo)
622 {
624 }
625
626 Status = TdiBuildConnectionInfo(&FCB->ConnectCallInfo,
627 &ConnectReq->RemoteAddress);
628 }
629 else break;
630
631
632 if( NT_SUCCESS(Status) ) {
633 FCB->ConnectCallInfo->UserData = FCB->ConnectData;
634 FCB->ConnectCallInfo->UserDataLength = FCB->ConnectDataSize;
635 FCB->ConnectCallInfo->Options = FCB->ConnectOptions;
636 FCB->ConnectCallInfo->OptionsLength = FCB->ConnectOptionsSize;
637
638 FCB->SharedData.State = SOCKET_STATE_CONNECTING;
639
640 AFD_DbgPrint(MID_TRACE,("Queueing IRP %p\n", Irp));
642 if (Status == STATUS_PENDING)
643 {
644 Status = TdiConnect(&FCB->ConnectIrp.InFlightRequest,
645 FCB->Connection.Object,
646 FCB->ConnectCallInfo,
647 FCB->ConnectReturnInfo,
649 FCB);
650 }
651
652 if (Status != STATUS_PENDING)
653 FCB->SharedData.State = SOCKET_STATE_BOUND;
654
656
657 return Status;
658 }
659 break;
660
661 default:
662 AFD_DbgPrint(MIN_TRACE,("Inappropriate socket state %u for connect\n",
663 FCB->SharedData.State));
664 break;
665 }
666
668}
669
670/* Return the socket object for ths request only if it is a connected or stream type. */
672NTAPI
675 PIRP Irp,
677{
680 PAFD_FCB FCB = FileObject->FsContext;
681 PAFD_SUPER_CONNECT_INFO ConnectReq;
683 UINT BufferSize = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
684 AFD_DbgPrint(MID_TRACE,("Called on %p\n", FCB));
685
687
689 return LostSocket(Irp);
690
691 ConnectReq = LockRequest(Irp, IrpSp, FALSE, &LockMode);
692 if (!ConnectReq)
694
695 AFD_DbgPrint(MID_TRACE,("Connect request:\n"));
696#if DBG
697 OskitDumpBuffer((PCHAR)ConnectReq,
698 IrpSp->Parameters.DeviceIoControl.InputBufferLength);
699#endif
700
701 if (FCB->OnConnectSendBuffer)
702 {
704 FCB->OnConnectSendBuffer = NULL;
705 FCB->OnConnectSendBufferSize = 0;
706 }
707
708 if (Irp->UserBuffer)
709 {
710 FCB->OnConnectSendBufferSize = BufferSize;
711 FCB->OnConnectSendBuffer = ExAllocatePoolWithTag(PagedPool,
714
715 if (!FCB->OnConnectSendBuffer)
717
718 RtlCopyMemory(FCB->OnConnectSendBuffer, Irp->UserBuffer, BufferSize);
719 }
720
722 {
723 AFD_DbgPrint(MIN_TRACE,("Cannot call IOCTL_CONNECTEX on connectionless socket\n",
724 FCB->SharedData.State));
725 if (FCB->RemoteAddress)
726 {
728 }
729
730 FCB->RemoteAddress =
732
733 if(!FCB->RemoteAddress)
735 else
737
738 return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
739 }
740
741 switch (FCB->SharedData.State)
742 {
745 break;
746
749
751 if (FCB->RemoteAddress)
752 {
754 }
755
756 FCB->RemoteAddress =
758 if (!FCB->RemoteAddress)
759 {
761 break;
762 }
763
765 if (!NT_SUCCESS(Status))
766 break;
767
768 if (FCB->ConnectReturnInfo)
769 {
771 }
772
773 Status = TdiBuildConnectionInfo(&FCB->ConnectReturnInfo,
774 &ConnectReq->RemoteAddress);
775 if (!NT_SUCCESS(Status))
776 break;
777
778 if (FCB->ConnectCallInfo)
779 {
781 }
782
783 Status = TdiBuildConnectionInfo(&FCB->ConnectCallInfo,
784 &ConnectReq->RemoteAddress);
785
786
787 if (!NT_SUCCESS(Status))
788 break;
789
790 FCB->ConnectCallInfo->UserData = FCB->ConnectData ? FCB->ConnectData : FCB->OnConnectSendBuffer;
791 FCB->ConnectCallInfo->UserDataLength = FCB->ConnectData ? FCB->ConnectDataSize : FCB->OnConnectSendBufferSize;
792 FCB->ConnectCallInfo->Options = FCB->ConnectOptions;
793 FCB->ConnectCallInfo->OptionsLength = FCB->ConnectOptionsSize;
794 FCB->SharedData.State = SOCKET_STATE_CONNECTING;
795
796 AFD_DbgPrint(MID_TRACE,("Queueing IRP %p\n", Irp));
798 if (Status == STATUS_PENDING)
799 {
800 Status = TdiConnect(&FCB->ConnectIrp.InFlightRequest,
801 FCB->Connection.Object,
802 FCB->ConnectCallInfo,
803 FCB->ConnectReturnInfo,
805 FCB );
806 }
807
808 if (Status != STATUS_PENDING)
809 FCB->SharedData.State = SOCKET_STATE_BOUND;
810
812
813 return Status;
814
815 default:
816 AFD_DbgPrint(MIN_TRACE,("Inappropriate socket state %u for connect\n",
817 FCB->SharedData.State));
818 break;
819 }
820
821 return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
822}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define FUNCTION_CONNECT
Definition: afd.h:85
#define SOCKET_STATE_CLOSED
Definition: afd.h:83
IO_COMPLETION_ROUTINE ReceiveComplete
Definition: afd.h:315
#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 TAG_AFD_SUPER_CONNECT_BUFFER
Definition: afd.h:46
#define TAG_AFD_CONNECT_OPTIONS
Definition: afd.h:44
#define TAG_AFD_CONNECT_DATA
Definition: afd.h:41
#define FUNCTION_CONNECTEX
Definition: afd.h:92
#define SOCKET_STATE_CONNECTING
Definition: afd.h:76
#define SOCKET_STATE_BOUND
Definition: afd.h:75
#define TAG_AFD_DATA_BUFFER
Definition: afd.h:38
#define TAG_AFD_TRANSPORT_ADDRESS
Definition: afd.h:39
#define FUNCTION_SEND
Definition: afd.h:87
LONG NTSTATUS
Definition: precomp.h:26
#define MIN(x, y)
Definition: rdesktop.h:171
#define MIN_TRACE
Definition: debug.h:14
#define MID_TRACE
Definition: debug.h:15
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define BufferSize
Definition: mmc.h:75
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4138
NTSTATUS WarmSocketForBind(PAFD_FCB FCB, ULONG ShareType)
Definition: bind.c:13
NTSTATUS MakeSocketIntoConnection(PAFD_FCB FCB)
Definition: connect.c:259
NTSTATUS NTAPI AfdSetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: connect.c:157
NTSTATUS NTAPI AfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: connect.c:197
NTSTATUS NTAPI AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: connect.c:520
static IO_COMPLETION_ROUTINE StreamSocketConnectSendComplete
Definition: connect.c:321
NTSTATUS NTAPI AfdStreamSocketSuperConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: connect.c:673
NTSTATUS NTAPI AfdGetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: connect.c:15
NTSTATUS NTAPI AfdGetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: connect.c:127
NTSTATUS NTAPI AfdSetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: connect.c:45
NTSTATUS WarmSocketForConnection(PAFD_FCB FCB)
Definition: connect.c:238
static IO_COMPLETION_ROUTINE StreamSocketConnectComplete
Definition: connect.c:367
NTSTATUS NTAPI AfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: connect.c:86
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 QueueUserModeIrp(PAFD_FCB FCB, PIRP Irp, UINT Function)
Definition: lock.c:397
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 OskitDumpBuffer(PCHAR Data, UINT Len)
Definition: main.c:29
VOID PollReeval(PAFD_DEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
Definition: select.c:407
NTSTATUS NTAPI AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Short)
Definition: write.c:329
#define AFD_DbgPrint(_t_, _x_)
Definition: debug.h:60
#define IO_NETWORK_INCREMENT
Definition: tcpip.h:43
#define ULONG_PTR
Definition: config.h:101
ULONG LockMode
Definition: env_spec_w32.cpp:8
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
#define RemoveHeadList(ListHead)
Definition: env_spec_w32.h:964
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:25
GLuint GLuint end
Definition: gl.h:1545
IoSetCancelRoutine(Irp, CancelRoutine)
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
unsigned int * PUINT
Definition: ndis.h:50
unsigned int UINT
Definition: ndis.h:50
#define AFD_SHARE_WILDCARD
Definition: netio.c:69
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define IoCompleteRequest
Definition: irp.c:1240
#define STATUS_FILE_CLOSED
Definition: ntstatus.h:626
#define AFD_EVENT_SEND
Definition: shared.h:211
#define AFD_OVERLAPPED
Definition: shared.h:225
#define AFD_EVENT_CONNECT_FAIL
Definition: shared.h:217
#define AFD_ENDPOINT_CONNECTIONLESS
Definition: shared.h:159
#define AFD_EVENT_CONNECT
Definition: shared.h:215
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
TRANSPORT_ADDRESS RemoteAddress
Definition: shared.h:121
Definition: afd.h:161
TRANSPORT_ADDRESS RemoteAddress
Definition: shared.h:127
Definition: cdstruc.h:902
ULONG Flags
Definition: ntfs.h:536
PFILE_OBJECT FileObject
Definition: ntfs.h:520
union _IO_STACK_LOCATION::@1669 Parameters
PFILE_OBJECT FileObject
Definition: iotypes.h:3171
struct _IO_STACK_LOCATION::@1669::@1670 DeviceIoControl
IO_STATUS_BLOCK IoStatus
Definition: typedefs.h:120
USHORT AddressType
Definition: tdi.h:339
TA_ADDRESS Address[1]
Definition: tdi.h:377
#define TDI_RECEIVE_NORMAL
Definition: tdi.h:122
NTSTATUS TdiOpenConnectionEndpointFile(PUNICODE_STRING DeviceName, PHANDLE ConnectionHandle, PFILE_OBJECT *ConnectionObject)
Opens a connection endpoint file object.
Definition: tdi.c:258
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
NTSTATUS TdiAssociateAddressFile(HANDLE AddressHandle, PFILE_OBJECT ConnectionObject)
Associates a connection endpoint to an address file object.
Definition: tdi.c:364
NTSTATUS TdiBuildConnectionInfo(PTDI_CONNECTION_INFORMATION *ConnectionInfo, PTRANSPORT_ADDRESS Name)
Definition: tdiconn.c:247
NTSTATUS TdiQueryMaxDatagramLength(PFILE_OBJECT FileObject, PUINT MaxDatagramLength)
Definition: tdi.c:203
NTSTATUS TdiReceive(PIRP *Irp, PFILE_OBJECT ConnectionObject, USHORT Flags, PCHAR Buffer, UINT BufferLength, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:995
PTRANSPORT_ADDRESS TaBuildNullTransportAddress(UINT AddressType)
Definition: tdiconn.c:123
PTRANSPORT_ADDRESS TaCopyTransportAddress(PTRANSPORT_ADDRESS OtherAddress)
Definition: tdiconn.c:90
NTSTATUS TdiSend(PIRP *Irp, PFILE_OBJECT ConnectionObject, USHORT Flags, PCHAR Buffer, UINT BufferLength, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext)
Definition: tdi.c:921
#define STATUS_PENDING
Definition: telnetd.h:14
#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_NO_SUCH_DEVICE
Definition: udferr_usr.h:136
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
#define FD_CONNECT_BIT
Definition: winsock2.h:295
#define FD_WRITE_BIT
Definition: winsock2.h:289
* PFILE_OBJECT
Definition: iotypes.h:1998
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7