📄 fileinfo.c
字号:
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 + -