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

📄 fastio.c

📁 一个windows 文件系统驱动源码
💻 C
📖 第 1 页 / 共 3 页
字号:
            Status = FsRtlFastLock(
                &Fcb->FileLockAnchor,
                FileObject,
                FileOffset,
                Length,
                Process,
                Key,
                FailImmediately,
                ExclusiveLock,
                IoStatus,
                NULL,
                FALSE);
        }
        __except (EXCEPTION_EXECUTE_HANDLER)
        {
            IoStatus->Status = GetExceptionCode();
            Status = TRUE;
        }
    }

    __finally
    {
        FsRtlExitFileSystem();
    }

#if DBG 
    if (Status == FALSE)
    {
        Ext2DbgPrint(D_FASTIO,"Ext2FastIoLock: %-16.16s %-31s *** Status: FALSE ***\n",
            (PUCHAR) Process + gProcessNameOffset,
            "FASTIO_LOCK"
            );
    }
    else if (IoStatus->Status != STATUS_SUCCESS)
    {
        Ext2DbgPrint(D_FASTIO, "Ext2FastIoLock: %-16.16s %-31s *** Status: %s (%#x) ***\n",
            (PUCHAR) Process + gProcessNameOffset,
            "FASTIO_LOCK",
            Ext2DbgNtStatusToString(IoStatus->Status),
            IoStatus->Status
            );
    }
#endif
    
    return Status;
}

BOOLEAN
Ext2FastIoUnlockSingle (
               IN PFILE_OBJECT         FileObject,
               IN PLARGE_INTEGER       FileOffset,
               IN PLARGE_INTEGER       Length,
               IN PEPROCESS            Process,
               IN ULONG                Key,
               OUT PIO_STATUS_BLOCK    IoStatus,
               IN PDEVICE_OBJECT       DeviceObject
               )
{
    BOOLEAN     Status = FALSE;
    PEXT2_FCB   Fcb;
    
    __try
    {
        __try
        {
            if (DeviceObject == gExt2Global->DeviceObject)
            {
                IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
                Status = TRUE;
                __leave;
            }
            
            Fcb = (PEXT2_FCB) FileObject->FsContext;
            
            ASSERT(Fcb != NULL);
            
            if (Fcb->Identifier.Type == EXT2VCB)
            {
                IoStatus->Status = STATUS_INVALID_PARAMETER;
                Status = TRUE;
                __leave;
            }
            
            ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
                (Fcb->Identifier.Size == sizeof(EXT2_FCB)));
            
            if (FlagOn(Fcb->Ext2Mcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY))
            {
                IoStatus->Status = STATUS_INVALID_PARAMETER;
                Status = TRUE;
                __leave;
            }
#if DBG         
            Ext2DbgPrint(D_FASTIO,"Ext2FastIoUnlockSingle: %-16.16s %-31s %s\n",
                (PUCHAR) Process + gProcessNameOffset,
                "FASTIO_UNLOCK_SINGLE",
                Fcb->AnsiFileName.Buffer        );
#endif          
            Ext2DbgPrint(D_FASTIO,"Ext2FastIoUnlockSingle: Offset: %I64u Length: %I64u Key: %u\n",
                FileOffset->QuadPart,
                Length->QuadPart,
                Key     );
            
            FsRtlEnterFileSystem();
            
            IoStatus->Status = FsRtlFastUnlockSingle(
                &Fcb->FileLockAnchor,
                FileObject,
                FileOffset,
                Length,
                Process,
                Key,
                NULL,
                FALSE);                      
            
            IoStatus->Information = 0;
            
            Status =  TRUE;
        }
        __except (EXCEPTION_EXECUTE_HANDLER)
        {
            IoStatus->Status = GetExceptionCode();
            Status = TRUE;
        }
    }
    __finally
    {
        FsRtlExitFileSystem();
    }

#if DBG 
    if (Status == FALSE)
    {
        Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockSingle: %-16.16s %-31s *** Status: FALSE ***\n",
            (PUCHAR) Process + gProcessNameOffset,
            "FASTIO_UNLOCK_SINGLE"          );
    }
    else if (IoStatus->Status != STATUS_SUCCESS)
    {
        Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockSingle: %-16.16s %-31s *** Status: %s (%#x) ***\n",
            (PUCHAR) Process + gProcessNameOffset,
            "FASTIO_UNLOCK_SINGLE",
            Ext2DbgNtStatusToString(IoStatus->Status),
            IoStatus->Status            );
    }
#endif  
    return Status;
}

