+VOID
+NTAPI
+FatSetFullFileNameInFcb(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PFCB Fcb)
+{
+ UNICODE_STRING LongName;
+ PFCB CurFcb = Fcb;
+ PFCB StopFcb;
+ PWCHAR TmpBuffer;
+ ULONG PathLength = 0;
+
+ /* Do nothing if it's already set */
+ if (Fcb->FullFileName.Buffer) return;
+
+ /* Allocate a temporary buffer */
+ LongName.Length = 0;
+ LongName.MaximumLength = FF_MAX_FILENAME * sizeof(WCHAR);
+ LongName.Buffer =
+ FsRtlAllocatePoolWithTag(PagedPool,
+ FF_MAX_FILENAME * sizeof(WCHAR),
+ TAG_FILENAME);
+
+ /* Go through all parents to calculate needed length */
+ while (CurFcb != Fcb->Vcb->RootDcb)
+ {
+ /* Does current FCB have FullFileName set? */
+ if (CurFcb != Fcb &&
+ CurFcb->FullFileName.Buffer)
+ {
+ /* Yes, just use it! */
+ PathLength += CurFcb->FullFileName.Length;
+
+ Fcb->FullFileName.Buffer =
+ FsRtlAllocatePoolWithTag(PagedPool,
+ PathLength,
+ TAG_FILENAME);
+
+ RtlCopyMemory(Fcb->FullFileName.Buffer,
+ CurFcb->FullFileName.Buffer,
+ CurFcb->FullFileName.Length);
+
+ break;
+ }
+
+ /* Sum up length of a current item */
+ PathLength += CurFcb->FileNameLength + sizeof(WCHAR);
+
+ /* Go to the parent */
+ CurFcb = CurFcb->ParentFcb;
+ }
+
+ /* Allocate FullFileName if it wasn't already allocated above */
+ if (!Fcb->FullFileName.Buffer)
+ {
+ Fcb->FullFileName.Buffer =
+ FsRtlAllocatePoolWithTag(PagedPool,
+ PathLength,
+ TAG_FILENAME);
+ }
+
+ StopFcb = CurFcb;
+
+ CurFcb = Fcb;
+ TmpBuffer = Fcb->FullFileName.Buffer + PathLength / sizeof(WCHAR);
+
+ /* Set lengths */
+ Fcb->FullFileName.Length = PathLength;
+ Fcb->FullFileName.MaximumLength = PathLength;
+
+ while (CurFcb != StopFcb)
+ {
+ /* Get its unicode name */
+ FatGetFcbUnicodeName(IrpContext,
+ CurFcb,
+ &LongName);
+
+ /* Copy it */
+ TmpBuffer -= LongName.Length / sizeof(WCHAR);
+ RtlCopyMemory(TmpBuffer, LongName.Buffer, LongName.Length);
+
+ /* Append with a backslash */
+ TmpBuffer -= 1;
+ *TmpBuffer = L'\\';
+
+ /* Go to the parent */
+ CurFcb = CurFcb->ParentFcb;
+ }
+
+ /* Free the temp buffer */
+ ExFreePool(LongName.Buffer);
+}
+
+