⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lock.c

📁 一个windows 文件系统驱动源码
💻 C
字号:
 
 /*
  *     Copyright (C) Satish kumar Janarthanan (vsat_in@yahoo.com.), 2004-2005
  *
  *		Project:		Win2fs
  *
  *		Module Name:    \FSD\lock.c
  *
  *     Abstract:		Lock control API.
  *
  *     Author:		    Satish Kumar J
  *
  *		Date:			09-JUL-2004
  *
  *		Notes:			None.
  *
  *		Revision History:
  *
  *		Date		Version	Author				Changes
  *		------------------------------------------------------------------------
  *
  *		09-JUL-04	1.00	Satish Kumar J		Initial	Version.
  *
  *
  */

 //////////////////////////////////////////////////////////////////////////////

 // Include files.

 #include "ntifs.h"
 #include "ext2fs.h"

 //////////////////////////////////////////////////////////////////////////////

 // Global data.

 extern PEXT2_GLOBAL gExt2Global;

 //////////////////////////////////////////////////////////////////////////////

 // Static data.

 #ifdef ALLOC_PRAGMA
	#pragma alloc_text(PAGE, Ext2LockControl)
 #endif

 //////////////////////////////////////////////////////////////////////////////

 // Static functions.

 // None.

 //////////////////////////////////////////////////////////////////////////////

 // Global functions.

 NTSTATUS
 Ext2LockControl (
	IN PEXT2_IRP_CONTEXT IrpContext)
 {
    NTSTATUS        Status			= STATUS_UNSUCCESSFUL;
    BOOLEAN         CompleteRequest	= FALSE;

    PDEVICE_OBJECT  DeviceObject	= NULL;
    PFILE_OBJECT    FileObject		= NULL;
    PEXT2_FCB       Fcb				= NULL;
    PIRP            Irp				= NULL;
    
    __try
    {
        ASSERT(IrpContext != NULL);
        
        ASSERT((IrpContext->Identifier.Type == EXT2ICX) &&
               (IrpContext->Identifier.Size == sizeof(EXT2_IRP_CONTEXT)));
        
        DeviceObject = IrpContext->DeviceObject;
        
        if (DeviceObject == gExt2Global->DeviceObject)
        {
            CompleteRequest = TRUE;

            Status = STATUS_INVALID_DEVICE_REQUEST;

            __leave;
        }
        
        FileObject = IrpContext->FileObject;
        
        Fcb = (PEXT2_FCB) FileObject->FsContext;
        
        ASSERT(Fcb != NULL);
        
        if (Fcb->Identifier.Type == EXT2VCB)
        {
            CompleteRequest = TRUE;

            Status = STATUS_INVALID_PARAMETER;

            __leave;
        }
        
        ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
               (Fcb->Identifier.Size == sizeof(EXT2_FCB)));
        
        if (FlagOn(Fcb->Ext2Mcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY))
        {
            CompleteRequest = TRUE;

            Status = STATUS_INVALID_PARAMETER;

            __leave;
        }
        
        Irp = IrpContext->Irp;
        
        //
        // While the file has any byte range locks we set IsFastIoPossible to
        // FastIoIsQuestionable so that the FastIoCheckIfPossible function is
        // called to check the locks for any fast I/O read/write operation.
        //

        if (Fcb->CommonFCBHeader.IsFastIoPossible != FastIoIsQuestionable)
        {
 #if DBG
            Ext2DbgPrint(D_LOCK, "Ext2LockControl: %-16.16s %-31s %s\n",
					Ext2DbgGetCurrentProcessName(),
					"FastIoIsQuestionable",
					Fcb->AnsiFileName.Buffer
                );
 #endif          
            Fcb->CommonFCBHeader.IsFastIoPossible = FastIoIsQuestionable;
        }
        
        //
        // FsRtlProcessFileLock acquires FileObject->FsContext->Resource while
        // modifying the file locks and calls IoCompleteRequest when it's done.
        //
        
        CompleteRequest = FALSE;
        
        Status = FsRtlProcessFileLock(
            &Fcb->FileLockAnchor,
            Irp,
            NULL        );
        
        if (Status != STATUS_SUCCESS)
        {
 #if DBG
            Ext2DbgPrint(D_LOCK, "Ext2LockControl: %-16.16s %-31s *** Status: %s (%#x) ***\n",
					Ext2DbgGetCurrentProcessName(),
					"IRP_MJ_LOCK_CONTROL",
					Ext2DbgNtStatusToString(Status),
					Status          
				);
 #endif
        }
    }
    __finally
    {
        if (!IrpContext->ExceptionInProgress)
        {
            if (CompleteRequest)
            {
                IrpContext->Irp->IoStatus.Status = Status;
                
                Ext2CompleteRequest(
						IrpContext->Irp,
						(CCHAR)	(NT_SUCCESS(Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT)
                    );
            }
            
            Ext2FreeIrpContext(IrpContext);
        }
    }
    
    return Status;
 }

 //////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -