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

📄 fileinfo.c

📁 This is a ReiserFs file system driver for Windows NT/2000/XP/Vista.
💻 C
📖 第 1 页 / 共 4 页
字号:

        FileName = TargetObject->FileName;
    }

    if (FsRtlDoesNameContainWildCards(&FileName)) {
        Status = STATUS_OBJECT_NAME_INVALID;
        goto errorout;
    }

    if (TargetMcb->Inode == Fcb->RfsdMcb->Parent->Inode) {
        if (FsRtlAreNamesEqual( &FileName,
                                &(Fcb->RfsdMcb->ShortName),
                                FALSE,
                                NULL )) {
            Status = STATUS_SUCCESS;
            goto errorout;
        }
    } else {
        bMove = TRUE;
    }

    TargetDcb = TargetMcb->RfsdFcb;

    if (!TargetDcb)
        TargetDcb = RfsdCreateFcbFromMcb(Vcb, TargetMcb);

    if ((TargetMcb->Inode != Fcb->RfsdMcb->Parent->Inode) &&
        (Fcb->RfsdMcb->Parent->RfsdFcb == NULL)      ) {
        RfsdCreateFcbFromMcb(Vcb, Fcb->RfsdMcb->Parent);
    }

    if (!TargetDcb || !(Fcb->RfsdMcb->Parent->RfsdFcb)) {
        Status = STATUS_UNSUCCESSFUL;

        goto errorout;
    }

    Mcb = NULL;
    Status = RfsdLookupFileName(
                Vcb,
                &FileName,
                TargetMcb,
                &Mcb,
                &Inode ); 

    if (NT_SUCCESS(Status)) {

        if ( (!ReplaceIfExists) ||
             (IsFlagOn(Mcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY)) ||
             (IsFlagOn(Mcb->FileAttr, FILE_ATTRIBUTE_READONLY))) {
            Status = STATUS_OBJECT_NAME_COLLISION;
            goto errorout;
        }

        if (ReplaceIfExists) {
            Status = STATUS_NOT_IMPLEMENTED;
            goto errorout;
        }
    }

    if (IsDirectory(Fcb)) {

        Status = RfsdRemoveEntry( IrpContext, Vcb, 
                                  Fcb->RfsdMcb->Parent->RfsdFcb,
                                  RFSD_FT_DIR,
                                  Fcb->RfsdMcb->Inode );

        if (!NT_SUCCESS(Status)) {
            DbgBreak();

            goto errorout;
        }

        Status = RfsdAddEntry( IrpContext, Vcb, 
                               TargetDcb,
                               RFSD_FT_DIR,
                               Fcb->RfsdMcb->Inode,
                               &FileName );

        if (!NT_SUCCESS(Status)) {

            DbgBreak();

            RfsdAddEntry(  IrpContext, Vcb, 
                           Fcb->RfsdMcb->Parent->RfsdFcb,
                           RFSD_FT_DIR,
                           Fcb->RfsdMcb->Inode,
                           &Fcb->RfsdMcb->ShortName );

            goto errorout;
        }

        if( !RfsdSaveInode( IrpContext,
                            Vcb, 
                            TargetMcb->Inode,
                            TargetDcb->Inode)) {
            Status = STATUS_UNSUCCESSFUL;

            DbgBreak();

            goto errorout;
        }

        if( !RfsdSaveInode( IrpContext,
                            Vcb, 
                            Fcb->RfsdMcb->Parent->Inode,
                            Fcb->RfsdMcb->Parent->RfsdFcb->Inode)) {

            Status = STATUS_UNSUCCESSFUL;

            DbgBreak();

            goto errorout;
        }

        Status = RfsdSetParentEntry( IrpContext, Vcb, Fcb,
                                     Fcb->RfsdMcb->Parent->Inode,
                                     TargetDcb->RfsdMcb->Inode );


        if (!NT_SUCCESS(Status)) {
            DbgBreak();
            goto errorout;
        }

    } else {

        Status = RfsdRemoveEntry( IrpContext, Vcb,
                                  Fcb->RfsdMcb->Parent->RfsdFcb,
                                  RFSD_FT_REG_FILE,
                                  Fcb->RfsdMcb->Inode );
        if (!NT_SUCCESS(Status)) {
            DbgBreak();
            goto errorout;
        }

        Status = RfsdAddEntry( IrpContext,
                               Vcb, TargetDcb,
                               RFSD_FT_REG_FILE,
                               Fcb->RfsdMcb->Inode,
                               &FileName );

        if (!NT_SUCCESS(Status)) {

            DbgBreak();

            RfsdAddEntry(  IrpContext, Vcb, 
                           Fcb->RfsdMcb->Parent->RfsdFcb,
                           RFSD_FT_REG_FILE,
                           Fcb->RfsdMcb->Inode,
                           &Fcb->RfsdMcb->ShortName );

            goto errorout;
        }
    }

    if (NT_SUCCESS(Status)) {

        if (Fcb->RfsdMcb->ShortName.MaximumLength < (FileName.Length + 2)) {

            ExFreePool(Fcb->RfsdMcb->ShortName.Buffer);
            Fcb->RfsdMcb->ShortName.Buffer = 
                ExAllocatePool(PagedPool, FileName.Length + 2);

            if (!Fcb->RfsdMcb->ShortName.Buffer) {
                Status = STATUS_INSUFFICIENT_RESOURCES;
                goto errorout;
            }

            Fcb->RfsdMcb->ShortName.MaximumLength = FileName.Length + 2;
        }

        {
            RtlZeroMemory( Fcb->RfsdMcb->ShortName.Buffer,
                           Fcb->RfsdMcb->ShortName.MaximumLength);

            RtlCopyMemory( Fcb->RfsdMcb->ShortName.Buffer,
                           FileName.Buffer, FileName.Length);

            Fcb->RfsdMcb->ShortName.Length = FileName.Length;
        }
    
#if DBG    

        Fcb->AnsiFileName.Length = (USHORT)
            RfsdUnicodeToOEMSize(&FileName) + 1;

        if (Fcb->AnsiFileName.MaximumLength < FileName.Length) {
            ExFreePool(Fcb->AnsiFileName.Buffer);

            Fcb->AnsiFileName.Buffer = 
                ExAllocatePool(PagedPool, Fcb->AnsiFileName.Length + 1);

            if (!Fcb->AnsiFileName.Buffer)  {
                Status = STATUS_INSUFFICIENT_RESOURCES;
                goto errorout;
            }

            RtlZeroMemory( Fcb->AnsiFileName.Buffer, 
                           Fcb->AnsiFileName.Length + 1);
            Fcb->AnsiFileName.MaximumLength = 
                           Fcb->AnsiFileName.Length + 1;
        }

        RfsdUnicodeToOEM( &(Fcb->AnsiFileName),
                          &FileName          );

#endif

        if (bMove) {

            RfsdNotifyReportChange(
                       IrpContext,
                       Vcb,
                       Fcb,
                       (IsDirectory(Fcb) ?
                         FILE_NOTIFY_CHANGE_DIR_NAME :
                         FILE_NOTIFY_CHANGE_FILE_NAME ),
                       FILE_ACTION_REMOVED);

        } else {

            RfsdNotifyReportChange(
                       IrpContext,
                       Vcb,
                       Fcb,
                       (IsDirectory(Fcb) ?
                         FILE_NOTIFY_CHANGE_DIR_NAME :
                         FILE_NOTIFY_CHANGE_FILE_NAME ),
                       FILE_ACTION_RENAMED_OLD_NAME);

        }

        RfsdDeleteMcbNode(Vcb, Fcb->RfsdMcb->Parent, Fcb->RfsdMcb);
        RfsdAddMcbNode(Vcb, TargetMcb, Fcb->RfsdMcb);

        if (bMove) {

            RfsdNotifyReportChange(
                       IrpContext,
                       Vcb,
                       Fcb,
                       (IsDirectory(Fcb) ?
                         FILE_NOTIFY_CHANGE_DIR_NAME :
                         FILE_NOTIFY_CHANGE_FILE_NAME ),
                       FILE_ACTION_ADDED);
        } else {

            RfsdNotifyReportChange(
                       IrpContext,
                       Vcb,
                       Fcb,
                       (IsDirectory(Fcb) ?
                         FILE_NOTIFY_CHANGE_DIR_NAME :
                         FILE_NOTIFY_CHANGE_FILE_NAME ),
                       FILE_ACTION_RENAMED_NEW_NAME  );

        }
    }

