diff --git a/src/sys/create.c b/src/sys/create.c index def49c60..4fd86e0c 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -1335,15 +1335,19 @@ static BOOLEAN FspFsvolCreateCheckOplock(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP OpenRequiringOplock = BooleanFlagOn(IrpSp->Parameters.Create.Options, FILE_OPEN_REQUIRING_OPLOCK); - CheckOplock = FsRtlCurrentBatchOplock(FspFileNodeAddrOfOplock(FileNode)); - if (OpenRequiringOplock || !CheckOplock) + CheckOplock = FALSE; + + if (OpenRequiringOplock) { FspFsvolDeviceLockContextTable(FsvolDeviceObject); OplockCount = FileNode->HandleCount; FspFsvolDeviceUnlockContextTable(FsvolDeviceObject); - CheckOplock = CheckOplock || 1 < OplockCount; + + CheckOplock = 1 < OplockCount; } + CheckOplock = CheckOplock || FsRtlCurrentBatchOplock(FspFileNodeAddrOfOplock(FileNode)); + if (CheckOplock) { Result = FspCheckOplock(FspFileNodeAddrOfOplock(FileNode), Irp, @@ -1389,7 +1393,7 @@ static VOID FspFsvolCreateCheckOplockComplete( if (FspFsctlTransactOverwriteKind == Request->Kind) FspIopRetryPrepareIrp(Irp, &Result); else if (FspFsctlTransactReservedKind == Request->Kind) - FspIopRetryCompleteIrp(Irp, Context, &Result); + FspIopRetryCompleteIrp(Irp, FspIopIrpResponse(Irp), &Result); } NTSTATUS FspCreate(