2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/net/afd/afd/bind.c
5 * PURPOSE: Ancillary functions driver
6 * PROGRAMMER: Art Yerkes (ayerkes@speakeasy.net)
13 NTSTATUS
WarmSocketForBind( PAFD_FCB FCB
, ULONG ShareType
) {
16 AFD_DbgPrint(MID_TRACE
,("Called (AF %d)\n",
17 FCB
->LocalAddress
->Address
[0].AddressType
));
19 if( !FCB
->TdiDeviceName
.Length
|| !FCB
->TdiDeviceName
.Buffer
) {
20 AFD_DbgPrint(MIN_TRACE
,("Null Device\n"));
21 return STATUS_NO_SUCH_DEVICE
;
23 if( !FCB
->LocalAddress
) {
24 AFD_DbgPrint(MIN_TRACE
,("No local address\n"));
25 return STATUS_INVALID_PARAMETER
;
28 Status
= TdiOpenAddressFile(&FCB
->TdiDeviceName
,
31 &FCB
->AddressFile
.Handle
,
32 &FCB
->AddressFile
.Object
);
33 if (!NT_SUCCESS(Status
))
36 if (FCB
->Flags
& AFD_ENDPOINT_CONNECTIONLESS
)
40 Status
= TdiQueryMaxDatagramLength(FCB
->AddressFile
.Object
,
44 if (NT_SUCCESS(Status
) && !FCB
->Recv
.Window
)
46 FCB
->Recv
.Window
= ExAllocatePool(PagedPool
, FCB
->Recv
.Size
);
47 if (!FCB
->Recv
.Window
)
48 Status
= STATUS_NO_MEMORY
;
51 if (NT_SUCCESS(Status
))
53 Status
= TdiReceiveDatagram(&FCB
->ReceiveIrp
.InFlightRequest
,
54 FCB
->AddressFile
.Object
,
59 &FCB
->ReceiveIrp
.Iosb
,
60 PacketSocketRecvComplete
,
63 /* We don't want to wait for this read to complete. */
64 if( Status
== STATUS_PENDING
) Status
= STATUS_SUCCESS
;
68 AFD_DbgPrint(MID_TRACE
,("Returning %x\n", Status
));
74 AfdBindSocket(PDEVICE_OBJECT DeviceObject
, PIRP Irp
,
75 PIO_STACK_LOCATION IrpSp
) {
76 NTSTATUS Status
= STATUS_SUCCESS
;
77 PFILE_OBJECT FileObject
= IrpSp
->FileObject
;
78 PAFD_FCB FCB
= FileObject
->FsContext
;
79 PAFD_BIND_DATA BindReq
;
81 AFD_DbgPrint(MID_TRACE
,("Called\n"));
83 if( !SocketAcquireStateLock( FCB
) ) return LostSocket( Irp
);
84 if( !(BindReq
= LockRequest( Irp
, IrpSp
, FALSE
, NULL
)) )
85 return UnlockAndMaybeComplete( FCB
, STATUS_NO_MEMORY
,
88 if( FCB
->LocalAddress
) ExFreePool( FCB
->LocalAddress
);
89 FCB
->LocalAddress
= TaCopyTransportAddress( &BindReq
->Address
);
91 if( FCB
->LocalAddress
)
92 Status
= TdiBuildConnectionInfo( &FCB
->AddressFrom
,
95 if( NT_SUCCESS(Status
) )
96 Status
= WarmSocketForBind( FCB
, BindReq
->ShareType
);
97 AFD_DbgPrint(MID_TRACE
,("FCB->Flags %x\n", FCB
->Flags
));
99 if (NT_SUCCESS(Status
))
100 FCB
->State
= SOCKET_STATE_BOUND
;
102 /* MSAFD relies on us returning the address file handle in the IOSB */
103 return UnlockAndMaybeComplete( FCB
, Status
, Irp
,
104 (ULONG_PTR
)FCB
->AddressFile
.Handle
);