OBJECT_ATTRIBUTES ObjectAttributes;
HANDLE TargetHandle;
BOOLEAN DeletedTarget;
+ ULONG OldReferences, NewReferences;
+ PVFATFCB OldParent;
DPRINT("VfatSetRenameInfo(%p, %p, %p, %p, %p)\n", FileObject, FCB, DeviceExt, RenameInfo, TargetFileObject);
return STATUS_INVALID_PARAMETER;
}
+ OldReferences = FCB->parentFcb->RefCount;
+
/* If we are performing relative opening for rename, get FO for getting FCB and path name */
if (RenameInfo->RootDirectory != NULL)
{
if (FsRtlAreNamesEqual(&SourceFile, &NewFile, FALSE, NULL))
{
Status = STATUS_SUCCESS;
+ ASSERT(OldReferences == FCB->parentFcb->RefCount);
goto Cleanup;
}
&DeletedTarget);
if (!NT_SUCCESS(Status))
{
+ ASSERT(OldReferences == FCB->parentFcb->RefCount - 1);
+ ASSERT(OldReferences == ParentFCB->RefCount - 1);
goto Cleanup;
}
}
}
}
+
+ ASSERT(OldReferences == FCB->parentFcb->RefCount - 1); // extra grab
+ ASSERT(OldReferences == ParentFCB->RefCount - 1); // extra grab
}
else
{
+
/* Try to find target */
ParentFCB = NULL;
+ OldParent = FCB->parentFcb;
Status = vfatPrepareTargetForRename(DeviceExt,
&ParentFCB,
&NewName,
&DeletedTarget);
if (!NT_SUCCESS(Status))
{
+ ASSERT(OldReferences == FCB->parentFcb->RefCount);
goto Cleanup;
}
+ NewReferences = ParentFCB->RefCount;
+
FsRtlNotifyFullReportChange(DeviceExt->NotifySync,
&(DeviceExt->NotifyList),
(PSTRING)&FCB->PathNameU,
}
}
+ ASSERT(OldReferences == OldParent->RefCount + 1); // removed file
+ ASSERT(NewReferences == ParentFCB->RefCount - 1); // new file
Cleanup:
if (ParentFCB != NULL) vfatReleaseFCB(DeviceExt, ParentFCB);
if (NewName.Buffer != NULL) ExFreePoolWithTag(NewName.Buffer, TAG_VFAT);