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
This commit is contained in:
Hartmut Birr 2005-12-05 17:17:48 +00:00
parent 3fff0c69a3
commit 86aecb7c52

View file

@ -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)