mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 13:26:17 +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);
|
IoAcquireCancelSpinLock(&OldIrql);
|
||||||
|
|
||||||
if (!Irp->Cancel) {
|
if (!Irp->Cancel) {
|
||||||
IoMarkIrpPending(Irp);
|
|
||||||
(void)IoSetCancelRoutine(Irp, CancelRoutine);
|
(void)IoSetCancelRoutine(Irp, CancelRoutine);
|
||||||
IoReleaseCancelSpinLock(OldIrql);
|
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));
|
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
|
#ifdef DBG
|
||||||
if (!Irp->Cancel)
|
if (!Irp->Cancel)
|
||||||
|
@ -212,7 +212,6 @@ VOID NTAPI DispCancelRequest(
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TDI_SEND_DATAGRAM:
|
case TDI_SEND_DATAGRAM:
|
||||||
Irp->IoStatus.Status = STATUS_CANCELLED;
|
|
||||||
if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) {
|
if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) {
|
||||||
TI_DbgPrint(MIN_TRACE, ("TDI_SEND_DATAGRAM, but no address file.\n"));
|
TI_DbgPrint(MIN_TRACE, ("TDI_SEND_DATAGRAM, but no address file.\n"));
|
||||||
break;
|
break;
|
||||||
|
@ -222,7 +221,6 @@ VOID NTAPI DispCancelRequest(
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TDI_RECEIVE_DATAGRAM:
|
case TDI_RECEIVE_DATAGRAM:
|
||||||
Irp->IoStatus.Status = STATUS_CANCELLED;
|
|
||||||
if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) {
|
if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) {
|
||||||
TI_DbgPrint(MIN_TRACE, ("TDI_RECEIVE_DATAGRAM, but no address file.\n"));
|
TI_DbgPrint(MIN_TRACE, ("TDI_RECEIVE_DATAGRAM, but no address file.\n"));
|
||||||
break;
|
break;
|
||||||
|
@ -236,9 +234,6 @@ VOID NTAPI DispCancelRequest(
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( Irp->IoStatus.Status == STATUS_PENDING )
|
|
||||||
IoMarkIrpPending(Irp);
|
|
||||||
|
|
||||||
IoReleaseCancelSpinLock(Irp->CancelIrql);
|
IoReleaseCancelSpinLock(Irp->CancelIrql);
|
||||||
|
|
||||||
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
|
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
|
||||||
|
@ -1453,7 +1448,6 @@ NTSTATUS DispTdiSetInformationEx(
|
||||||
PTCP_REQUEST_SET_INFORMATION_EX Info;
|
PTCP_REQUEST_SET_INFORMATION_EX Info;
|
||||||
TDI_REQUEST Request;
|
TDI_REQUEST Request;
|
||||||
TDI_STATUS Status;
|
TDI_STATUS Status;
|
||||||
KIRQL OldIrql;
|
|
||||||
|
|
||||||
TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
|
TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
|
||||||
|
|
||||||
|
@ -1489,12 +1483,6 @@ NTSTATUS DispTdiSetInformationEx(
|
||||||
|
|
||||||
Status = InfoTdiSetInformationEx(&Request, &Info->ID,
|
Status = InfoTdiSetInformationEx(&Request, &Info->ID,
|
||||||
&Info->Buffer, Info->BufferSize);
|
&Info->Buffer, Info->BufferSize);
|
||||||
|
|
||||||
if (Status != STATUS_PENDING) {
|
|
||||||
IoAcquireCancelSpinLock(&OldIrql);
|
|
||||||
(void)IoSetCancelRoutine(Irp, NULL);
|
|
||||||
IoReleaseCancelSpinLock(OldIrql);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
|
@ -18,6 +18,9 @@ VOID IRPRemember( PIRP Irp, PCHAR File, UINT Line ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) {
|
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);
|
//DbgPrint("Called: Irp %x, Status %x Event %x\n", Irp, Status, Irp->UserEvent);
|
||||||
|
|
||||||
#ifdef MEMTRACK
|
#ifdef MEMTRACK
|
||||||
|
@ -30,7 +33,14 @@ NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) {
|
||||||
IoMarkIrpPending( Irp );
|
IoMarkIrpPending( Irp );
|
||||||
else {
|
else {
|
||||||
Irp->IoStatus.Status = Status;
|
Irp->IoStatus.Status = Status;
|
||||||
|
Irql = KeGetCurrentIrql();
|
||||||
|
|
||||||
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
|
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;
|
return Status;
|
||||||
|
|
|
@ -345,14 +345,22 @@ NTSTATUS TiCleanupFileObject(
|
||||||
Context->CancelIrps = FALSE;
|
Context->CancelIrps = FALSE;
|
||||||
IoReleaseCancelSpinLock(OldIrql);
|
IoReleaseCancelSpinLock(OldIrql);
|
||||||
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
return Irp->IoStatus.Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Status != STATUS_PENDING)
|
if (Status != STATUS_PENDING)
|
||||||
TiCleanupFileObjectComplete(Irp, Status);
|
{
|
||||||
|
IoAcquireCancelSpinLock(&OldIrql);
|
||||||
|
KeSetEvent(&Context->CleanupEvent, 0, FALSE);
|
||||||
|
IoReleaseCancelSpinLock(OldIrql);
|
||||||
|
|
||||||
KeWaitForSingleObject(&Context->CleanupEvent,
|
KeWaitForSingleObject(&Context->CleanupEvent,
|
||||||
UserRequest, KernelMode, FALSE, NULL);
|
UserRequest, KernelMode, FALSE, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
Irp->IoStatus.Status = Status;
|
||||||
|
|
||||||
return Irp->IoStatus.Status;
|
return Irp->IoStatus.Status;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue