- Add support for AFD_INFO_INLINING_MODE
- Add support for setting AFD_INFO_RECEIVE_WINDOW_SIZE and AFD_INFO_SEND_WINDOW_SIZE
- None of this is used by our current msafd but mswsock_new uses it

svn path=/trunk/; revision=52538
This commit is contained in:
Cameron Gutman 2011-07-04 18:07:55 +00:00
parent 0e8f87ff82
commit 54f9acbf0d
3 changed files with 84 additions and 17 deletions

View file

@ -223,26 +223,33 @@ NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ) {
ASSERT(!FCB->Recv.Window);
ASSERT(!FCB->Send.Window);
Status = TdiQueryMaxDatagramLength(FCB->Connection.Object,
&FCB->Send.Size);
if (!NT_SUCCESS(Status))
return Status;
if (!FCB->Recv.Size)
{
Status = TdiQueryMaxDatagramLength(FCB->Connection.Object,
&FCB->Recv.Size);
if (!NT_SUCCESS(Status))
return Status;
}
FCB->Recv.Size = FCB->Send.Size;
if (!FCB->Send.Size)
{
Status = TdiQueryMaxDatagramLength(FCB->Connection.Object,
&FCB->Send.Size);
if (!NT_SUCCESS(Status))
return Status;
}
/* Allocate the receive area and start receiving */
FCB->Recv.Window =
ExAllocatePool( PagedPool, FCB->Recv.Size );
if (!FCB->Recv.Window)
{
FCB->Recv.Window = ExAllocatePool( PagedPool, FCB->Recv.Size );
if( !FCB->Recv.Window ) return STATUS_NO_MEMORY;
}
if( !FCB->Recv.Window ) return STATUS_NO_MEMORY;
FCB->Send.Window =
ExAllocatePool( PagedPool, FCB->Send.Size );
if( !FCB->Send.Window ) {
ExFreePool( FCB->Recv.Window );
FCB->Recv.Window = NULL;
return STATUS_NO_MEMORY;
if (!FCB->Send.Window)
{
FCB->Send.Window = ExAllocatePool( PagedPool, FCB->Send.Size );
if( !FCB->Send.Window ) return STATUS_NO_MEMORY;
}
FCB->State = SOCKET_STATE_CONNECTED;

View file

@ -50,6 +50,10 @@ AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
case AFD_INFO_BLOCKING_MODE:
InfoReq->Information.Boolean = FCB->NonBlocking;
break;
case AFD_INFO_INLINING_MODE:
InfoReq->Information.Boolean = FCB->OobInline;
break;
case AFD_INFO_RECEIVE_CONTENT_SIZE:
/* Only touch InfoReq if a socket has been set up.
@ -106,6 +110,7 @@ AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PAFD_INFO InfoReq = LockRequest(Irp, IrpSp);
PFILE_OBJECT FileObject = IrpSp->FileObject;
PAFD_FCB FCB = FileObject->FsContext;
PCHAR NewBuffer;
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
@ -118,6 +123,61 @@ AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
AFD_DbgPrint(MID_TRACE,("Blocking mode set to %d\n", InfoReq->Information.Boolean));
FCB->NonBlocking = InfoReq->Information.Boolean;
break;
case AFD_INFO_INLINING_MODE:
FCB->OobInline = InfoReq->Information.Boolean;
break;
case AFD_INFO_RECEIVE_WINDOW_SIZE:
NewBuffer = ExAllocatePool(PagedPool, InfoReq->Information.Ulong);
if (NewBuffer)
{
if (FCB->Recv.Content > InfoReq->Information.Ulong)
FCB->Recv.Content = InfoReq->Information.Ulong;
if (FCB->Recv.Window)
{
RtlCopyMemory(NewBuffer,
FCB->Recv.Window,
FCB->Recv.Content);
ExFreePool(FCB->Recv.Window);
}
FCB->Recv.Size = InfoReq->Information.Ulong;
FCB->Recv.Window = NewBuffer;
Status = STATUS_SUCCESS;
}
else
{
Status = STATUS_NO_MEMORY;
}
break;
case AFD_INFO_SEND_WINDOW_SIZE:
NewBuffer = ExAllocatePool(PagedPool, InfoReq->Information.Ulong);
if (NewBuffer)
{
if (FCB->Send.BytesUsed > InfoReq->Information.Ulong)
FCB->Send.BytesUsed = InfoReq->Information.Ulong;
if (FCB->Send.Window)
{
RtlCopyMemory(NewBuffer,
FCB->Send.Window,
FCB->Send.BytesUsed);
ExFreePool(FCB->Send.Window);
}
FCB->Send.Size = InfoReq->Information.Ulong;
FCB->Send.Window = NewBuffer;
Status = STATUS_SUCCESS;
}
else
{
Status = STATUS_NO_MEMORY;
}
break;
default:
AFD_DbgPrint(MIN_TRACE,("Unknown request %d\n", InfoReq->InformationClass));
break;

View file

@ -173,7 +173,7 @@ typedef struct _AFD_STORED_DATAGRAM {
} AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
typedef struct _AFD_FCB {
BOOLEAN Locked, Critical, Overread, NonBlocking;
BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline;
UINT State, Flags, GroupID, GroupType;
KIRQL OldIrql;
UINT LockCount;