mirror of
https://github.com/reactos/reactos.git
synced 2024-06-30 18:01:07 +00:00
[FASTFAT]
Update the FCB cached dir entry in case of a rename. CORE-11150 #resolve #comment Fixed in r71209 svn path=/trunk/; revision=71209
This commit is contained in:
parent
4d606b20df
commit
f5eff4b750
|
@ -84,13 +84,14 @@ vfatRenameEntry(
|
|||
PVOID Context = NULL;
|
||||
LARGE_INTEGER Offset;
|
||||
PFATX_DIR_ENTRY pDirEntry;
|
||||
UNICODE_STRING ShortName;
|
||||
NTSTATUS Status;
|
||||
|
||||
DPRINT("vfatRenameEntry(%p, %p, %wZ, %d)\n", DeviceExt, pFcb, FileName, CaseChangeOnly);
|
||||
|
||||
if (pFcb->Flags & FCB_IS_FATX_ENTRY)
|
||||
{
|
||||
VFAT_DIRENTRY_CONTEXT DirContext;
|
||||
|
||||
/* Open associated dir entry */
|
||||
StartIndex = pFcb->startIndex;
|
||||
Offset.u.HighPart = 0;
|
||||
|
@ -115,10 +116,12 @@ vfatRenameEntry(
|
|||
CcUnpinData(Context);
|
||||
|
||||
/* Update FCB */
|
||||
ShortName.Length = 0;
|
||||
ShortName.MaximumLength = 0;
|
||||
ShortName.Buffer = NULL;
|
||||
Status = vfatUpdateFCB(DeviceExt, pFcb, FileName, &ShortName, pFcb->parentFcb);
|
||||
DirContext.ShortNameU.Length = 0;
|
||||
DirContext.ShortNameU.MaximumLength = 0;
|
||||
DirContext.ShortNameU.Buffer = NULL;
|
||||
DirContext.LongNameU = *FileName;
|
||||
DirContext.DirEntry.FatX = *pDirEntry;
|
||||
Status = vfatUpdateFCB(DeviceExt, pFcb, &DirContext, pFcb->parentFcb);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
CcPurgeCacheSection(&pFcb->parentFcb->SectionObjectPointers, NULL, 0, FALSE);
|
||||
|
@ -588,7 +591,7 @@ FATAddEntry(
|
|||
if (MoveContext != NULL)
|
||||
{
|
||||
/* We're modifying an existing FCB - likely rename/move */
|
||||
Status = vfatUpdateFCB(DeviceExt, *Fcb, &DirContext.LongNameU, &DirContext.ShortNameU, ParentFcb);
|
||||
Status = vfatUpdateFCB(DeviceExt, *Fcb, &DirContext, ParentFcb);
|
||||
(*Fcb)->dirIndex = DirContext.DirIndex;
|
||||
(*Fcb)->startIndex = DirContext.StartIndex;
|
||||
}
|
||||
|
@ -744,7 +747,7 @@ FATXAddEntry(
|
|||
{
|
||||
/* We're modifying an existing FCB - likely rename/move */
|
||||
/* FIXME: check status */
|
||||
vfatUpdateFCB(DeviceExt, *Fcb, &DirContext.LongNameU, &DirContext.ShortNameU, ParentFcb);
|
||||
vfatUpdateFCB(DeviceExt, *Fcb, &DirContext, ParentFcb);
|
||||
(*Fcb)->dirIndex = DirContext.DirIndex;
|
||||
(*Fcb)->startIndex = DirContext.StartIndex;
|
||||
}
|
||||
|
|
|
@ -362,17 +362,16 @@ NTSTATUS
|
|||
vfatUpdateFCB(
|
||||
PDEVICE_EXTENSION pVCB,
|
||||
PVFATFCB Fcb,
|
||||
PUNICODE_STRING LongName,
|
||||
PUNICODE_STRING ShortName,
|
||||
PVFAT_DIRENTRY_CONTEXT DirContext,
|
||||
PVFATFCB ParentFcb)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PVFATFCB OldParent;
|
||||
|
||||
DPRINT("vfatUpdateFCB(%p, %p, %wZ, %wZ, %p)\n", pVCB, Fcb, LongName, ShortName, ParentFcb);
|
||||
DPRINT("vfatUpdateFCB(%p, %p, %p, %p)\n", pVCB, Fcb, DirContext, ParentFcb);
|
||||
|
||||
/* Get full path name */
|
||||
Status = vfatMakeFullName(ParentFcb, LongName, ShortName, &Fcb->PathNameU);
|
||||
Status = vfatMakeFullName(ParentFcb, &DirContext->LongNameU, &DirContext->ShortNameU, &Fcb->PathNameU);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return Status;
|
||||
|
@ -393,18 +392,23 @@ vfatUpdateFCB(
|
|||
vfatSplitPathName(&Fcb->PathNameU, &Fcb->DirNameU, &Fcb->LongNameU);
|
||||
|
||||
/* Copy short name */
|
||||
RtlCopyUnicodeString(&Fcb->ShortNameU, ShortName);
|
||||
RtlCopyUnicodeString(&Fcb->ShortNameU, &DirContext->ShortNameU);
|
||||
|
||||
/* Recompute hashes */
|
||||
Fcb->Hash.Hash = vfatNameHash(0, &Fcb->PathNameU);
|
||||
if (pVCB->Flags & VCB_IS_FATX)
|
||||
{
|
||||
Fcb->ShortHash.Hash = Fcb->Hash.Hash;
|
||||
|
||||
RtlCopyMemory(Fcb->entry.FatX.Filename, DirContext->DirEntry.FatX.Filename, 42);
|
||||
Fcb->entry.FatX.FilenameLength = DirContext->DirEntry.FatX.FilenameLength;
|
||||
}
|
||||
else
|
||||
{
|
||||
Fcb->ShortHash.Hash = vfatNameHash(0, &Fcb->DirNameU);
|
||||
Fcb->ShortHash.Hash = vfatNameHash(Fcb->ShortHash.Hash, &Fcb->ShortNameU);
|
||||
|
||||
RtlCopyMemory(Fcb->entry.Fat.ShortName, DirContext->DirEntry.Fat.ShortName, 11);
|
||||
}
|
||||
|
||||
/* Set parent */
|
||||
|
|
|
@ -808,8 +808,7 @@ NTSTATUS
|
|||
vfatUpdateFCB(
|
||||
PDEVICE_EXTENSION pVCB,
|
||||
PVFATFCB Fcb,
|
||||
PUNICODE_STRING LongName,
|
||||
PUNICODE_STRING ShortName,
|
||||
PVFAT_DIRENTRY_CONTEXT DirContext,
|
||||
PVFATFCB ParentFcb);
|
||||
|
||||
VOID
|
||||
|
|
Loading…
Reference in a new issue