ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

bind.c
Go to the documentation of this file.
00001 /* $Id: bind.c 56389 2012-04-22 13:11:54Z tfaber $
00002  * COPYRIGHT:        See COPYING in the top level directory
00003  * PROJECT:          ReactOS kernel
00004  * FILE:             drivers/net/afd/afd/bind.c
00005  * PURPOSE:          Ancillary functions driver
00006  * PROGRAMMER:       Art Yerkes (ayerkes@speakeasy.net)
00007  * UPDATE HISTORY:
00008  * 20040708 Created
00009  */
00010 
00011 #include "afd.h"
00012 
00013 NTSTATUS WarmSocketForBind( PAFD_FCB FCB ) {
00014     NTSTATUS Status;
00015 
00016     AFD_DbgPrint(MID_TRACE,("Called (AF %d)\n",
00017                             FCB->LocalAddress->Address[0].AddressType));
00018 
00019     if( !FCB->TdiDeviceName.Length || !FCB->TdiDeviceName.Buffer ) {
00020         AFD_DbgPrint(MIN_TRACE,("Null Device\n"));
00021         return STATUS_NO_SUCH_DEVICE;
00022     }
00023     if( !FCB->LocalAddress ) {
00024         AFD_DbgPrint(MIN_TRACE,("No local address\n"));
00025         return STATUS_INVALID_PARAMETER;
00026     }
00027 
00028     Status = TdiOpenAddressFile(&FCB->TdiDeviceName,
00029                                 FCB->LocalAddress,
00030                                 &FCB->AddressFile.Handle,
00031                                 &FCB->AddressFile.Object );
00032     if (!NT_SUCCESS(Status))
00033         return Status;
00034 
00035     if (FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS)
00036     {
00037         if (!FCB->Recv.Size)
00038         {
00039             Status = TdiQueryMaxDatagramLength(FCB->AddressFile.Object,
00040                                                &FCB->Recv.Size);
00041         }
00042 
00043         if (NT_SUCCESS(Status) && !FCB->Recv.Window)
00044         {
00045             FCB->Recv.Window = ExAllocatePool(PagedPool, FCB->Recv.Size);
00046             if (!FCB->Recv.Window)
00047                 Status = STATUS_NO_MEMORY;
00048         }
00049 
00050         if (NT_SUCCESS(Status))
00051         {
00052             Status = TdiReceiveDatagram(&FCB->ReceiveIrp.InFlightRequest,
00053                                         FCB->AddressFile.Object,
00054                                         0,
00055                                         FCB->Recv.Window,
00056                                         FCB->Recv.Size,
00057                                         FCB->AddressFrom,
00058                                         &FCB->ReceiveIrp.Iosb,
00059                                         PacketSocketRecvComplete,
00060                                         FCB);
00061 
00062             /* We don't want to wait for this read to complete. */
00063             if( Status == STATUS_PENDING ) Status = STATUS_SUCCESS;
00064         }
00065     }
00066 
00067     AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
00068 
00069     return Status;
00070 }
00071 
00072 NTSTATUS NTAPI
00073 AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
00074               PIO_STACK_LOCATION IrpSp) {
00075     NTSTATUS Status = STATUS_SUCCESS;
00076     PFILE_OBJECT FileObject = IrpSp->FileObject;
00077     PAFD_FCB FCB = FileObject->FsContext;
00078     PAFD_BIND_DATA BindReq;
00079 
00080     AFD_DbgPrint(MID_TRACE,("Called\n"));
00081 
00082     if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
00083     if( !(BindReq = LockRequest( Irp, IrpSp )) )
00084         return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
00085                                        Irp, 0 );
00086 
00087     if( FCB->LocalAddress ) ExFreePool( FCB->LocalAddress );
00088     FCB->LocalAddress = TaCopyTransportAddress( &BindReq->Address );
00089 
00090     if( FCB->LocalAddress )
00091         Status = TdiBuildConnectionInfo( &FCB->AddressFrom,
00092                                          FCB->LocalAddress );
00093 
00094     if( NT_SUCCESS(Status) )
00095         Status = WarmSocketForBind( FCB );
00096     AFD_DbgPrint(MID_TRACE,("FCB->Flags %x\n", FCB->Flags));
00097 
00098     if (NT_SUCCESS(Status))
00099         FCB->State = SOCKET_STATE_BOUND;
00100 
00101     /* MSAFD relies on us returning the address file handle in the IOSB */
00102     return UnlockAndMaybeComplete( FCB, Status, Irp,
00103                                    (ULONG_PTR)FCB->AddressFile.Handle );
00104 }
00105 

Generated on Sun May 27 2012 04:27:04 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.