Use a local copy of the path name in vfatGetFCBForFile, because we
change parts of the name to the on-disk names.
Modified: trunk/reactos/drivers/fs/vfat/fcb.c
_____
Modified: trunk/reactos/drivers/fs/vfat/fcb.c
--- trunk/reactos/drivers/fs/vfat/fcb.c 2005-12-05 17:04:54 UTC (rev
19910)
+++ trunk/reactos/drivers/fs/vfat/fcb.c 2005-12-05 17:17:48 UTC (rev
19911)
@@ -660,6 +660,8 @@
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 @@
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 @@
}
/* Check for an existing FCB */
- FCB = vfatGrabFCBFromTable (pVCB, pFileNameU);
+ FCB = vfatGrabFCBFromTable (pVCB, &FileNameU);
if (FCB)
{
*pFCB = FCB;
@@ -695,34 +701,34 @@
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 @@
if (FCB == NULL)
{
FCB = vfatOpenRootFCB(pVCB);
- curr = pFileNameU->Buffer;
+ curr = FileNameU.Buffer;
}
parentFCB = NULL;
@@ -743,8 +749,8 @@
{
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 @@
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 @@
{
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)