BOOLEAN
Ext2FastIoUnlockAll (
            IN PFILE_OBJECT         FileObject,
            IN PEPROCESS            Process,
            OUT PIO_STATUS_BLOCK    IoStatus,
            IN PDEVICE_OBJECT       DeviceObject)
{
    BOOLEAN     Status = FALSE;
    PEXT2_FCB   Fcb;
    
    __try
    {
        __try
        {
            if (DeviceObject == gExt2Global->DeviceObject)
            {
                IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
                Status = TRUE;
                __leave;
            }
            
            Fcb = (PEXT2_FCB) FileObject->FsContext;
            
            ASSERT(Fcb != NULL);
            
            if (Fcb->Identifier.Type == EXT2VCB)
            {
                IoStatus->Status = STATUS_INVALID_PARAMETER;
                Status = TRUE;
                __leave;
            }
            
            ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
                (Fcb->Identifier.Size == sizeof(EXT2_FCB)));
            
            if (FlagOn(Fcb->Ext2Mcb->FileAttr ,FILE_ATTRIBUTE_DIRECTORY))
            {
                IoStatus->Status = STATUS_INVALID_PARAMETER;
                Status = TRUE;
                __leave;
            }
#if DBG         
            Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockSingle: %-16.16s %-31s %s\n",
                (PUCHAR) Process + gProcessNameOffset,
                "FASTIO_UNLOCK_ALL",
                Fcb->AnsiFileName.Buffer
                );
#endif          
            FsRtlEnterFileSystem();
            
            IoStatus->Status = FsRtlFastUnlockAll(
                &Fcb->FileLockAnchor,
                FileObject,
                Process,
                NULL        );
            
            IoStatus->Information = 0;
            
            Status =  TRUE;
        }
        __except (EXCEPTION_EXECUTE_HANDLER)
        {
            IoStatus->Status = GetExceptionCode();
            Status = TRUE;
        }
    }
    __finally
    {
        FsRtlExitFileSystem();
    }

#if DBG 
    if (Status == FALSE)
    {
        Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockSingle: %-16.16s %-31s *** Status: FALSE ***\n",
            (PUCHAR) Process + gProcessNameOffset,
            "FASTIO_UNLOCK_ALL"
            );
    }
    else if (IoStatus->Status != STATUS_SUCCESS)
    {
        Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockSingle: %-16.16s %-31s *** Status: %s (%#x) ***\n",
            (PUCHAR) Process + gProcessNameOffset,
            "FASTIO_UNLOCK_ALL",
            Ext2DbgNtStatusToString(IoStatus->Status),
            IoStatus->Status
            );
    }
#endif  
    return Status;
}

BOOLEAN
Ext2FastIoUnlockAllByKey (
             IN PFILE_OBJECT         FileObject,
             IN PEPROCESS            Process,
             IN ULONG                Key,
             OUT PIO_STATUS_BLOCK    IoStatus,
             IN PDEVICE_OBJECT       DeviceObject
             )
{
    BOOLEAN     Status = FALSE;
    PEXT2_FCB   Fcb;
    
    __try
    {
        __try
        {
            if (DeviceObject == gExt2Global->DeviceObject)
            {
                IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
                Status = TRUE;
                __leave;
            }
            
            Fcb = (PEXT2_FCB) FileObject->FsContext;
            
            ASSERT(Fcb != NULL);
            
            if (Fcb->Identifier.Type == EXT2VCB)
            {
                IoStatus->Status = STATUS_INVALID_PARAMETER;
                Status = TRUE;
                __leave;
            }
            
            ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
                (Fcb->Identifier.Size == sizeof(EXT2_FCB)));
            
            if (FlagOn(Fcb->Ext2Mcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY))
            {
                IoStatus->Status = STATUS_INVALID_PARAMETER;
                Status = TRUE;
                __leave;
            }
#if DBG         
            Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockAllByKey: %-16.16s %-31s %s\n",
                (PUCHAR) Process + gProcessNameOffset,
                "FASTIO_UNLOCK_ALL_BY_KEY",
                Fcb->AnsiFileName.Buffer
                );
#endif          
            Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockAllByKey: Key: %u\n",
                Key
                );
            
            FsRtlEnterFileSystem();
            
            IoStatus->Status = FsRtlFastUnlockAllByKey(
                &Fcb->FileLockAnchor,
                FileObject,
                Process,
                Key,
                NULL
                );  
            
            IoStatus->Information = 0;
            
            Status =  TRUE;
        }

        __except (EXCEPTION_EXECUTE_HANDLER)
        {
            IoStatus->Status = GetExceptionCode();
            Status = TRUE;
        }
    }

    __finally
    {
        FsRtlExitFileSystem();
    }
#if DBG 
    if (Status == FALSE)
    {
        Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockAllByKey: %-16.16s %-31s *** Status: FALSE ***\n",
            (PUCHAR) Process + gProcessNameOffset,
            "FASTIO_UNLOCK_ALL_BY_KEY"
            );
    }
    else if (IoStatus->Status != STATUS_SUCCESS)
    {
        Ext2DbgPrint(D_FASTIO, "Ext2FastIoUnlockAllByKey: %-16.16s %-31s *** Status: %s (%#x) ***\n",
            (PUCHAR) Process + gProcessNameOffset,
            "FASTIO_UNLOCK_ALL_BY_KEY",
            Ext2DbgNtStatusToString(IoStatus->Status),
            IoStatus->Status
            );
    }
#endif  
    return Status;
}

⌨️ 快捷键说明

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