From 86aecb7c5241e28e396c216c668a8dd8ed9e918e Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Mon, 5 Dec 2005 17:17:48 +0000 Subject: [PATCH] Use a local copy of the path name in vfatGetFCBForFile, because we change parts of the name to the on-disk names. svn path=/trunk/; revision=19911 --- reactos/drivers/fs/vfat/fcb.c | 54 +++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/reactos/drivers/fs/vfat/fcb.c b/reactos/drivers/fs/vfat/fcb.c index c9a4cf38380..1e1d6b8b62b 100644 --- a/reactos/drivers/fs/vfat/fcb.c +++ b/reactos/drivers/fs/vfat/fcb.c @@ -660,6 +660,8 @@ vfatGetFCBForFile ( PVFATFCB parentFCB; UNICODE_STRING NameU; UNICODE_STRING RootNameU = RTL_CONSTANT_STRING(L"\\"); + UNICODE_STRING FileNameU; + WCHAR NameBuffer[260]; PWCHAR curr, prev, last; ULONG Length; @@ -668,13 +670,17 @@ vfatGetFCBForFile ( pParentFCB, pFCB, pFileNameU); + + FileNameU.Buffer = NameBuffer; + FileNameU.MaximumLength = sizeof(NameBuffer); + RtlCopyUnicodeString(&FileNameU, pFileNameU); parentFCB = *pParentFCB; if (parentFCB == NULL) { // Trivial case, open of the root directory on volume - if (RtlEqualUnicodeString(pFileNameU, &RootNameU, FALSE)) + if (RtlEqualUnicodeString(&FileNameU, &RootNameU, FALSE)) { DPRINT ("returning root FCB\n"); @@ -686,7 +692,7 @@ vfatGetFCBForFile ( } /* Check for an existing FCB */ - FCB = vfatGrabFCBFromTable (pVCB, pFileNameU); + FCB = vfatGrabFCBFromTable (pVCB, &FileNameU); if (FCB) { *pFCB = FCB; @@ -695,34 +701,34 @@ vfatGetFCBForFile ( return STATUS_SUCCESS; } - last = curr = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR) - 1; - while (*curr != L'\\' && curr > pFileNameU->Buffer) + last = curr = FileNameU.Buffer + FileNameU.Length / sizeof(WCHAR) - 1; + while (*curr != L'\\' && curr > FileNameU.Buffer) { curr--; } - if (curr > pFileNameU->Buffer) + if (curr > FileNameU.Buffer) { - NameU.Buffer = pFileNameU->Buffer; - NameU.MaximumLength = NameU.Length = (curr - pFileNameU->Buffer) * sizeof(WCHAR); + NameU.Buffer = FileNameU.Buffer; + NameU.MaximumLength = NameU.Length = (curr - FileNameU.Buffer) * sizeof(WCHAR); FCB = vfatGrabFCBFromTable(pVCB, &NameU); if (FCB) { - Length = (curr - pFileNameU->Buffer) * sizeof(WCHAR); + Length = (curr - FileNameU.Buffer) * sizeof(WCHAR); if (Length != FCB->PathNameU.Length) { - if (pFileNameU->Length + FCB->PathNameU.Length - Length > pFileNameU->MaximumLength) + if (FileNameU.Length + FCB->PathNameU.Length - Length > FileNameU.MaximumLength) { vfatReleaseFCB (pVCB, FCB); return STATUS_OBJECT_NAME_INVALID; } - RtlMoveMemory(pFileNameU->Buffer + FCB->PathNameU.Length / sizeof(WCHAR), - curr, pFileNameU->Length - Length); - pFileNameU->Length += (USHORT)(FCB->PathNameU.Length - Length); - curr = pFileNameU->Buffer + FCB->PathNameU.Length / sizeof(WCHAR); - last = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR) - 1; + RtlMoveMemory(FileNameU.Buffer + FCB->PathNameU.Length / sizeof(WCHAR), + curr, FileNameU.Length - Length); + FileNameU.Length += (USHORT)(FCB->PathNameU.Length - Length); + curr = FileNameU.Buffer + FCB->PathNameU.Length / sizeof(WCHAR); + last = FileNameU.Buffer + FileNameU.Length / sizeof(WCHAR) - 1; } - RtlCopyMemory(pFileNameU->Buffer, FCB->PathNameU.Buffer, FCB->PathNameU.Length); + RtlCopyMemory(FileNameU.Buffer, FCB->PathNameU.Buffer, FCB->PathNameU.Length); } } else @@ -733,7 +739,7 @@ vfatGetFCBForFile ( if (FCB == NULL) { FCB = vfatOpenRootFCB(pVCB); - curr = pFileNameU->Buffer; + curr = FileNameU.Buffer; } parentFCB = NULL; @@ -743,8 +749,8 @@ vfatGetFCBForFile ( { FCB = parentFCB; parentFCB = NULL; - prev = curr = pFileNameU->Buffer - 1; - last = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR) - 1; + prev = curr = FileNameU.Buffer - 1; + last = FileNameU.Buffer + FileNameU.Length / sizeof(WCHAR) - 1; } while (curr <= last) @@ -772,16 +778,16 @@ vfatGetFCBForFile ( Length = (curr - prev) * sizeof(WCHAR); if (Length != parentFCB->LongNameU.Length) { - if (pFileNameU->Length + parentFCB->LongNameU.Length - Length > pFileNameU->MaximumLength) + if (FileNameU.Length + parentFCB->LongNameU.Length - Length > FileNameU.MaximumLength) { vfatReleaseFCB (pVCB, parentFCB); return STATUS_OBJECT_NAME_INVALID; } RtlMoveMemory(prev + parentFCB->LongNameU.Length / sizeof(WCHAR), curr, - pFileNameU->Length - (curr - pFileNameU->Buffer) * sizeof(WCHAR)); - pFileNameU->Length += (USHORT)(parentFCB->LongNameU.Length - Length); + FileNameU.Length - (curr - FileNameU.Buffer) * sizeof(WCHAR)); + FileNameU.Length += (USHORT)(parentFCB->LongNameU.Length - Length); curr = prev + parentFCB->LongNameU.Length / sizeof(WCHAR); - last = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR) - 1; + last = FileNameU.Buffer + FileNameU.Length / sizeof(WCHAR) - 1; } RtlCopyMemory(prev, parentFCB->LongNameU.Buffer, parentFCB->LongNameU.Length); } @@ -791,9 +797,9 @@ vfatGetFCBForFile ( { curr++; } - NameU.Buffer = pFileNameU->Buffer; + NameU.Buffer = FileNameU.Buffer; NameU.Length = (curr - NameU.Buffer) * sizeof(WCHAR); - NameU.MaximumLength = pFileNameU->MaximumLength; + NameU.MaximumLength = FileNameU.MaximumLength; DPRINT("%wZ\n", &NameU); FCB = vfatGrabFCBFromTable(pVCB, &NameU); if (FCB == NULL)