mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
- Fix IRP cancellation issues
- Ping doesn't hang anymore svn path=/branches/aicom-network-fixes/; revision=35485
This commit is contained in:
parent
67fae61a27
commit
df19533df7
3 changed files with 5 additions and 88 deletions
|
@ -190,9 +190,7 @@ VOID DestroySocket( PAFD_FCB FCB ) {
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -53,34 +53,6 @@ NTSTATUS DispPrepareIrpForCancel(
|
|||
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,
|
||||
NTSTATUS Status,
|
||||
|
@ -155,8 +127,6 @@ VOID DispDoDisconnect( PVOID Data ) {
|
|||
TI_DbgPrint(DEBUG_IRP, ("PostCancel: DoDisconnect done\n"));
|
||||
|
||||
DispDataRequestComplete(DisType->Irp, STATUS_CANCELLED, 0);
|
||||
|
||||
DispCancelComplete(DisType->FileObject);
|
||||
}
|
||||
|
||||
VOID NTAPI DispCancelRequest(
|
||||
|
@ -209,24 +179,20 @@ VOID NTAPI DispCancelRequest(
|
|||
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 @@ VOID NTAPI DispCancelRequest(
|
|||
}
|
||||
|
||||
IoReleaseCancelSpinLock(Irp->CancelIrql);
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
|
||||
}
|
||||
|
@ -280,8 +247,6 @@ VOID NTAPI DispCancelListenRequest(
|
|||
|
||||
DispDataRequestComplete(Irp, STATUS_CANCELLED, 0);
|
||||
|
||||
DispCancelComplete(FileObject);
|
||||
|
||||
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
|
||||
}
|
||||
|
||||
|
|
|
@ -138,7 +138,6 @@ CP
|
|||
}
|
||||
CP
|
||||
Context->CancelIrps = FALSE;
|
||||
KeInitializeEvent(&Context->CleanupEvent, NotificationEvent, FALSE);
|
||||
CP
|
||||
IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||
IrpSp->FileObject->FsContext = Context;
|
||||
|
@ -253,36 +252,6 @@ CP
|
|||
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,13 +282,9 @@ NTSTATUS TiCleanupFileObject(
|
|||
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:
|
||||
Request.Handle.AddressHandle = Context->Handle.AddressHandle;
|
||||
|
@ -345,19 +310,8 @@ NTSTATUS TiCleanupFileObject(
|
|||
Context->CancelIrps = FALSE;
|
||||
IoReleaseCancelSpinLock(OldIrql);
|
||||
|
||||
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
|
||||
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);
|
||||
}
|
||||
|
||||
Irp->IoStatus.Status = Status;
|
||||
|
|
Loading…
Reference in a new issue