mirror of
https://github.com/reactos/reactos.git
synced 2025-04-25 08:00:24 +00:00
Formatting only, no change.
svn path=/trunk/; revision=40188
This commit is contained in:
parent
acc3c725d7
commit
d34ef92b8b
1 changed files with 242 additions and 243 deletions
|
@ -43,18 +43,18 @@ static VOID HandleEOFOnIrp( PAFD_FCB FCB, NTSTATUS Status, UINT Information ) {
|
|||
}
|
||||
|
||||
static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
|
||||
PAFD_RECV_INFO RecvReq,
|
||||
PUINT TotalBytesCopied ) {
|
||||
PAFD_RECV_INFO RecvReq,
|
||||
PUINT TotalBytesCopied ) {
|
||||
UINT i, BytesToCopy = 0,
|
||||
BytesAvailable =
|
||||
FCB->Recv.Content - FCB->Recv.BytesUsed;
|
||||
BytesAvailable =
|
||||
FCB->Recv.Content - FCB->Recv.BytesUsed;
|
||||
PAFD_MAPBUF Map;
|
||||
NTSTATUS Status;
|
||||
*TotalBytesCopied = 0;
|
||||
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Called, BytesAvailable = %d\n",
|
||||
BytesAvailable));
|
||||
BytesAvailable));
|
||||
|
||||
if( CantReadMore(FCB) ) return STATUS_SUCCESS;
|
||||
if( !BytesAvailable ) return STATUS_PENDING;
|
||||
|
@ -62,29 +62,29 @@ static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
|
|||
Map = (PAFD_MAPBUF)(RecvReq->BufferArray + RecvReq->BufferCount);
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Buffer Count: %d @ %x\n",
|
||||
RecvReq->BufferCount,
|
||||
RecvReq->BufferArray));
|
||||
RecvReq->BufferCount,
|
||||
RecvReq->BufferArray));
|
||||
for( i = 0;
|
||||
RecvReq->BufferArray &&
|
||||
BytesAvailable &&
|
||||
i < RecvReq->BufferCount;
|
||||
i++ ) {
|
||||
BytesToCopy =
|
||||
MIN( RecvReq->BufferArray[i].len, BytesAvailable );
|
||||
RecvReq->BufferArray &&
|
||||
BytesAvailable &&
|
||||
i < RecvReq->BufferCount;
|
||||
i++ ) {
|
||||
BytesToCopy =
|
||||
MIN( RecvReq->BufferArray[i].len, BytesAvailable );
|
||||
|
||||
if( Map[i].Mdl ) {
|
||||
Map[i].BufferAddress = MmMapLockedPages( Map[i].Mdl, KernelMode );
|
||||
if( Map[i].Mdl ) {
|
||||
Map[i].BufferAddress = MmMapLockedPages( Map[i].Mdl, KernelMode );
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Buffer %d: %x:%d\n",
|
||||
i,
|
||||
Map[i].BufferAddress,
|
||||
BytesToCopy));
|
||||
AFD_DbgPrint(MID_TRACE,("Buffer %d: %x:%d\n",
|
||||
i,
|
||||
Map[i].BufferAddress,
|
||||
BytesToCopy));
|
||||
|
||||
RtlCopyMemory( Map[i].BufferAddress,
|
||||
FCB->Recv.Window + FCB->Recv.BytesUsed,
|
||||
BytesToCopy );
|
||||
RtlCopyMemory( Map[i].BufferAddress,
|
||||
FCB->Recv.Window + FCB->Recv.BytesUsed,
|
||||
BytesToCopy );
|
||||
|
||||
MmUnmapLockedPages( Map[i].BufferAddress, Map[i].Mdl );
|
||||
MmUnmapLockedPages( Map[i].BufferAddress, Map[i].Mdl );
|
||||
|
||||
*TotalBytesCopied += BytesToCopy;
|
||||
|
||||
|
@ -92,31 +92,31 @@ static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
|
|||
FCB->Recv.BytesUsed += BytesToCopy;
|
||||
BytesAvailable -= BytesToCopy;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If there's nothing left in our buffer start a new request */
|
||||
if( FCB->Recv.BytesUsed == FCB->Recv.Content ) {
|
||||
FCB->Recv.BytesUsed = FCB->Recv.Content = 0;
|
||||
FCB->Recv.BytesUsed = FCB->Recv.Content = 0;
|
||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
|
||||
if( !FCB->ReceiveIrp.InFlightRequest ) {
|
||||
AFD_DbgPrint(MID_TRACE,("Replenishing buffer\n"));
|
||||
if( !FCB->ReceiveIrp.InFlightRequest ) {
|
||||
AFD_DbgPrint(MID_TRACE,("Replenishing buffer\n"));
|
||||
|
||||
Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
|
||||
FCB->Connection.Object,
|
||||
TDI_RECEIVE_NORMAL,
|
||||
FCB->Recv.Window,
|
||||
FCB->Recv.Size,
|
||||
&FCB->ReceiveIrp.Iosb,
|
||||
ReceiveComplete,
|
||||
FCB );
|
||||
Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
|
||||
FCB->Connection.Object,
|
||||
TDI_RECEIVE_NORMAL,
|
||||
FCB->Recv.Window,
|
||||
FCB->Recv.Size,
|
||||
&FCB->ReceiveIrp.Iosb,
|
||||
ReceiveComplete,
|
||||
FCB );
|
||||
|
||||
if( Status == STATUS_SUCCESS )
|
||||
FCB->Recv.Content = FCB->ReceiveIrp.Iosb.Information;
|
||||
HandleEOFOnIrp( FCB, Status, FCB->ReceiveIrp.Iosb.Information );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
|
@ -159,53 +159,53 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) {
|
|||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
}
|
||||
} else {
|
||||
/* Kick the user that receive would be possible now */
|
||||
/* XXX Not implemented yet */
|
||||
/* Kick the user that receive would be possible now */
|
||||
/* XXX Not implemented yet */
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("FCB %x Receive data waiting %d\n",
|
||||
FCB, FCB->Recv.Content));
|
||||
/*OskitDumpBuffer( FCB->Recv.Window, FCB->Recv.Content );*/
|
||||
AFD_DbgPrint(MID_TRACE,("FCB %x Receive data waiting %d\n",
|
||||
FCB, FCB->Recv.Content));
|
||||
/*OskitDumpBuffer( FCB->Recv.Window, FCB->Recv.Content );*/
|
||||
|
||||
/* Try to clear some requests */
|
||||
while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_RECV] ) ) {
|
||||
NextIrpEntry =
|
||||
RemoveHeadList(&FCB->PendingIrpList[FUNCTION_RECV]);
|
||||
NextIrp =
|
||||
CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
|
||||
NextIrpSp = IoGetCurrentIrpStackLocation( NextIrp );
|
||||
RecvReq = NextIrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||
/* Try to clear some requests */
|
||||
while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_RECV] ) ) {
|
||||
NextIrpEntry =
|
||||
RemoveHeadList(&FCB->PendingIrpList[FUNCTION_RECV]);
|
||||
NextIrp =
|
||||
CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
|
||||
NextIrpSp = IoGetCurrentIrpStackLocation( NextIrp );
|
||||
RecvReq = NextIrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("RecvReq @ %x\n", RecvReq));
|
||||
AFD_DbgPrint(MID_TRACE,("RecvReq @ %x\n", RecvReq));
|
||||
|
||||
Status = TryToSatisfyRecvRequestFromBuffer
|
||||
( FCB, RecvReq, &TotalBytesCopied );
|
||||
Status = TryToSatisfyRecvRequestFromBuffer
|
||||
( FCB, RecvReq, &TotalBytesCopied );
|
||||
|
||||
if( Status == STATUS_PENDING ) {
|
||||
AFD_DbgPrint(MID_TRACE,("Ran out of data for %x\n", NextIrp));
|
||||
InsertHeadList(&FCB->PendingIrpList[FUNCTION_RECV],
|
||||
&NextIrp->Tail.Overlay.ListEntry);
|
||||
break;
|
||||
} else {
|
||||
AFD_DbgPrint(MID_TRACE,("Completing recv %x (%d)\n", NextIrp,
|
||||
TotalBytesCopied));
|
||||
UnlockBuffers( RecvReq->BufferArray,
|
||||
RecvReq->BufferCount, FALSE );
|
||||
NextIrp->IoStatus.Status = Status;
|
||||
NextIrp->IoStatus.Information = TotalBytesCopied;
|
||||
if( NextIrp == Irp ) {
|
||||
RetStatus = Status;
|
||||
RetBytesCopied = TotalBytesCopied;
|
||||
if( Status == STATUS_PENDING ) {
|
||||
AFD_DbgPrint(MID_TRACE,("Ran out of data for %x\n", NextIrp));
|
||||
InsertHeadList(&FCB->PendingIrpList[FUNCTION_RECV],
|
||||
&NextIrp->Tail.Overlay.ListEntry);
|
||||
break;
|
||||
} else {
|
||||
AFD_DbgPrint(MID_TRACE,("Completing recv %x (%d)\n", NextIrp,
|
||||
TotalBytesCopied));
|
||||
UnlockBuffers( RecvReq->BufferArray,
|
||||
RecvReq->BufferCount, FALSE );
|
||||
NextIrp->IoStatus.Status = Status;
|
||||
NextIrp->IoStatus.Information = TotalBytesCopied;
|
||||
if( NextIrp == Irp ) {
|
||||
RetStatus = Status;
|
||||
RetBytesCopied = TotalBytesCopied;
|
||||
}
|
||||
if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
|
||||
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
||||
}
|
||||
}
|
||||
if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
|
||||
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( FCB->Recv.Content ) {
|
||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||
} else
|
||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
|
||||
|
@ -242,7 +242,7 @@ NTSTATUS NTAPI ReceiveComplete
|
|||
Irp->IoStatus.Status = STATUS_CANCELLED;
|
||||
Irp->IoStatus.Information = 0;
|
||||
SocketStateUnlock( FCB );
|
||||
return STATUS_CANCELLED;
|
||||
return STATUS_CANCELLED;
|
||||
}
|
||||
|
||||
FCB->Recv.Content = Irp->IoStatus.Information;
|
||||
|
@ -252,9 +252,9 @@ NTSTATUS NTAPI ReceiveComplete
|
|||
AFD_DbgPrint(MIN_TRACE,("!!! CLOSED SOCK GOT A RECEIVE COMPLETE !!!\n"));
|
||||
Irp->IoStatus.Status = STATUS_FILE_CLOSED;
|
||||
Irp->IoStatus.Information = 0;
|
||||
SocketStateUnlock( FCB );
|
||||
DestroySocket( FCB );
|
||||
return STATUS_FILE_CLOSED;
|
||||
SocketStateUnlock( FCB );
|
||||
DestroySocket( FCB );
|
||||
return STATUS_FILE_CLOSED;
|
||||
} else if( FCB->State == SOCKET_STATE_LISTENING ) {
|
||||
AFD_DbgPrint(MIN_TRACE,("!!! LISTENER GOT A RECEIVE COMPLETE !!!\n"));
|
||||
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
|
||||
|
@ -276,7 +276,7 @@ NTSTATUS NTAPI ReceiveComplete
|
|||
|
||||
NTSTATUS NTAPI
|
||||
AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||
PIO_STACK_LOCATION IrpSp, BOOLEAN Short) {
|
||||
PIO_STACK_LOCATION IrpSp, BOOLEAN Short) {
|
||||
NTSTATUS Status = STATUS_INVALID_PARAMETER;
|
||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||
PAFD_FCB FCB = FileObject->FsContext;
|
||||
|
@ -292,29 +292,29 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|||
AFD_DbgPrint(MID_TRACE,("Called recv on wrong kind of socket (s%x)\n",
|
||||
FCB->State));
|
||||
return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER,
|
||||
Irp, 0, NULL );
|
||||
Irp, 0, NULL );
|
||||
}
|
||||
|
||||
if( FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS )
|
||||
{
|
||||
AFD_DbgPrint(MID_TRACE,("Receive on connection-less sockets not implemented\n"));
|
||||
return UnlockAndMaybeComplete( FCB, STATUS_NOT_IMPLEMENTED,
|
||||
Irp, 0, NULL );
|
||||
AFD_DbgPrint(MID_TRACE,("Receive on connection-less sockets not implemented\n"));
|
||||
return UnlockAndMaybeComplete( FCB, STATUS_NOT_IMPLEMENTED,
|
||||
Irp, 0, NULL );
|
||||
}
|
||||
|
||||
FCB->EventsFired &= ~AFD_EVENT_RECEIVE;
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
|
||||
if( !(RecvReq = LockRequest( Irp, IrpSp )) )
|
||||
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
||||
Irp, 0, NULL );
|
||||
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
||||
Irp, 0, NULL );
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Recv flags %x\n", RecvReq->AfdFlags));
|
||||
|
||||
RecvReq->BufferArray = LockBuffers( RecvReq->BufferArray,
|
||||
RecvReq->BufferCount,
|
||||
NULL, NULL,
|
||||
TRUE, FALSE );
|
||||
RecvReq->BufferCount,
|
||||
NULL, NULL,
|
||||
TRUE, FALSE );
|
||||
|
||||
if( !RecvReq->BufferArray ) {
|
||||
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
|
||||
|
@ -353,79 +353,79 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|||
|
||||
static NTSTATUS NTAPI
|
||||
SatisfyPacketRecvRequest( PAFD_FCB FCB, PIRP Irp,
|
||||
PAFD_STORED_DATAGRAM DatagramRecv,
|
||||
PUINT TotalBytesCopied ) {
|
||||
PAFD_STORED_DATAGRAM DatagramRecv,
|
||||
PUINT TotalBytesCopied ) {
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( Irp );
|
||||
PAFD_RECV_INFO RecvReq =
|
||||
IrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||
IrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||
UINT BytesToCopy = 0, BytesAvailable = DatagramRecv->Len, AddrLen = 0;
|
||||
PAFD_MAPBUF Map;
|
||||
|
||||
Map = (PAFD_MAPBUF)(RecvReq->BufferArray +
|
||||
RecvReq->BufferCount +
|
||||
EXTRA_LOCK_BUFFERS);
|
||||
RecvReq->BufferCount +
|
||||
EXTRA_LOCK_BUFFERS);
|
||||
|
||||
BytesToCopy =
|
||||
MIN( RecvReq->BufferArray[0].len, BytesAvailable );
|
||||
MIN( RecvReq->BufferArray[0].len, BytesAvailable );
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("BytesToCopy: %d len %d\n", BytesToCopy,
|
||||
RecvReq->BufferArray[0].len));
|
||||
RecvReq->BufferArray[0].len));
|
||||
|
||||
if( Map[0].Mdl ) {
|
||||
/* Copy the address */
|
||||
if( Map[1].Mdl && Map[2].Mdl ) {
|
||||
AFD_DbgPrint(MID_TRACE,("Checking TAAddressCount\n"));
|
||||
/* Copy the address */
|
||||
if( Map[1].Mdl && Map[2].Mdl ) {
|
||||
AFD_DbgPrint(MID_TRACE,("Checking TAAddressCount\n"));
|
||||
|
||||
if( DatagramRecv->Address->TAAddressCount != 1 ) {
|
||||
AFD_DbgPrint
|
||||
(MID_TRACE,
|
||||
("Wierd address count %d\n",
|
||||
DatagramRecv->Address->TAAddressCount));
|
||||
}
|
||||
if( DatagramRecv->Address->TAAddressCount != 1 ) {
|
||||
AFD_DbgPrint
|
||||
(MID_TRACE,
|
||||
("Wierd address count %d\n",
|
||||
DatagramRecv->Address->TAAddressCount));
|
||||
}
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Computing addr len\n"));
|
||||
AFD_DbgPrint(MID_TRACE,("Computing addr len\n"));
|
||||
|
||||
AddrLen = MIN(DatagramRecv->Address->Address->AddressLength +
|
||||
sizeof(USHORT),
|
||||
RecvReq->BufferArray[1].len);
|
||||
AddrLen = MIN(DatagramRecv->Address->Address->AddressLength +
|
||||
sizeof(USHORT),
|
||||
RecvReq->BufferArray[1].len);
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Copying %d bytes of address\n", AddrLen));
|
||||
AFD_DbgPrint(MID_TRACE,("Copying %d bytes of address\n", AddrLen));
|
||||
|
||||
Map[1].BufferAddress = MmMapLockedPages( Map[1].Mdl, KernelMode );
|
||||
Map[1].BufferAddress = MmMapLockedPages( Map[1].Mdl, KernelMode );
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Done mapping, copying address\n"));
|
||||
AFD_DbgPrint(MID_TRACE,("Done mapping, copying address\n"));
|
||||
|
||||
RtlCopyMemory( Map[1].BufferAddress,
|
||||
&DatagramRecv->Address->Address->AddressType,
|
||||
AddrLen );
|
||||
RtlCopyMemory( Map[1].BufferAddress,
|
||||
&DatagramRecv->Address->Address->AddressType,
|
||||
AddrLen );
|
||||
|
||||
MmUnmapLockedPages( Map[1].BufferAddress, Map[1].Mdl );
|
||||
MmUnmapLockedPages( Map[1].BufferAddress, Map[1].Mdl );
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Copying address len\n"));
|
||||
AFD_DbgPrint(MID_TRACE,("Copying address len\n"));
|
||||
|
||||
Map[2].BufferAddress = MmMapLockedPages( Map[2].Mdl, KernelMode );
|
||||
*((PINT)Map[2].BufferAddress) = AddrLen;
|
||||
MmUnmapLockedPages( Map[2].BufferAddress, Map[2].Mdl );
|
||||
}
|
||||
Map[2].BufferAddress = MmMapLockedPages( Map[2].Mdl, KernelMode );
|
||||
*((PINT)Map[2].BufferAddress) = AddrLen;
|
||||
MmUnmapLockedPages( Map[2].BufferAddress, Map[2].Mdl );
|
||||
}
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Mapping data buffer pages\n"));
|
||||
AFD_DbgPrint(MID_TRACE,("Mapping data buffer pages\n"));
|
||||
|
||||
Map[0].BufferAddress = MmMapLockedPages( Map[0].Mdl, KernelMode );
|
||||
Map[0].BufferAddress = MmMapLockedPages( Map[0].Mdl, KernelMode );
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Buffer %d: %x:%d\n",
|
||||
0,
|
||||
Map[0].BufferAddress,
|
||||
BytesToCopy));
|
||||
AFD_DbgPrint(MID_TRACE,("Buffer %d: %x:%d\n",
|
||||
0,
|
||||
Map[0].BufferAddress,
|
||||
BytesToCopy));
|
||||
|
||||
/* OskitDumpBuffer
|
||||
( FCB->Recv.Window + FCB->Recv.BytesUsed, BytesToCopy ); */
|
||||
/* OskitDumpBuffer
|
||||
( FCB->Recv.Window + FCB->Recv.BytesUsed, BytesToCopy ); */
|
||||
|
||||
RtlCopyMemory( Map[0].BufferAddress,
|
||||
FCB->Recv.Window + FCB->Recv.BytesUsed,
|
||||
BytesToCopy );
|
||||
RtlCopyMemory( Map[0].BufferAddress,
|
||||
FCB->Recv.Window + FCB->Recv.BytesUsed,
|
||||
BytesToCopy );
|
||||
|
||||
MmUnmapLockedPages( Map[0].BufferAddress, Map[0].Mdl );
|
||||
MmUnmapLockedPages( Map[0].BufferAddress, Map[0].Mdl );
|
||||
|
||||
*TotalBytesCopied = BytesToCopy;
|
||||
|
||||
|
@ -446,9 +446,9 @@ SatisfyPacketRecvRequest( PAFD_FCB FCB, PIRP Irp,
|
|||
|
||||
NTSTATUS NTAPI
|
||||
PacketSocketRecvComplete(
|
||||
PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp,
|
||||
PVOID Context ) {
|
||||
PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp,
|
||||
PVOID Context ) {
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
PAFD_FCB FCB = Context;
|
||||
PIRP NextIrp;
|
||||
|
@ -468,105 +468,104 @@ PacketSocketRecvComplete(
|
|||
|
||||
FCB->ReceiveIrp.InFlightRequest = NULL;
|
||||
|
||||
if( Irp->Cancel ) {
|
||||
if( Irp->IoStatus.Status == STATUS_CANCELLED ) {
|
||||
Irp->IoStatus.Status = STATUS_CANCELLED;
|
||||
Irp->IoStatus.Information = 0;
|
||||
SocketStateUnlock( FCB );
|
||||
return STATUS_CANCELLED;
|
||||
return STATUS_CANCELLED;
|
||||
}
|
||||
|
||||
if( FCB->State == SOCKET_STATE_CLOSED ) {
|
||||
Irp->IoStatus.Status = STATUS_FILE_CLOSED;
|
||||
Irp->IoStatus.Information = 0;
|
||||
SocketStateUnlock( FCB );
|
||||
DestroySocket( FCB );
|
||||
return STATUS_FILE_CLOSED;
|
||||
SocketStateUnlock( FCB );
|
||||
DestroySocket( FCB );
|
||||
return STATUS_FILE_CLOSED;
|
||||
}
|
||||
|
||||
DatagramRecv = ExAllocatePool( NonPagedPool, DGSize );
|
||||
|
||||
if( DatagramRecv ) {
|
||||
DatagramRecv->Len = Irp->IoStatus.Information;
|
||||
RtlCopyMemory( DatagramRecv->Buffer, FCB->Recv.Window,
|
||||
DatagramRecv->Len );
|
||||
AFD_DbgPrint(MID_TRACE,("Received (A %x)\n",
|
||||
FCB->AddressFrom->RemoteAddress));
|
||||
DatagramRecv->Address =
|
||||
TaCopyTransportAddress( FCB->AddressFrom->RemoteAddress );
|
||||
DatagramRecv->Len = Irp->IoStatus.Information;
|
||||
RtlCopyMemory( DatagramRecv->Buffer, FCB->Recv.Window,
|
||||
DatagramRecv->Len );
|
||||
AFD_DbgPrint(MID_TRACE,("Received (A %x)\n",
|
||||
FCB->AddressFrom->RemoteAddress));
|
||||
DatagramRecv->Address =
|
||||
TaCopyTransportAddress( FCB->AddressFrom->RemoteAddress );
|
||||
|
||||
if( !DatagramRecv->Address ) Status = STATUS_NO_MEMORY;
|
||||
if( !DatagramRecv->Address ) Status = STATUS_NO_MEMORY;
|
||||
|
||||
} else Status = STATUS_NO_MEMORY;
|
||||
|
||||
if( !NT_SUCCESS( Status ) ) {
|
||||
Irp->IoStatus.Status = Status;
|
||||
Irp->IoStatus.Information = 0;
|
||||
if( DatagramRecv ) ExFreePool( DatagramRecv );
|
||||
SocketStateUnlock( FCB );
|
||||
return Status;
|
||||
if( DatagramRecv ) ExFreePool( DatagramRecv );
|
||||
SocketStateUnlock( FCB );
|
||||
return Status;
|
||||
} else {
|
||||
InsertTailList( &FCB->DatagramList, &DatagramRecv->ListEntry );
|
||||
InsertTailList( &FCB->DatagramList, &DatagramRecv->ListEntry );
|
||||
}
|
||||
|
||||
/* Satisfy as many requests as we can */
|
||||
|
||||
while( !IsListEmpty( &FCB->DatagramList ) &&
|
||||
!IsListEmpty( &FCB->PendingIrpList[FUNCTION_RECV] ) ) {
|
||||
AFD_DbgPrint(MID_TRACE,("Looping trying to satisfy request\n"));
|
||||
ListEntry = RemoveHeadList( &FCB->DatagramList );
|
||||
DatagramRecv = CONTAINING_RECORD( ListEntry, AFD_STORED_DATAGRAM,
|
||||
ListEntry );
|
||||
ListEntry = RemoveHeadList( &FCB->PendingIrpList[FUNCTION_RECV] );
|
||||
NextIrp = CONTAINING_RECORD( ListEntry, IRP, Tail.Overlay.ListEntry );
|
||||
NextIrpSp = IoGetCurrentIrpStackLocation( NextIrp );
|
||||
RecvReq = NextIrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||
!IsListEmpty( &FCB->PendingIrpList[FUNCTION_RECV] ) ) {
|
||||
AFD_DbgPrint(MID_TRACE,("Looping trying to satisfy request\n"));
|
||||
ListEntry = RemoveHeadList( &FCB->DatagramList );
|
||||
DatagramRecv = CONTAINING_RECORD( ListEntry, AFD_STORED_DATAGRAM,
|
||||
ListEntry );
|
||||
ListEntry = RemoveHeadList( &FCB->PendingIrpList[FUNCTION_RECV] );
|
||||
NextIrp = CONTAINING_RECORD( ListEntry, IRP, Tail.Overlay.ListEntry );
|
||||
NextIrpSp = IoGetCurrentIrpStackLocation( NextIrp );
|
||||
RecvReq = NextIrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("RecvReq: %x, DatagramRecv: %x\n",
|
||||
RecvReq, DatagramRecv));
|
||||
AFD_DbgPrint(MID_TRACE,("RecvReq: %x, DatagramRecv: %x\n",
|
||||
RecvReq, DatagramRecv));
|
||||
|
||||
if( DatagramRecv->Len > RecvReq->BufferArray[0].len &&
|
||||
!(RecvReq->TdiFlags & TDI_RECEIVE_PARTIAL) ) {
|
||||
InsertHeadList( &FCB->DatagramList,
|
||||
&DatagramRecv->ListEntry );
|
||||
Status = NextIrp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
|
||||
NextIrp->IoStatus.Information = DatagramRecv->Len;
|
||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||
if( DatagramRecv->Len > RecvReq->BufferArray[0].len &&
|
||||
!(RecvReq->TdiFlags & TDI_RECEIVE_PARTIAL) ) {
|
||||
InsertHeadList( &FCB->DatagramList,
|
||||
&DatagramRecv->ListEntry );
|
||||
Status = NextIrp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
|
||||
NextIrp->IoStatus.Information = DatagramRecv->Len;
|
||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||
if ( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
|
||||
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
||||
} else {
|
||||
AFD_DbgPrint(MID_TRACE,("Satisfying\n"));
|
||||
Status = SatisfyPacketRecvRequest
|
||||
( FCB, NextIrp, DatagramRecv,
|
||||
(PUINT)&NextIrp->IoStatus.Information );
|
||||
AFD_DbgPrint(MID_TRACE,("Unlocking\n"));
|
||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
||||
} else {
|
||||
AFD_DbgPrint(MID_TRACE,("Satisfying\n"));
|
||||
Status = SatisfyPacketRecvRequest
|
||||
( FCB, NextIrp, DatagramRecv,
|
||||
(PUINT)&NextIrp->IoStatus.Information );
|
||||
AFD_DbgPrint(MID_TRACE,("Unlocking\n"));
|
||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||
if ( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
|
||||
AFD_DbgPrint(MID_TRACE,("Completing\n"));
|
||||
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
||||
}
|
||||
AFD_DbgPrint(MID_TRACE,("Completing\n"));
|
||||
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
||||
}
|
||||
}
|
||||
|
||||
if( !IsListEmpty( &FCB->DatagramList ) ) {
|
||||
AFD_DbgPrint(MID_TRACE,("Signalling\n"));
|
||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||
AFD_DbgPrint(MID_TRACE,("Signalling\n"));
|
||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||
} else
|
||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
|
||||
if( NT_SUCCESS(Irp->IoStatus.Status) ) {
|
||||
|
||||
/* Now relaunch the datagram request */
|
||||
Status = TdiReceiveDatagram
|
||||
( &FCB->ReceiveIrp.InFlightRequest,
|
||||
FCB->AddressFile.Object,
|
||||
0,
|
||||
FCB->Recv.Window,
|
||||
FCB->Recv.Size,
|
||||
FCB->AddressFrom,
|
||||
&FCB->ReceiveIrp.Iosb,
|
||||
PacketSocketRecvComplete,
|
||||
FCB );
|
||||
/* Now relaunch the datagram request */
|
||||
Status = TdiReceiveDatagram
|
||||
( &FCB->ReceiveIrp.InFlightRequest,
|
||||
FCB->AddressFile.Object,
|
||||
0,
|
||||
FCB->Recv.Window,
|
||||
FCB->Recv.Size,
|
||||
FCB->AddressFrom,
|
||||
&FCB->ReceiveIrp.Iosb,
|
||||
PacketSocketRecvComplete,
|
||||
FCB );
|
||||
}
|
||||
|
||||
SocketStateUnlock( FCB );
|
||||
|
@ -576,7 +575,7 @@ PacketSocketRecvComplete(
|
|||
|
||||
NTSTATUS NTAPI
|
||||
AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||
PIO_STACK_LOCATION IrpSp ) {
|
||||
PIO_STACK_LOCATION IrpSp ) {
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||
PAFD_FCB FCB = FileObject->FsContext;
|
||||
|
@ -592,72 +591,72 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|||
|
||||
/* Check that the socket is bound */
|
||||
if( FCB->State != SOCKET_STATE_BOUND )
|
||||
return UnlockAndMaybeComplete
|
||||
( FCB, STATUS_INVALID_PARAMETER, Irp, 0, NULL );
|
||||
return UnlockAndMaybeComplete
|
||||
( FCB, STATUS_INVALID_PARAMETER, Irp, 0, NULL );
|
||||
if( !(RecvReq = LockRequest( Irp, IrpSp )) )
|
||||
return UnlockAndMaybeComplete
|
||||
( FCB, STATUS_NO_MEMORY, Irp, 0, NULL );
|
||||
return UnlockAndMaybeComplete
|
||||
( FCB, STATUS_NO_MEMORY, Irp, 0, NULL );
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Recv flags %x\n", RecvReq->AfdFlags));
|
||||
|
||||
RecvReq->BufferArray = LockBuffers( RecvReq->BufferArray,
|
||||
RecvReq->BufferCount,
|
||||
RecvReq->Address,
|
||||
RecvReq->AddressLength,
|
||||
TRUE, TRUE );
|
||||
RecvReq->BufferCount,
|
||||
RecvReq->Address,
|
||||
RecvReq->AddressLength,
|
||||
TRUE, TRUE );
|
||||
|
||||
if( !RecvReq->BufferArray ) { /* access violation in userspace */
|
||||
return UnlockAndMaybeComplete
|
||||
( FCB, STATUS_ACCESS_VIOLATION, Irp, 0, NULL );
|
||||
( FCB, STATUS_ACCESS_VIOLATION, Irp, 0, NULL );
|
||||
}
|
||||
|
||||
if( !IsListEmpty( &FCB->DatagramList ) ) {
|
||||
ListEntry = RemoveHeadList( &FCB->DatagramList );
|
||||
DatagramRecv = CONTAINING_RECORD
|
||||
( ListEntry, AFD_STORED_DATAGRAM, ListEntry );
|
||||
if( DatagramRecv->Len > RecvReq->BufferArray[0].len &&
|
||||
!(RecvReq->TdiFlags & TDI_RECEIVE_PARTIAL) ) {
|
||||
InsertHeadList( &FCB->DatagramList,
|
||||
&DatagramRecv->ListEntry );
|
||||
Status = Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
|
||||
Irp->IoStatus.Information = DatagramRecv->Len;
|
||||
ListEntry = RemoveHeadList( &FCB->DatagramList );
|
||||
DatagramRecv = CONTAINING_RECORD
|
||||
( ListEntry, AFD_STORED_DATAGRAM, ListEntry );
|
||||
if( DatagramRecv->Len > RecvReq->BufferArray[0].len &&
|
||||
!(RecvReq->TdiFlags & TDI_RECEIVE_PARTIAL) ) {
|
||||
InsertHeadList( &FCB->DatagramList,
|
||||
&DatagramRecv->ListEntry );
|
||||
Status = Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
|
||||
Irp->IoStatus.Information = DatagramRecv->Len;
|
||||
|
||||
if( IsListEmpty( &FCB->DatagramList ) )
|
||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||
else
|
||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||
if( IsListEmpty( &FCB->DatagramList ) )
|
||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||
else
|
||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
|
||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||
|
||||
return UnlockAndMaybeComplete
|
||||
( FCB, Status, Irp, Irp->IoStatus.Information, NULL );
|
||||
} else {
|
||||
Status = SatisfyPacketRecvRequest
|
||||
( FCB, Irp, DatagramRecv,
|
||||
(PUINT)&Irp->IoStatus.Information );
|
||||
return UnlockAndMaybeComplete
|
||||
( FCB, Status, Irp, Irp->IoStatus.Information, NULL );
|
||||
} else {
|
||||
Status = SatisfyPacketRecvRequest
|
||||
( FCB, Irp, DatagramRecv,
|
||||
(PUINT)&Irp->IoStatus.Information );
|
||||
|
||||
if( IsListEmpty( &FCB->DatagramList ) )
|
||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||
else
|
||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||
if( IsListEmpty( &FCB->DatagramList ) )
|
||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||
else
|
||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
|
||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||
|
||||
return UnlockAndMaybeComplete
|
||||
( FCB, Status, Irp, Irp->IoStatus.Information, NULL );
|
||||
}
|
||||
return UnlockAndMaybeComplete
|
||||
( FCB, Status, Irp, Irp->IoStatus.Information, NULL );
|
||||
}
|
||||
} else if( RecvReq->AfdFlags & AFD_IMMEDIATE ) {
|
||||
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
||||
Status = STATUS_CANT_WAIT;
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||
return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL );
|
||||
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
||||
Status = STATUS_CANT_WAIT;
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||
return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL );
|
||||
} else {
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_RECV );
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_RECV );
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue