Author: arty
Date: Wed Aug 20 22:38:49 2008
New Revision: 35499
URL:
http://svn.reactos.org/svn/reactos?rev=35499&view=rev
Log:
Merge aicom-network-fixes up to 35486
Modified:
trunk/reactos/drivers/network/afd/afd/info.c
trunk/reactos/drivers/network/afd/afd/listen.c
trunk/reactos/drivers/network/afd/afd/lock.c
trunk/reactos/drivers/network/afd/afd/main.c
trunk/reactos/drivers/network/afd/afd/read.c
trunk/reactos/drivers/network/afd/afd/write.c
trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c
trunk/reactos/drivers/network/tcpip/tcpip/main.c
Modified: trunk/reactos/drivers/network/afd/afd/info.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/in…
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] Wed Aug 20 22:38:49 2008
@@ -135,22 +135,21 @@
if( NT_SUCCESS(Status) ) {
Status = TdiQueryInformation
- ( FCB->AddressFile.Object,
+ ( FCB->Connection.Object,
TDI_QUERY_CONNECTION_INFO,
SysMdl );
}
if( NT_SUCCESS(Status) ) {
TransAddr =
- (PTRANSPORT_ADDRESS)MmMapLockedPages
- ( Mdl, IoModifyAccess );
- }
+ (PTRANSPORT_ADDRESS)MmGetSystemAddressForMdlSafe( Mdl,
NormalPagePriority );
- if( TransAddr )
- RtlCopyMemory( TransAddr, ConnInfo->RemoteAddress,
- TaLengthOfTransportAddress
- ( ConnInfo->RemoteAddress ) );
- else Status = STATUS_INSUFFICIENT_RESOURCES;
+ if( TransAddr )
+ RtlCopyMemory( TransAddr, ConnInfo->RemoteAddress,
+ TaLengthOfTransportAddress
+ ( ConnInfo->RemoteAddress ) );
+ else Status = STATUS_INSUFFICIENT_RESOURCES;
+ }
if( ConnInfo ) ExFreePool( ConnInfo );
if( SysMdl ) IoFreeMdl( SysMdl );
Modified: trunk/reactos/drivers/network/afd/afd/listen.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/li…
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/listen.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/listen.c [iso-8859-1] Wed Aug 20 22:38:49 2008
@@ -87,14 +87,14 @@
PAFD_FCB FCB = (PAFD_FCB)Context;
PAFD_TDI_OBJECT_QELT Qelt;
+ if( Irp->Cancel ) {
+ if( FCB ) FCB->ListenIrp.InFlightRequest = NULL;
+ return STATUS_CANCELLED;
+ }
+
if( !SocketAcquireStateLock( FCB ) ) return Status;
FCB->ListenIrp.InFlightRequest = NULL;
-
- if( Irp->Cancel ) {
- SocketStateUnlock( FCB );
- return STATUS_SUCCESS;
- }
if( FCB->State == SOCKET_STATE_CLOSED ) {
SocketStateUnlock( FCB );
Modified: trunk/reactos/drivers/network/afd/afd/lock.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/lo…
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/lock.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/lock.c [iso-8859-1] Wed Aug 20 22:38:49 2008
@@ -15,6 +15,8 @@
/* Lock a method_neither request so it'll be available from DISPATCH_LEVEL */
PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ) {
+ BOOLEAN LockFailed = FALSE;
+
Irp->MdlAddress =
IoAllocateMdl( IrpSp->Parameters.DeviceIoControl.Type3InputBuffer,
IrpSp->Parameters.DeviceIoControl.InputBufferLength,
@@ -22,14 +24,34 @@
FALSE,
NULL );
if( Irp->MdlAddress ) {
- MmProbeAndLockPages( Irp->MdlAddress, KernelMode, IoModifyAccess );
+ _SEH_TRY {
+ MmProbeAndLockPages( Irp->MdlAddress, KernelMode, IoModifyAccess );
+ } _SEH_HANDLE {
+ LockFailed = TRUE;
+ } _SEH_END;
+
+ if( LockFailed ) {
+ IoFreeMdl( Irp->MdlAddress );
+ Irp->MdlAddress = NULL;
+ return NULL;
+ }
+
IrpSp->Parameters.DeviceIoControl.Type3InputBuffer =
MmMapLockedPages( Irp->MdlAddress, KernelMode );
+
+ if( !IrpSp->Parameters.DeviceIoControl.Type3InputBuffer ) {
+ IoFreeMdl( Irp->MdlAddress );
+ Irp->MdlAddress = NULL;
+ return NULL;
+ }
+
return IrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
} else return NULL;
}
VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ) {
+ if( !IrpSp->Parameters.DeviceIoControl.Type3InputBuffer || !Irp->MdlAddress )
return;
+
MmUnmapLockedPages( IrpSp->Parameters.DeviceIoControl.Type3InputBuffer,
Irp->MdlAddress );
MmUnlockPages( Irp->MdlAddress );
Modified: trunk/reactos/drivers/network/afd/afd/main.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/ma…
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/main.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/main.c [iso-8859-1] Wed Aug 20 22:38:49 2008
@@ -190,9 +190,7 @@
if( InFlightRequest[i]->InFlightRequest ) {
AFD_DbgPrint(MID_TRACE,("Cancelling in flight irp %d (%x)\n",
i, InFlightRequest[i]->InFlightRequest));
- InFlightRequest[i]->InFlightRequest->IoStatus.Status = STATUS_CANCELLED;
- InFlightRequest[i]->InFlightRequest->IoStatus.Information = 0;
- IoCancelIrp( InFlightRequest[i]->InFlightRequest );
+ InFlightRequest[i]->InFlightRequest = NULL;
}
}
Modified: trunk/reactos/drivers/network/afd/afd/read.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/re…
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] Wed Aug 20 22:38:49 2008
@@ -233,6 +233,11 @@
ASSERT_IRQL(APC_LEVEL);
+ if( Irp->Cancel ) {
+ if( FCB ) FCB->ReceiveIrp.InFlightRequest = NULL;
+ return STATUS_CANCELLED;
+ }
+
if( !SocketAcquireStateLock( FCB ) ) return Status;
FCB->ReceiveIrp.InFlightRequest = NULL;
@@ -448,6 +453,11 @@
UINT DGSize = Irp->IoStatus.Information + sizeof( AFD_STORED_DATAGRAM );
AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
+
+ if( Irp->Cancel ) {
+ if( FCB ) FCB->ReceiveIrp.InFlightRequest = NULL;
+ return STATUS_CANCELLED;
+ }
if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED;
Modified: trunk/reactos/drivers/network/afd/afd/write.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/wr…
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/write.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/write.c [iso-8859-1] Wed Aug 20 22:38:49 2008
@@ -40,6 +40,11 @@
ASSERT_IRQL(APC_LEVEL);
+ if( Irp->Cancel ) {
+ if( FCB ) FCB->SendIrp.InFlightRequest = NULL;
+ return STATUS_CANCELLED;
+ }
+
if( !SocketAcquireStateLock( FCB ) ) return Status;
FCB->SendIrp.InFlightRequest = NULL;
@@ -170,6 +175,11 @@
Irp->IoStatus.Status,
Irp->IoStatus.Information));
+ if( Irp->Cancel ) {
+ if( FCB ) FCB->SendIrp.InFlightRequest = NULL;
+ return STATUS_CANCELLED;
+ }
+
/* It's ok if the FCB already died */
if( !SocketAcquireStateLock( FCB ) ) return STATUS_SUCCESS;
@@ -264,30 +274,28 @@
return UnlockAndMaybeComplete
( FCB, STATUS_NO_MEMORY, Irp, TotalBytesCopied, NULL );
+ SendReq->BufferArray = LockBuffers( SendReq->BufferArray,
+ SendReq->BufferCount,
+ NULL, NULL,
+ FALSE, FALSE );
+
+ if( !SendReq->BufferArray ) {
+ return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
+ Irp, 0, NULL );
+ }
+
AFD_DbgPrint(MID_TRACE,("Socket state %d\n", FCB->State));
if( FCB->State != SOCKET_STATE_CONNECTED ) {
if( SendReq->AfdFlags & AFD_IMMEDIATE ) {
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
+ UnlockBuffers( SendReq->BufferArray, SendReq->BufferCount, FALSE );
return UnlockAndMaybeComplete
( FCB, STATUS_CANT_WAIT, Irp, 0, NULL );
} else {
AFD_DbgPrint(MID_TRACE,("Queuing request\n"));
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_SEND );
}
- }
-
- AFD_DbgPrint(MID_TRACE,("We already have %d bytes waiting.\n",
- FCB->Send.BytesUsed));
-
- SendReq->BufferArray = LockBuffers( SendReq->BufferArray,
- SendReq->BufferCount,
- NULL, NULL,
- FALSE, FALSE );
-
- if( !SendReq->BufferArray ) {
- return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
- Irp, 0, NULL );
}
AFD_DbgPrint(MID_TRACE,("FCB->Send.BytesUsed = %d\n",
@@ -362,6 +370,7 @@
if( SendReq->AfdFlags & AFD_IMMEDIATE ) {
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
+ UnlockBuffers( SendReq->BufferArray, SendReq->BufferCount, FALSE );
return UnlockAndMaybeComplete
( FCB, STATUS_CANT_WAIT, Irp, 0, NULL );
} else {
Modified: trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpi…
==============================================================================
--- trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c [iso-8859-1] Wed Aug 20 22:38:49
2008
@@ -52,34 +52,6 @@
return IRPFinish(Irp, STATUS_CANCELLED);
}
-
-
-VOID DispCancelComplete(
- PVOID Context)
-/*
- * FUNCTION: Completes a cancel request
- * ARGUMENTS:
- * Context = Pointer to context information (FILE_OBJECT)
- */
-{
- /*KIRQL OldIrql;*/
- PFILE_OBJECT FileObject;
- PTRANSPORT_CONTEXT TranContext;
-
- TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
-
- FileObject = (PFILE_OBJECT)Context;
- TranContext = (PTRANSPORT_CONTEXT)FileObject->FsContext;
-
- /* Set the cleanup event */
- KeSetEvent(&TranContext->CleanupEvent, 0, FALSE);
-
- /* We are expected to release the cancel spin lock */
- /*IoReleaseCancelSpinLock(OldIrql);*/
-
- TI_DbgPrint(DEBUG_IRP, ("Leaving.\n"));
-}
-
VOID DispDataRequestComplete(
PVOID Context,
@@ -155,8 +127,6 @@
TI_DbgPrint(DEBUG_IRP, ("PostCancel: DoDisconnect done\n"));
DispDataRequestComplete(DisType->Irp, STATUS_CANCELLED, 0);
-
- DispCancelComplete(DisType->FileObject);
}
VOID NTAPI DispCancelRequest(
@@ -209,24 +179,20 @@
if( !ChewCreate( &WorkItem, sizeof(DISCONNECT_TYPE),
DispDoDisconnect, &DisType ) )
ASSERT(0);
- break;
+ return;
case TDI_SEND_DATAGRAM:
if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) {
TI_DbgPrint(MIN_TRACE, ("TDI_SEND_DATAGRAM, but no address
file.\n"));
- break;
}
-
- /*DGCancelSendRequest(TranContext->Handle.AddressHandle, Irp);*/
break;
case TDI_RECEIVE_DATAGRAM:
if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) {
TI_DbgPrint(MIN_TRACE, ("TDI_RECEIVE_DATAGRAM, but no address
file.\n"));
- break;
}
- /*DGCancelReceiveRequest(TranContext->Handle.AddressHandle, Irp);*/
+ DGRemoveIRP(TranContext->Handle.AddressHandle, Irp);
break;
default:
@@ -235,6 +201,7 @@
}
IoReleaseCancelSpinLock(Irp->CancelIrql);
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
}
@@ -279,8 +246,6 @@
IoReleaseCancelSpinLock(Irp->CancelIrql);
DispDataRequestComplete(Irp, STATUS_CANCELLED, 0);
-
- DispCancelComplete(FileObject);
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
}
Modified: trunk/reactos/drivers/network/tcpip/tcpip/main.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpi…
==============================================================================
--- trunk/reactos/drivers/network/tcpip/tcpip/main.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/tcpip/tcpip/main.c [iso-8859-1] Wed Aug 20 22:38:49
2008
@@ -138,7 +138,6 @@
}
CP
Context->CancelIrps = FALSE;
- KeInitializeEvent(&Context->CleanupEvent, NotificationEvent, FALSE);
CP
IrpSp = IoGetCurrentIrpStackLocation(Irp);
IrpSp->FileObject->FsContext = Context;
@@ -253,36 +252,6 @@
return Status;
}
-
-VOID TiCleanupFileObjectComplete(
- PVOID Context,
- NTSTATUS Status)
-/*
- * FUNCTION: Completes an object cleanup IRP I/O request
- * ARGUMENTS:
- * Context = Pointer to the IRP for this request
- * Status = Final status of the operation
- */
-{
- PIRP Irp;
- PIO_STACK_LOCATION IrpSp;
- PTRANSPORT_CONTEXT TranContext;
- KIRQL OldIrql;
-
- Irp = (PIRP)Context;
- IrpSp = IoGetCurrentIrpStackLocation(Irp);
- TranContext = (PTRANSPORT_CONTEXT)IrpSp->FileObject->FsContext;
-
- Irp->IoStatus.Status = Status;
-
- IoAcquireCancelSpinLock(&OldIrql);
-
- KeSetEvent(&TranContext->CleanupEvent, 0, FALSE);
-
- IoReleaseCancelSpinLock(OldIrql);
-}
-
-
/*
* FUNCTION: Releases resources used by a file object
* ARGUMENTS:
@@ -313,12 +282,8 @@
IoAcquireCancelSpinLock(&OldIrql);
Context->CancelIrps = TRUE;
- KeResetEvent(&Context->CleanupEvent);
IoReleaseCancelSpinLock(OldIrql);
-
- Request.RequestNotifyObject = TiCleanupFileObjectComplete;
- Request.RequestContext = Irp;
switch ((ULONG_PTR)IrpSp->FileObject->FsContext2) {
case TDI_TRANSPORT_ADDRESS_FILE:
@@ -345,19 +310,8 @@
Context->CancelIrps = FALSE;
IoReleaseCancelSpinLock(OldIrql);
- Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
-
- return Irp->IoStatus.Status;
- }
-
- if (Status != STATUS_PENDING)
- {
- IoAcquireCancelSpinLock(&OldIrql);
- KeSetEvent(&Context->CleanupEvent, 0, FALSE);
- IoReleaseCancelSpinLock(OldIrql);
-
- KeWaitForSingleObject(&Context->CleanupEvent,
- UserRequest, KernelMode, FALSE, NULL);
+ Status = STATUS_INVALID_PARAMETER;
+
}
Irp->IoStatus.Status = Status;