Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126/* * COPYRIGHT: See COPYRIGHT.TXT * PROJECT: Ext2 File System Driver for WinNT/2K/XP * FILE: lock.c * PROGRAMMER: Matt Wu <mattwu@163.com> * 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
NTSTATUSExt2LockControl (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;}