static NTSTATUS FspFileNodeCompleteLockIrp(PVOID Context, PIRP Irp) { PAGED_CODE(); FSP_FILE_NODE *FileNode = Context; NTSTATUS Result = Irp->IoStatus.Status; FspFileNodeReleaseOwnerF(FileNode, FspIrpFlags(Irp), Irp); DEBUGLOGIRP(Irp, Result); FspIopCompleteIrp(Irp, Result); return Result; }
NTSTATUS FspFileNodeProcessLockIrp(FSP_FILE_NODE *FileNode, PIRP Irp) { PAGED_CODE(); IoMarkIrpPending(Irp); FspFileNodeSetOwnerF(FileNode, FspIrpFlags(Irp), Irp); try { FsRtlProcessFileLock(&FileNode->FileLock, Irp, FileNode); } except (EXCEPTION_EXECUTE_HANDLER) { Irp->IoStatus.Status = GetExceptionCode(); Irp->IoStatus.Information = 0; FspFileNodeCompleteLockIrp(FileNode, Irp); } return STATUS_PENDING; }
static NTSTATUS FspFsvolLockControlRetry( PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN CanWait) { PAGED_CODE(); NTSTATUS Result; PFILE_OBJECT FileObject = IrpSp->FileObject; FSP_FILE_NODE *FileNode = FileObject->FsContext; BOOLEAN Success; /* try to acquire the FileNode shared Main */ Success = DEBUGTEST(90) && FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireMain, CanWait); if (!Success) return FspWqRepostIrpWorkItem(Irp, FspFsvolLockControlRetry, 0); /* perform oplock check; we are only implementing Win7 behavior */ Result = FspFileNodeOplockCheckAsync( FileNode, FspFileNodeAcquireMain, FspFsvolLockControlRetry, Irp); if (STATUS_PENDING == Result) return Result; if (!NT_SUCCESS(Result)) { FspFileNodeRelease(FileNode, Main); return Result; } ULONG IrpFlags = FspIrpFlags(Irp); IoSetTopLevelIrp(0); /* let the FSRTL package handle this one! */ Result = FspFileNodeProcessLockIrp(FileNode, Irp); FspFileNodeReleaseF(FileNode, IrpFlags); return Result | FSP_STATUS_IGNORE_BIT; }