/* * COPYRIGHT: See COPYRIGHT.TXT * PROJECT: Ext2 File System Driver for WinNT/2K/XP * FILE: lock.c * PROGRAMMER: Matt Wu * HOMEPAGE: http://www.ext2fsd.com * UPDATE HISTORY: */ /* INCLUDES *****************************************************************/ #include "ext2fs.h" /* GLOBALS ***************************************************************/ extern PEXT2_GLOBAL Ext2Global; /* DEFINITIONS *************************************************************/ #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, Ext2LockControl) #endif NTSTATUS Ext2LockControl (IN PEXT2_IRP_CONTEXT IrpContext) { PDEVICE_OBJECT DeviceObject = NULL; PFILE_OBJECT FileObject = NULL; PEXT2_FCB Fcb = NULL; PIRP Irp = NULL; NTSTATUS Status = STATUS_UNSUCCESSFUL; BOOLEAN CompleteContext = TRUE; BOOLEAN CompleteIrp = TRUE; BOOLEAN bFcbAcquired = FALSE; _SEH2_TRY { ASSERT(IrpContext != NULL); ASSERT((IrpContext->Identifier.Type == EXT2ICX) && (IrpContext->Identifier.Size == sizeof(EXT2_IRP_CONTEXT))); DeviceObject = IrpContext->DeviceObject; if (IsExt2FsDevice(DeviceObject)) { Status = STATUS_INVALID_DEVICE_REQUEST; _SEH2_LEAVE; } FileObject = IrpContext->FileObject; Fcb = (PEXT2_FCB) FileObject->FsContext; ASSERT(Fcb != NULL); if (Fcb->Identifier.Type == EXT2VCB) { Status = STATUS_INVALID_PARAMETER; _SEH2_LEAVE; } ASSERT((Fcb->Identifier.Type == EXT2FCB) && (Fcb->Identifier.Size == sizeof(EXT2_FCB))); if (FlagOn(Fcb->Mcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY)) { Status = STATUS_INVALID_PARAMETER; _SEH2_LEAVE; } ExAcquireResourceSharedLite(&Fcb->MainResource, TRUE); bFcbAcquired = TRUE; Irp = IrpContext->Irp; CompleteIrp = FALSE; Status = FsRtlCheckOplock( &Fcb->Oplock, Irp, IrpContext, Ext2OplockComplete, NULL ); if (Status != STATUS_SUCCESS) { CompleteContext = FALSE; _SEH2_LEAVE; } // // FsRtlProcessFileLock acquires FileObject->FsContext->Resource while // modifying the file locks and calls IoCompleteRequest when it's done. // Status = FsRtlProcessFileLock( &Fcb->FileLockAnchor, Irp, NULL ); #if EXT2_DEBUG if (!NT_SUCCESS(Status)) { DEBUG(DL_ERR, ( "Ext2LockControl: %-16.16s %-31s Status: %#x ***\n", Ext2GetCurrentProcessName(), "IRP_MJ_LOCK_CONTROL", Status )); } #endif Fcb->Header.IsFastIoPossible = Ext2IsFastIoPossible(Fcb); } _SEH2_FINALLY { if (bFcbAcquired) { ExReleaseResourceLite(&Fcb->MainResource); } if (!IrpContext->ExceptionInProgress) { if (!CompleteIrp) { IrpContext->Irp = NULL; } if (CompleteContext) { Ext2CompleteIrpContext(IrpContext, Status); } } } _SEH2_END; return Status; }