mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 12:55:43 +00:00
Patch by Cameron Gutman (aicommander <at> gmail <dot> com)
- Fix a few issues in the cancel routine - Don't wait on an event we haven't set - Don't mark the IRP pending when in DispPrepareIrpForCancel svn path=/trunk/; revision=34682
This commit is contained in:
parent
b10a7debe3
commit
5c108dbe7d
3 changed files with 24 additions and 18 deletions
|
@ -33,7 +33,6 @@ NTSTATUS DispPrepareIrpForCancel(
|
|||
IoAcquireCancelSpinLock(&OldIrql);
|
||||
|
||||
if (!Irp->Cancel) {
|
||||
IoMarkIrpPending(Irp);
|
||||
(void)IoSetCancelRoutine(Irp, CancelRoutine);
|
||||
IoReleaseCancelSpinLock(OldIrql);
|
||||
|
||||
|
@ -187,7 +186,8 @@ VOID NTAPI DispCancelRequest(
|
|||
|
||||
TI_DbgPrint(DEBUG_IRP, ("IRP at (0x%X) MinorFunction (0x%X) IrpSp (0x%X).\n", Irp, MinorFunction, IrpSp));
|
||||
|
||||
Irp->IoStatus.Status = STATUS_PENDING;
|
||||
Irp->IoStatus.Status = STATUS_CANCELLED;
|
||||
Irp->IoStatus.Information = 0;
|
||||
|
||||
#ifdef DBG
|
||||
if (!Irp->Cancel)
|
||||
|
@ -212,7 +212,6 @@ VOID NTAPI DispCancelRequest(
|
|||
break;
|
||||
|
||||
case TDI_SEND_DATAGRAM:
|
||||
Irp->IoStatus.Status = STATUS_CANCELLED;
|
||||
if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) {
|
||||
TI_DbgPrint(MIN_TRACE, ("TDI_SEND_DATAGRAM, but no address file.\n"));
|
||||
break;
|
||||
|
@ -222,7 +221,6 @@ VOID NTAPI DispCancelRequest(
|
|||
break;
|
||||
|
||||
case TDI_RECEIVE_DATAGRAM:
|
||||
Irp->IoStatus.Status = STATUS_CANCELLED;
|
||||
if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) {
|
||||
TI_DbgPrint(MIN_TRACE, ("TDI_RECEIVE_DATAGRAM, but no address file.\n"));
|
||||
break;
|
||||
|
@ -236,9 +234,6 @@ VOID NTAPI DispCancelRequest(
|
|||
break;
|
||||
}
|
||||
|
||||
if( Irp->IoStatus.Status == STATUS_PENDING )
|
||||
IoMarkIrpPending(Irp);
|
||||
|
||||
IoReleaseCancelSpinLock(Irp->CancelIrql);
|
||||
|
||||
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
|
||||
|
@ -1453,7 +1448,6 @@ NTSTATUS DispTdiSetInformationEx(
|
|||
PTCP_REQUEST_SET_INFORMATION_EX Info;
|
||||
TDI_REQUEST Request;
|
||||
TDI_STATUS Status;
|
||||
KIRQL OldIrql;
|
||||
|
||||
TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
|
||||
|
||||
|
@ -1489,12 +1483,6 @@ NTSTATUS DispTdiSetInformationEx(
|
|||
|
||||
Status = InfoTdiSetInformationEx(&Request, &Info->ID,
|
||||
&Info->Buffer, Info->BufferSize);
|
||||
|
||||
if (Status != STATUS_PENDING) {
|
||||
IoAcquireCancelSpinLock(&OldIrql);
|
||||
(void)IoSetCancelRoutine(Irp, NULL);
|
||||
IoReleaseCancelSpinLock(OldIrql);
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
|
|
|
@ -18,6 +18,9 @@ VOID IRPRemember( PIRP Irp, PCHAR File, UINT Line ) {
|
|||
}
|
||||
|
||||
NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) {
|
||||
KIRQL Irql;
|
||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
//DbgPrint("Called: Irp %x, Status %x Event %x\n", Irp, Status, Irp->UserEvent);
|
||||
|
||||
#ifdef MEMTRACK
|
||||
|
@ -30,7 +33,14 @@ NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) {
|
|||
IoMarkIrpPending( Irp );
|
||||
else {
|
||||
Irp->IoStatus.Status = Status;
|
||||
Irql = KeGetCurrentIrql();
|
||||
|
||||
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
|
||||
if (KeGetCurrentIrql() != Irql) {
|
||||
DbgPrint("WARNING: IO COMPLETION RETURNED AT WRONG IRQL:\n");
|
||||
DbgPrint("WARNING: IRP TYPE WAS %d\n", IrpSp->MajorFunction);
|
||||
}
|
||||
ASSERT(KeGetCurrentIrql() == Irql);
|
||||
}
|
||||
|
||||
return Status;
|
||||
|
|
|
@ -345,14 +345,22 @@ NTSTATUS TiCleanupFileObject(
|
|||
Context->CancelIrps = FALSE;
|
||||
IoReleaseCancelSpinLock(OldIrql);
|
||||
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
|
||||
|
||||
return Irp->IoStatus.Status;
|
||||
}
|
||||
|
||||
if (Status != STATUS_PENDING)
|
||||
TiCleanupFileObjectComplete(Irp, Status);
|
||||
{
|
||||
IoAcquireCancelSpinLock(&OldIrql);
|
||||
KeSetEvent(&Context->CleanupEvent, 0, FALSE);
|
||||
IoReleaseCancelSpinLock(OldIrql);
|
||||
|
||||
KeWaitForSingleObject(&Context->CleanupEvent,
|
||||
UserRequest, KernelMode, FALSE, NULL);
|
||||
KeWaitForSingleObject(&Context->CleanupEvent,
|
||||
UserRequest, KernelMode, FALSE, NULL);
|
||||
}
|
||||
|
||||
Irp->IoStatus.Status = Status;
|
||||
|
||||
return Irp->IoStatus.Status;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue