From bde93d020ba8ffb03fead2356ff7adca5e9495bf Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 4 Apr 2016 16:24:58 -0700 Subject: [PATCH] sys: FspIopCompleteCanceledIrp: wrap IRP completion in FsRtlEnterFileSystem/FsRtlExitFileSystem --- src/sys/iop.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/sys/iop.c b/src/sys/iop.c index 53a386d1..ddcb3860 100644 --- a/src/sys/iop.c +++ b/src/sys/iop.c @@ -219,12 +219,21 @@ VOID FspIopCompleteCanceledIrp(PIRP Irp) DEBUGLOGIRP(Irp, STATUS_CANCELLED); + /* + * An IRP cancel may happen at any time including when APC's are still enabled. + * For this reason we execute FsRtlEnterFileSystem/FsRtlExitFileSystem here. + * This will protect ERESOURCE operations during Request finalizations. + */ + FsRtlEnterFileSystem(); + PIRP TopLevelIrp = IoGetTopLevelIrp(); IoSetTopLevelIrp(Irp); FspIopCompleteIrpEx(Irp, STATUS_CANCELLED, TRUE); IoSetTopLevelIrp(TopLevelIrp); + + FsRtlExitFileSystem(); } BOOLEAN FspIopRetryPrepareIrp(PIRP Irp, NTSTATUS *PResult)