errorout:

    return Status;
}
#endif

#if DISABLED
NTSTATUS
RfsdDeleteFile(
        PRFSD_IRP_CONTEXT IrpContext,
        PRFSD_VCB Vcb,
        PRFSD_FCB Fcb )
{
DbgBreak();

    BOOLEAN         bRet = FALSE;
    LARGE_INTEGER   AllocationSize;
    PRFSD_FCB       Dcb = NULL;

    NTSTATUS        Status = STATUS_SUCCESS;

    RfsdPrint((DBG_INFO, "RfsdDeleteFile: File %S (%xh) will be deleted!\n",
                         Fcb->RfsdMcb->ShortName.Buffer, Fcb->RfsdMcb->Inode));

    if (IsFlagOn(Fcb->Flags, FCB_FILE_DELETED)) {
        return Status;
    }

    if (FlagOn(Fcb->RfsdMcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY)) {
        if (!RfsdIsDirectoryEmpty(Vcb, Fcb)) {
            ClearFlag(Fcb->Flags, FCB_DELETE_PENDING);
            
            return STATUS_DIRECTORY_NOT_EMPTY;
        }
    }

    RfsdPrint((DBG_INFO, "RfsdDeleteFile: RFSDSB->S_FREE_BLOCKS = %xh .\n",
                         Vcb->SuperBlock->s_free_blocks_count));

    if (IsDirectory(Fcb)) {
        if (Fcb->Inode->i_links_count <= 2) {
        } else {
            Status = STATUS_CANNOT_DELETE;
        }
    } else {
        if (Fcb->Inode->i_links_count <= 1) {
        } else {
            Status = STATUS_CANNOT_DELETE;
        }
    }

    if (!NT_SUCCESS(Status)) {
        DbgBreak();
        return Status;
    }

    if (Fcb->RfsdMcb->Parent->RfsdFcb) {

        Status = RfsdRemoveEntry(
                    IrpContext, Vcb, 
                    Fcb->RfsdMcb->Parent->RfsdFcb,
                    (FlagOn(Fcb->RfsdMcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY) ?
                     RFSD_FT_DIR : RFSD_FT_REG_FILE),
                    Fcb->RfsdMcb->Inode);
    } else {

        Dcb = RfsdCreateFcbFromMcb(Vcb, Fcb->RfsdMcb->Parent);
        if (Dcb) {
            Status = RfsdRemoveEntry(
                        IrpContext, Vcb, Dcb,
                        (FlagOn(Fcb->RfsdMcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY) ?
                        RFSD_FT_DIR : RFSD_FT_REG_FILE),
                        Fcb->RfsdMcb->Inode);
        }
    }

    if (NT_SUCCESS(Status)) {

        LARGE_INTEGER   SysTime;
        KeQuerySystemTime(&SysTime);

        AllocationSize.QuadPart = (LONGLONG)0;

        Status = RfsdTruncateFile(IrpContext, Vcb, Fcb, &AllocationSize);

        //
        // Update the inode's data length . It should be ZERO if succeeds.
        //

        if (Fcb->Header.FileSize.QuadPart > Fcb->Header.AllocationSize.QuadPart) {

            Fcb->Header.FileSize.QuadPart = Fcb->Header.AllocationSize.QuadPart;
            Fcb->Inode->i_size = Fcb->Header.AllocationSize.QuadPart;
        }
    
        Fcb->Inode->i_links_count = 0;        

        RfsdSaveInode(IrpContext, Vcb, Fcb->RfsdMcb->Inode, Fcb->Inode);

        if (IsDirectory(Fcb)) {
            bRet = RfsdFreeInode(IrpContext, Vcb, Fcb->RfsdMcb->Inode, RFSD_FT_DIR);
        } else {
            bRet = RfsdFreeInode(IrpContext, Vcb, Fcb->RfsdMcb->Inode, RFSD_FT_REG_FILE);
        }

        SetFlag(Fcb->Flags, FCB_FILE_DELETED);
        RfsdDeleteMcbNode(Vcb, Fcb->RfsdMcb->Parent, Fcb->RfsdMcb);

    } else {
        DbgBreak();
        RfsdSaveInode(IrpContext, Vcb, Fcb->RfsdMcb->Inode, Fcb->Inode);
    }

    RfsdPrint((DBG_INFO, "RfsdDeleteFile: Succeed... RFSDSB->S_FREE_BLOCKS = %xh .\n",
                         Vcb->SuperBlock->s_free_blocks_count));

    return Status;
}
#endif

⌨️ 快捷键说明

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