Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenbind.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
1.7.6.1
|