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)