ReactOS 0.4.17-dev-970-gcf0f1a6
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 if (Receive)
304 {
305 Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
306 FCB->Connection.Object,
308 FCB->Recv.Window,
309 FCB->Recv.Size,
311 FCB );
312
314 }
315
316 FCB->PollState |= AFD_EVENT_CONNECT | AFD_EVENT_SEND;
317 FCB->PollStatus[FD_CONNECT_BIT] = STATUS_SUCCESS;
318 FCB->PollStatus[FD_WRITE_BIT] = STATUS_SUCCESS;
319 PollReeval( FCB->DeviceExt, FCB->FileObject );
320
321 return Status;
322}
323
324static IO_COMPLETION_ROUTINE StreamSocketConnectSendComplete;
325
326static
328NTAPI
331 PIRP Irp,
333{
335 PLIST_ENTRY NextIrpEntry;
336 PIRP NextIrp;
337
339 return STATUS_FILE_CLOSED;
340
341 ASSERT(FCB->SendIrp.InFlightRequest == Irp);
342 FCB->SendIrp.InFlightRequest = NULL;
343
344 while (!IsListEmpty(&FCB->PendingIrpList[FUNCTION_CONNECTEX]))
345 {
346 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECTEX]);
347 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
348
349 AFD_DbgPrint(MID_TRACE,("Completing connectex %p\n", NextIrp));
350 NextIrp->IoStatus.Status = Irp->IoStatus.Status;
351 NextIrp->IoStatus.Information = Irp->IoStatus.Information;
352 if (NextIrp->MdlAddress)
354 (void)IoSetCancelRoutine(NextIrp, NULL);
356 }
357
358 if (FCB->OnConnectSendBuffer)
359 {
361 FCB->OnConnectSendBuffer = NULL;
362 FCB->OnConnectSendBufferSize = 0;
363 }
364
366
367 return STATUS_SUCCESS;
368}
369
370static IO_COMPLETION_ROUTINE StreamSocketConnectComplete;
371static
373NTAPI
375 PVOID Context) {
376 NTSTATUS Status = Irp->IoStatus.Status;
378 PLIST_ENTRY NextIrpEntry;
379 PIRP NextIrp;
380
381 AFD_DbgPrint(MID_TRACE,("Called: FCB %p, FO %p\n",
383
384 /* I was wrong about this before as we can have pending writes to a not
385 * yet connected socket */
387 return STATUS_FILE_CLOSED;
388
389 AFD_DbgPrint(MID_TRACE,("Irp->IoStatus.Status = %x\n",
390 Irp->IoStatus.Status));
391
392 ASSERT(FCB->ConnectIrp.InFlightRequest == Irp);
393 FCB->ConnectIrp.InFlightRequest = NULL;
394
395 if( FCB->SharedData.State == SOCKET_STATE_CLOSED ) {
396 /* Cleanup our IRP queue because the FCB is being destroyed */
397 while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_CONNECT] ) ) {
398 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECT]);
399 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
401 NextIrp->IoStatus.Information = 0;
402 if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
403 (void)IoSetCancelRoutine(NextIrp, NULL);
405 }
406 while (!IsListEmpty(&FCB->PendingIrpList[FUNCTION_CONNECTEX]))
407 {
408 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECTEX]);
409 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
411 NextIrp->IoStatus.Information = Irp->IoStatus.Information;
412 if (NextIrp->MdlAddress)
414 (void)IoSetCancelRoutine(NextIrp, NULL);
416 }
418 return STATUS_FILE_CLOSED;
419 }
420
421 if( !NT_SUCCESS(Irp->IoStatus.Status) ) {
422 FCB->PollState |= AFD_EVENT_CONNECT_FAIL;
423 FCB->PollStatus[FD_CONNECT_BIT] = Irp->IoStatus.Status;
424 AFD_DbgPrint(MID_TRACE,("Going to bound state\n"));
425 FCB->SharedData.State = SOCKET_STATE_BOUND;
426 PollReeval( FCB->DeviceExt, FCB->FileObject );
427 }
428
429 /* Succeed pending irps on the FUNCTION_CONNECT list */
430 while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_CONNECT] ) ) {
431 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECT]);
432 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
433 AFD_DbgPrint(MID_TRACE,("Completing connect %p\n", NextIrp));
434 NextIrp->IoStatus.Status = Status;
435 NextIrp->IoStatus.Information = NT_SUCCESS(Status) ? ((ULONG_PTR)FCB->Connection.Handle) : 0;
436 if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
437 (void)IoSetCancelRoutine(NextIrp, NULL);
439 }
440
441 if( NT_SUCCESS(Status) ) {
443
444 if( !NT_SUCCESS(Status) ) {
445 goto end;
446 }
447
448 FCB->FilledConnectData = MIN(FCB->ConnectReturnInfo->UserDataLength, FCB->ConnectDataSize);
449 if (FCB->FilledConnectData)
450 {
451 RtlCopyMemory(FCB->ConnectData,
452 FCB->ConnectReturnInfo->UserData,
453 FCB->FilledConnectData);
454 }
455
456 FCB->FilledConnectOptions = MIN(FCB->ConnectReturnInfo->OptionsLength, FCB->ConnectOptionsSize);
457 if (FCB->FilledConnectOptions)
458 {
459 RtlCopyMemory(FCB->ConnectOptions,
460 FCB->ConnectReturnInfo->Options,
461 FCB->FilledConnectOptions);
462 }
463
464 if( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_SEND] ) ) {
465 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_SEND]);
466 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP,
467 Tail.Overlay.ListEntry);
468 AFD_DbgPrint(MID_TRACE,("Launching send request %p\n", NextIrp));
470 ( DeviceObject,
471 NextIrp,
473 FALSE );
474 }
475
476 if( Status == STATUS_PENDING )
478
479 if (FCB->OnConnectSendBuffer)
480 {
481 PFILE_OBJECT object = FCB->Connection.Object;
482 PVOID sendBuffer = FCB->OnConnectSendBuffer;
483 UINT sendBufferLength = FCB->OnConnectSendBufferSize;
485
486 Status = TdiSend(&FCB->SendIrp.InFlightRequest,
487 object,
489 sendBuffer,
490 sendBufferLength,
492 FCB);
493
495 }
496 }
497
498end:
499 while (!IsListEmpty(&FCB->PendingIrpList[FUNCTION_CONNECTEX]))
500 {
501 NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECTEX]);
502 NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
503
504 AFD_DbgPrint(MID_TRACE,("Completing connectex %p\n", NextIrp));
505 NextIrp->IoStatus.Status = Status;
506 NextIrp->IoStatus.Information = 0;
507 if (NextIrp->MdlAddress)
509 (void)IoSetCancelRoutine(NextIrp, NULL);
511 }
513
514 AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
515
516 return Status;
517}
518
519/* Return the socket object for ths request only if it is a connected or
520 stream type. */
522NTAPI
527 PAFD_FCB FCB = FileObject->FsContext;
528 PAFD_CONNECT_INFO ConnectReq;
529 AFD_DbgPrint(MID_TRACE,("Called on %p\n", FCB));
530
532
533 if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
534 if( !(ConnectReq = LockRequest( Irp, IrpSp, FALSE, NULL )) )
536 0 );
537
538 AFD_DbgPrint(MID_TRACE,("Connect request:\n"));
539#if 0
541 ( (PCHAR)ConnectReq,
542 IrpSp->Parameters.DeviceIoControl.InputBufferLength );
543#endif
544
546 {
547 if (FCB->RemoteAddress)
548 {
550 }
551
552 FCB->RemoteAddress =
554
555 if( !FCB->RemoteAddress )
557 else
559
560 return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
561 }
562
563 switch(FCB->SharedData.State)
564 {
567 break;
568
571
573 if (FCB->LocalAddress)
574 {
576 }
577
578 FCB->LocalAddress =
580
581 if( FCB->LocalAddress ) {
583
584 if( NT_SUCCESS(Status) )
585 FCB->SharedData.State = SOCKET_STATE_BOUND;
586 else
587 return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
588 } else
590 ( FCB, STATUS_NO_MEMORY, Irp, 0 );
591
592 /* Drop through to SOCKET_STATE_BOUND */
593
595 if (FCB->RemoteAddress)
596 {
598 }
599
600 FCB->RemoteAddress =
602
603 if( !FCB->RemoteAddress ) {
605 break;
606 }
607
609
610 if( !NT_SUCCESS(Status) )
611 break;
612
613 if (FCB->ConnectReturnInfo)
614 {
616 }
617
619 ( &FCB->ConnectReturnInfo,
620 &ConnectReq->RemoteAddress );
621
622 if( NT_SUCCESS(Status) )
623 {
624 if (FCB->ConnectCallInfo)
625 {
627 }
628
629 Status = TdiBuildConnectionInfo(&FCB->ConnectCallInfo,
630 &ConnectReq->RemoteAddress);
631 }
632 else break;
633
634
635 if( NT_SUCCESS(Status) ) {
636 FCB->ConnectCallInfo->UserData = FCB->ConnectData;
637 FCB->ConnectCallInfo->UserDataLength = FCB->ConnectDataSize;
638 FCB->ConnectCallInfo->Options = FCB->ConnectOptions;
639 FCB->ConnectCallInfo->OptionsLength = FCB->ConnectOptionsSize;
640
641 FCB->SharedData.State = SOCKET_STATE_CONNECTING;
642
643 AFD_DbgPrint(MID_TRACE,("Queueing IRP %p\n", Irp));
645 if (Status == STATUS_PENDING)
646 {
647 Status = TdiConnect(&FCB->ConnectIrp.InFlightRequest,
648 FCB->Connection.Object,
649 FCB->ConnectCallInfo,
650 FCB->ConnectReturnInfo,
652 FCB);
653 }
654
655 if (Status != STATUS_PENDING)
656 FCB->SharedData.State = SOCKET_STATE_BOUND;
657
659
660 return Status;
661 }
662 break;
663
664 default:
665 AFD_DbgPrint(MIN_TRACE,("Inappropriate socket state %u for connect\n",
666 FCB->SharedData.State));
667 break;
668 }
669
671}
672
673/* Return the socket object for ths request only if it is a connected or stream type. */
675NTAPI
678 PIRP Irp,
680{
683 PAFD_FCB FCB = FileObject->FsContext;
684 PAFD_SUPER_CONNECT_INFO ConnectReq;
686 UINT BufferSize = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
687 AFD_DbgPrint(MID_TRACE,("Called on %p\n", FCB));
688
690
692 return LostSocket(Irp);
693
694 ConnectReq = LockRequest(Irp, IrpSp, FALSE, &LockMode);
695 if (!ConnectReq)
697
698 AFD_DbgPrint(MID_TRACE,("Connect request:\n"));
699#if DBG
700 OskitDumpBuffer((PCHAR)ConnectReq,
701 IrpSp->Parameters.DeviceIoControl.InputBufferLength);
702#endif
703
704 if (FCB->OnConnectSendBuffer)
705 {
707 FCB->OnConnectSendBuffer = NULL;
708 FCB->OnConnectSendBufferSize = 0;
709 }
710
711 if (Irp->UserBuffer)
712 {
713 FCB->OnConnectSendBufferSize = BufferSize;
714 FCB->OnConnectSendBuffer = ExAllocatePoolWithTag(PagedPool,
717
718 if (!FCB->OnConnectSendBuffer)
720
721 RtlCopyMemory(FCB->OnConnectSendBuffer, Irp->UserBuffer, BufferSize);
722 }
723
725 {
726 AFD_DbgPrint(MIN_TRACE,("Cannot call IOCTL_CONNECTEX on connectionless socket\n",
727 FCB->SharedData.State));
728 if (FCB->RemoteAddress)
729 {
731 }
732
733 FCB->RemoteAddress =
735
736 if(!FCB->RemoteAddress)
738 else
740
741 return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
742 }
743
744 switch (FCB->SharedData.State)
745 {
748 break;
749
752
754 if (FCB->RemoteAddress)
755 {
757 }
758
759 FCB->RemoteAddress =
761 if (!FCB->RemoteAddress)
762 {
764 break;
765 }
766
768 if (!NT_SUCCESS(Status))
769 break;
770
771 if (FCB->ConnectReturnInfo)
772 {
774 }
775
776 Status = TdiBuildConnectionInfo(&FCB->ConnectReturnInfo,
777 &ConnectReq->RemoteAddress);
778 if (!NT_SUCCESS(Status))
779 break;
780
781 if (FCB->ConnectCallInfo)
782 {
784 }
785
786 Status = TdiBuildConnectionInfo(&FCB->ConnectCallInfo,
787 &ConnectReq->RemoteAddress);
788
789
790 if (!NT_SUCCESS(Status))
791 break;
792
793 FCB->ConnectCallInfo->UserData = FCB->ConnectData ? FCB->ConnectData : FCB->OnConnectSendBuffer;
794 FCB->ConnectCallInfo->UserDataLength = FCB->ConnectData ? FCB->ConnectDataSize : FCB->OnConnectSendBufferSize;
795 FCB->ConnectCallInfo->Options = FCB->ConnectOptions;
796 FCB->ConnectCallInfo->OptionsLength = FCB->ConnectOptionsSize;
797 FCB->SharedData.State = SOCKET_STATE_CONNECTING;
798
799 AFD_DbgPrint(MID_TRACE,("Queueing IRP %p\n", Irp));
801 if (Status == STATUS_PENDING)
802 {
803 Status = TdiConnect(&FCB->ConnectIrp.InFlightRequest,
804 FCB->Connection.Object,
805 FCB->ConnectCallInfo,
806 FCB->ConnectReturnInfo,
808 FCB );
809 }
810
811 if (Status != STATUS_PENDING)
812 FCB->SharedData.State = SOCKET_STATE_BOUND;
813
815
816 return Status;
817
818 default:
819 AFD_DbgPrint(MIN_TRACE,("Inappropriate socket state %u for connect\n",
820 FCB->SharedData.State));
821 break;
822 }
823
824 return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
825}
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: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 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
_In_ ULONG BufferSize
Definition: dispmprt.h:490
#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 WarmSocketForBind(PAFD_FCB FCB, ULONG ShareType)
Definition: bind.c:13
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:523
static IO_COMPLETION_ROUTINE StreamSocketConnectSendComplete
Definition: connect.c:324
NTSTATUS NTAPI AfdStreamSocketSuperConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: connect.c:676
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 MakeSocketIntoConnection(PAFD_FCB FCB, BOOL Receive)
Definition: connect.c:259
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:370
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:30
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
unsigned int BOOL
Definition: ntddk_ex.h:94
Status
Definition: gdiplustypes.h:24
GLuint GLuint end
Definition: gl.h:1545
unsigned int UINT
Definition: sysinfo.c:13
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
#define AFD_SHARE_WILDCARD
Definition: netio.c:69
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define IoCompleteRequest
Definition: irp.c:1272
#define STATUS_FILE_CLOSED
Definition: ntstatus.h:626
#define AFD_EVENT_SEND
Definition: shared.h:221
#define AFD_OVERLAPPED
Definition: shared.h:235
#define AFD_EVENT_CONNECT_FAIL
Definition: shared.h:227
#define AFD_ENDPOINT_CONNECTIONLESS
Definition: shared.h:169
#define AFD_EVENT_CONNECT
Definition: shared.h:225
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
_In_ PVOID Context
Definition: storport.h:2269
TRANSPORT_ADDRESS RemoteAddress
Definition: shared.h:131
Definition: afd.h:161
TRANSPORT_ADDRESS RemoteAddress
Definition: shared.h:137
Definition: cdstruc.h:902
ULONG Flags
Definition: ntfs.h:536
PFILE_OBJECT FileObject
Definition: ntfs.h:520
PFILE_OBJECT FileObject
Definition: iotypes.h:3171
struct _IO_STACK_LOCATION::@1804::@1805 DeviceIoControl
union _IO_STACK_LOCATION::@1804 Parameters
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
#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