Modified: trunk/reactos/drivers/fs/vfat/create.c
Modified: trunk/reactos/drivers/fs/vfat/dir.c
Modified: trunk/reactos/drivers/fs/vfat/dirwr.c
Modified: trunk/reactos/drivers/fs/vfat/fcb.c
Modified: trunk/reactos/drivers/fs/vfat/finfo.c
Modified: trunk/reactos/drivers/fs/vfat/fsctl.c
Modified: trunk/reactos/drivers/fs/vfat/makefile
Modified: trunk/reactos/drivers/fs/vfat/rw.c
Modified: trunk/reactos/drivers/fs/vfat/vfat.h
--- trunk/reactos/drivers/fs/vfat/create.c 2005-01-12 11:07:31 UTC (rev 12956)
+++ trunk/reactos/drivers/fs/vfat/create.c 2005-01-12 12:06:15 UTC (rev 12957)
@@ -41,7 +41,7 @@
void vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry, PUNICODE_STRING NameU)
{
OEM_STRING StringA;
- ULONG Length;
+ USHORT Length;
CHAR cString[12];
RtlCopyMemory(cString, pEntry->Filename, 11);
@@ -191,22 +191,39 @@
* FUNCTION: Find a file
*/
{
- WCHAR PathNameBuffer[MAX_PATH];
+ PWCHAR PathNameBuffer;
+ ULONG PathNameBufferLength;
NTSTATUS Status;
PVOID Context = NULL;
PVOID Page;
PVFATFCB rcFcb;
BOOLEAN Found;
UNICODE_STRING PathNameU;
+ UNICODE_STRING FileToFindUpcase;
BOOLEAN WildCard;
DPRINT ("FindFile(Parent %x, FileToFind '%wZ', DirIndex: %d)\n",
Parent, FileToFindU, DirContext->DirIndex);
DPRINT ("FindFile: Path %wZ)\n",&Parent->PathNameU);
+
+ PathNameBufferLength = Parent->PathNameU.Length + LONGNAME_MAX_LENGTH + 2 * sizeof(WCHAR);
+ if (PathNameBufferLength > (USHRT_MAX - 2) * sizeof(WCHAR))
+ {
+ /* A valid filename can't be so long. Do as if the file doesn't exist. */
+ CHECKPOINT;
+ return STATUS_NO_SUCH_FILE;
+ }
+
+ PathNameBuffer = ExAllocatePool(NonPagedPool, PathNameBufferLength);
+ if (!PathNameBuffer)
+ {
+ CHECKPOINT1;
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
PathNameU.Buffer = PathNameBuffer;
PathNameU.Length = 0;
- PathNameU.MaximumLength = sizeof(PathNameBuffer);
+ PathNameU.MaximumLength = PathNameBufferLength;
DirContext->LongNameU.Length = 0;
DirContext->ShortNameU.Length = 0;
@@ -244,10 +261,21 @@
Status = STATUS_UNSUCCESSFUL;
}
vfatReleaseFCB(DeviceExt, rcFcb);
+ ExFreePool(PathNameBuffer);
return Status;
}
}
+ /* FsRtlIsNameInExpression need the searched string to be upcase,
+ * even if IgnoreCase is specified */
+ Status = RtlUpcaseUnicodeString(&FileToFindUpcase, FileToFindU, TRUE);
+ if (!NT_SUCCESS(Status))
+ {
+ CHECKPOINT;
+ ExFreePool(PathNameBuffer);
+ return Status;
+ }
+
while(TRUE)
{
Status = DeviceExt->GetNextDirEntry(&Context, &Page, Parent, DirContext, First);
@@ -263,14 +291,13 @@
}
if (WildCard)
{
- Found = FsRtlIsNameInExpression(FileToFindU, &DirContext->LongNameU, TRUE, NULL) ||
- FsRtlIsNameInExpression(FileToFindU, &DirContext->ShortNameU, TRUE, NULL);
+ Found = FsRtlIsNameInExpression(&FileToFindUpcase, &DirContext->LongNameU, TRUE, NULL) ||
+ FsRtlIsNameInExpression(&FileToFindUpcase, &DirContext->ShortNameU, TRUE, NULL);
}
else
{
- /* FIXME: Use FsRtlAreNamesEqual */
- Found = RtlEqualUnicodeString(&DirContext->LongNameU, FileToFindU, TRUE) ||
- RtlEqualUnicodeString(&DirContext->ShortNameU, FileToFindU, TRUE);
+ Found = FsRtlAreNamesEqual(&DirContext->LongNameU, FileToFindU, TRUE, NULL) ||
+ FsRtlAreNamesEqual(&DirContext->ShortNameU, FileToFindU, TRUE, NULL);
}
if (Found)
@@ -300,6 +327,8 @@
{
CcUnpinData(Context);
}
+ RtlFreeUnicodeString(&FileToFindUpcase);
+ ExFreePool(PathNameBuffer);
return STATUS_SUCCESS;
}
DirContext->DirIndex++;
@@ -310,6 +339,8 @@
CcUnpinData(Context);
}
+ RtlFreeUnicodeString(&FileToFindUpcase);
+ ExFreePool(PathNameBuffer);
return Status;
}
--- trunk/reactos/drivers/fs/vfat/dir.c 2005-01-12 11:07:31 UTC (rev 12956)
+++ trunk/reactos/drivers/fs/vfat/dir.c 2005-01-12 12:06:15 UTC (rev 12957)
@@ -311,7 +311,7 @@
BOOLEAN First = FALSE;
BOOLEAN FirstCall;
VFAT_DIRENTRY_CONTEXT DirContext;
- WCHAR LongNameBuffer[MAX_PATH];
+ WCHAR LongNameBuffer[LONGNAME_MAX_LENGTH];
WCHAR ShortNameBuffer[13];
PIO_STACK_LOCATION Stack = IrpContext->Stack;
@@ -344,7 +344,13 @@
}
/* Obtain the callers parameters */
+#ifdef _MSC_VER
+ /* HACKHACK: Bug in the MS ntifs.h header:
+ * FileName is really a PUNICODE_STRING, not a PSTRING */
+ pSearchPattern = (PUNICODE_STRING)Stack->Parameters.QueryDirectory.FileName;
+#else
pSearchPattern = Stack->Parameters.QueryDirectory.FileName;
+#endif
FileInformationClass =
Stack->Parameters.QueryDirectory.FileInformationClass;
FileIndex = Stack->Parameters.QueryDirectory.FileIndex;
--- trunk/reactos/drivers/fs/vfat/dirwr.c 2005-01-12 11:07:31 UTC (rev 12956)
+++ trunk/reactos/drivers/fs/vfat/dirwr.c 2005-01-12 12:06:15 UTC (rev 12957)
@@ -211,7 +211,7 @@
BOOLEAN SpacesFound;
VFAT_DIRENTRY_CONTEXT DirContext;
- WCHAR LongNameBuffer[MAX_PATH];
+ WCHAR LongNameBuffer[LONGNAME_MAX_LENGTH];
WCHAR ShortNameBuffer[13];
DPRINT ("addEntry: Name='%wZ', Dir='%wZ'\n", NameU, &ParentFcb->PathNameU);
@@ -370,16 +370,6 @@
}
/* set dates and times */
KeQuerySystemTime (&SystemTime);
-#if 0
- {
- TIME_FIELDS tf;
- RtlTimeToTimeFields (&SystemTime, &tf);
- DPRINT1("%d.%d.%d %02d:%02d:%02d.%03d '%wZ'\n",
- tf.Day, tf.Month, tf.Year, tf.Hour,
- tf.Minute, tf.Second, tf.Milliseconds,
- NameU);
- }
-#endif
FsdSystemTimeToDosDateTime (DeviceExt, &SystemTime, &DirContext.DirEntry.Fat.CreationDate,
&DirContext.DirEntry.Fat.CreationTime);
DirContext.DirEntry.Fat.UpdateDate = DirContext.DirEntry.Fat.CreationDate;
@@ -566,7 +556,7 @@
NameA.Length = 0;
NameA.MaximumLength = 42;
RtlUnicodeStringToOemString(&NameA, &DirContext.LongNameU, FALSE);
- DirContext.DirEntry.FatX.FilenameLength = NameA.Length;
+ DirContext.DirEntry.FatX.FilenameLength = (unsigned char)NameA.Length;
/* set attributes */
DirContext.DirEntry.FatX.Attrib = ReqAttr;
--- trunk/reactos/drivers/fs/vfat/fcb.c 2005-01-12 11:07:31 UTC (rev 12956)
+++ trunk/reactos/drivers/fs/vfat/fcb.c 2005-01-12 12:06:15 UTC (rev 12957)
@@ -14,7 +14,6 @@
/* ------------------------------------------------------- INCLUDES */
#include <ddk/ntddk.h>
-#include <ntos/kefuncs.h>
#include <wchar.h>
#include <limits.h>
#include <rosrtl/string.h>
@@ -26,7 +25,6 @@
/* -------------------------------------------------------- DEFINES */
-#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
#define TAG_FCB TAG('V', 'F', 'C', 'B')
#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
@@ -55,7 +53,7 @@
vfatSplitPathName(PUNICODE_STRING PathNameU, PUNICODE_STRING DirNameU, PUNICODE_STRING FileNameU)
{
PWCHAR pName;
- ULONG Length = 0;
+ USHORT Length = 0;
pName = PathNameU->Buffer + PathNameU->Length / sizeof(WCHAR) - 1;
while (*pName != L'\\' && pName >= PathNameU->Buffer)
{
@@ -79,9 +77,24 @@
VOID
vfatInitFcb(PVFATFCB Fcb, PUNICODE_STRING NameU)
{
+ ULONG PathNameBufferLength;
+
+ if (NameU)
+ PathNameBufferLength = NameU->Length + sizeof(WCHAR);
+ else
+ PathNameBufferLength = 0;
+
+ Fcb->PathNameBuffer = ExAllocatePool(NonPagedPool, PathNameBufferLength);
+ if (!Fcb->PathNameBuffer)
+ {
+ /* FIXME: what to do if no more memory? */
+ DPRINT1("Unable to initialize FCB for filename '%wZ'\n", NameU);
+ KEBUGCHECKEX(0, (ULONG_PTR)Fcb, (ULONG_PTR)NameU, 0, 0);
+ }
+
Fcb->PathNameU.Length = 0;
Fcb->PathNameU.Buffer = Fcb->PathNameBuffer;
- Fcb->PathNameU.MaximumLength = sizeof(Fcb->PathNameBuffer);
+ Fcb->PathNameU.MaximumLength = PathNameBufferLength;
Fcb->ShortNameU.Length = 0;
Fcb->ShortNameU.Buffer = Fcb->ShortNameBuffer;
Fcb->ShortNameU.MaximumLength = sizeof(Fcb->ShortNameBuffer);
@@ -146,6 +159,7 @@
vfatDestroyFCB(PVFATFCB pFCB)
{
FsRtlUninitializeFileLock(&pFCB->FileLock);
+ ExFreePool(pFCB->PathNameBuffer);
ExDeleteResourceLite(&pFCB->PagingIoResource);
ExDeleteResourceLite(&pFCB->MainResource);
ExFreeToNPagedLookasideList(&VfatGlobalData->FcbLookasideList, pFCB);
@@ -431,20 +445,28 @@
PVFATFCB* fileFCB)
{
PVFATFCB rcFCB;
- WCHAR pathName [MAX_PATH];
+ PWCHAR PathNameBuffer;
+ ULONG PathNameLength;
ULONG Size;
ULONG hash;
UNICODE_STRING NameU;
- if (directoryFCB->PathNameU.Length + 2 * sizeof(WCHAR) +
- + DirContext->LongNameU.Length > MAX_PATH * sizeof(WCHAR))
+ PathNameLength = (directoryFCB->PathNameU.Length + 2 * sizeof(WCHAR)
+ + DirContext->LongNameU.Length) * sizeof(WCHAR);
+
+ if (PathNameLength > (USHRT_MAX - 2) * sizeof(WCHAR))
{
return STATUS_OBJECT_NAME_INVALID;
}
- NameU.Buffer = pathName;
+ PathNameBuffer = ExAllocatePool(NonPagedPool, PathNameLength);
+ if (!PathNameBuffer)
+ {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ NameU.Buffer = PathNameBuffer;
NameU.Length = 0;
- NameU.MaximumLength = sizeof(pathName);
+ NameU.MaximumLength = PathNameLength;
RtlCopyUnicodeString(&NameU, &directoryFCB->PathNameU);
if (!vfatFCBIsRoot (directoryFCB))
@@ -516,6 +538,7 @@
vfatAddFCBToTable (vcb, rcFCB);
*fileFCB = rcFCB;
+ ExFreePool(PathNameBuffer);
return STATUS_SUCCESS;
}
@@ -553,7 +576,7 @@
PVOID Page = NULL;
BOOLEAN First = TRUE;
VFAT_DIRENTRY_CONTEXT DirContext;
- WCHAR LongNameBuffer[MAX_PATH];
+ WCHAR LongNameBuffer[LONGNAME_MAX_LENGTH];
WCHAR ShortNameBuffer[13];
BOOLEAN FoundLong = FALSE;
BOOLEAN FoundShort = FALSE;
@@ -690,9 +713,9 @@
vfatReleaseFCB (pVCB, FCB);
return STATUS_OBJECT_NAME_INVALID;
}
- memmove(pFileNameU->Buffer + FCB->PathNameU.Length / sizeof(WCHAR),
+ RtlMoveMemory(pFileNameU->Buffer + FCB->PathNameU.Length / sizeof(WCHAR),
curr, pFileNameU->Length - Length);
- pFileNameU->Length += FCB->PathNameU.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;
}
@@ -751,9 +774,9 @@
vfatReleaseFCB (pVCB, parentFCB);
return STATUS_OBJECT_NAME_INVALID;
}
- memmove(prev + parentFCB->LongNameU.Length / sizeof(WCHAR), curr,
+ RtlMoveMemory(prev + parentFCB->LongNameU.Length / sizeof(WCHAR), curr,
pFileNameU->Length - (curr - pFileNameU->Buffer) * sizeof(WCHAR));
- pFileNameU->Length += parentFCB->LongNameU.Length - Length;
+ pFileNameU->Length += (USHORT)(parentFCB->LongNameU.Length - Length);
curr = prev + parentFCB->LongNameU.Length / sizeof(WCHAR);
last = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR) - 1;
}
--- trunk/reactos/drivers/fs/vfat/finfo.c 2005-01-12 11:07:31 UTC (rev 12956)
+++ trunk/reactos/drivers/fs/vfat/finfo.c 2005-01-12 12:06:15 UTC (rev 12957)
@@ -226,8 +226,9 @@
PFILE_DISPOSITION_INFORMATION DispositionInfo)
{
NTSTATUS Status = STATUS_SUCCESS;
-
+#ifdef DBG
PDEVICE_EXTENSION DeviceExt = DeviceObject->DeviceExtension;
+#endif
DPRINT ("FsdSetDispositionInformation()\n");
@@ -248,7 +249,7 @@
return STATUS_ACCESS_DENIED;
}
- if (DispositionInfo->DoDeleteFile)
+ if (DispositionInfo->DeleteFile)
{
if (MmFlushImageSection (FileObject->SectionObjectPointer, MmFlushForDelete))
{
--- trunk/reactos/drivers/fs/vfat/fsctl.c 2005-01-12 11:07:31 UTC (rev 12956)
+++ trunk/reactos/drivers/fs/vfat/fsctl.c 2005-01-12 12:06:15 UTC (rev 12957)
@@ -27,7 +27,6 @@
/* INCLUDES *****************************************************************/
#include <ddk/ntddk.h>
-#include <ntos/kefuncs.h>
#include <rosrtl/string.h>
#include <wchar.h>
@@ -654,9 +653,9 @@
static NTSTATUS
VfatGetRetrievalPointers(PVFAT_IRP_CONTEXT IrpContext)
{
- PIO_STACK_LOCATION Stack;
+ PIO_STACK_LOCATION Stack;
LARGE_INTEGER Vcn;
- PGET_RETRIEVAL_DESCRIPTOR RetrievalPointers;
+ PRETRIEVAL_POINTERS_BUFFER RetrievalPointers;
PFILE_OBJECT FileObject;
ULONG MaxExtentCount;
PVFATFCB Fcb;
@@ -677,7 +676,7 @@
return STATUS_INVALID_PARAMETER;
}
if (IrpContext->Irp->UserBuffer == NULL ||
- Stack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(GET_RETRIEVAL_DESCRIPTOR) + sizeof(MAPPING_PAIR))
+ Stack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(RETRIEVAL_POINTERS_BUFFER))
{
return STATUS_BUFFER_TOO_SMALL;
}
@@ -689,7 +688,7 @@
Vcn = *(PLARGE_INTEGER)Stack->Parameters.DeviceIoControl.Type3InputBuffer;
RetrievalPointers = IrpContext->Irp->UserBuffer;
- MaxExtentCount = ((Stack->Parameters.DeviceIoControl.OutputBufferLength - sizeof(GET_RETRIEVAL_DESCRIPTOR)) / sizeof(MAPPING_PAIR));
+ MaxExtentCount = ((Stack->Parameters.DeviceIoControl.OutputBufferLength - sizeof(RetrievalPointers->ExtentCount) - sizeof(RetrievalPointers->StartingVcn)) / sizeof(RetrievalPointers->Extents[0]));
if (Vcn.QuadPart >= Fcb->RFCB.AllocationSize.QuadPart / DeviceExt->FatInfo.BytesPerCluster)
@@ -707,11 +706,12 @@
goto ByeBye;
}
- RetrievalPointers->StartVcn = Vcn.QuadPart;
- RetrievalPointers->NumberOfPairs = 0;
- RetrievalPointers->Pair[0].Lcn = CurrentCluster - 2;
+ RetrievalPointers->StartingVcn = Vcn;
+ RetrievalPointers->ExtentCount = 0;
+ RetrievalPointers->Extents[0].Lcn.u.HighPart = 0;
+ RetrievalPointers->Extents[0].Lcn.u.LowPart = CurrentCluster - 2;
LastCluster = 0;
- while (CurrentCluster != 0xffffffff && RetrievalPointers->NumberOfPairs < MaxExtentCount)
+ while (CurrentCluster != 0xffffffff && RetrievalPointers->ExtentCount < MaxExtentCount)
{
LastCluster = CurrentCluster;
@@ -724,16 +724,17 @@
if (LastCluster + 1 != CurrentCluster)
{
- RetrievalPointers->Pair[RetrievalPointers->NumberOfPairs].Vcn = Vcn.QuadPart;
- RetrievalPointers->NumberOfPairs++;
- if (RetrievalPointers->NumberOfPairs < MaxExtentCount)
+ RetrievalPointers->Extents[RetrievalPointers->ExtentCount].NextVcn = Vcn;
+ RetrievalPointers->ExtentCount++;
+ if (RetrievalPointers->ExtentCount < MaxExtentCount)
{
- RetrievalPointers->Pair[RetrievalPointers->NumberOfPairs].Lcn = CurrentCluster - 2;
+ RetrievalPointers->Extents[RetrievalPointers->ExtentCount].Lcn.u.HighPart = 0;
+ RetrievalPointers->Extents[RetrievalPointers->ExtentCount].Lcn.u.LowPart = CurrentCluster - 2;
}
}
}
- IrpContext->Irp->IoStatus.Information = sizeof(GET_RETRIEVAL_DESCRIPTOR) + sizeof(MAPPING_PAIR) * RetrievalPointers->NumberOfPairs;
+ IrpContext->Irp->IoStatus.Information = sizeof(RETRIEVAL_POINTERS_BUFFER) + (sizeof(RetrievalPointers->Extents[0]) * (RetrievalPointers->ExtentCount - 1));
Status = STATUS_SUCCESS;
ByeBye:
@@ -757,7 +758,7 @@
PROS_QUERY_LCN_MAPPING LcnQuery;
PIO_STACK_LOCATION Stack;
- DPRINT("VfatGetRetrievalPointers(IrpContext %x)\n", IrpContext);
+ DPRINT("VfatRosQueryLcnMapping(IrpContext %x)\n", IrpContext);
DeviceExt = IrpContext->DeviceExt;
Stack = IrpContext->Stack;
--- trunk/reactos/drivers/fs/vfat/makefile 2005-01-12 11:07:31 UTC (rev 12956)
+++ trunk/reactos/drivers/fs/vfat/makefile 2005-01-12 12:06:15 UTC (rev 12957)
@@ -38,9 +38,9 @@
include $(PATH_TO_TOP)/config
ifeq ($(DBG), 1)
-TARGET_CFLAGS = -Wall -Werror -g
+TARGET_CFLAGS = -D__USE_W32API -Wall -Werror -g
else
-TARGET_CFLAGS = -Wall -Werror -O3 -fno-strict-aliasing
+TARGET_CFLAGS = -D__USE_W32API -Wall -Werror -O3 -fno-strict-aliasing
endif
include $(PATH_TO_TOP)/rules.mak
--- trunk/reactos/drivers/fs/vfat/rw.c 2005-01-12 11:07:31 UTC (rev 12956)
+++ trunk/reactos/drivers/fs/vfat/rw.c 2005-01-12 12:06:15 UTC (rev 12957)
@@ -13,7 +13,6 @@
/* INCLUDES *****************************************************************/
#include <ddk/ntddk.h>
-#include <ntos/kefuncs.h>
#include <wchar.h>
#include <ntos/minmax.h>
--- trunk/reactos/drivers/fs/vfat/vfat.h 2005-01-12 11:07:31 UTC (rev 12956)
+++ trunk/reactos/drivers/fs/vfat/vfat.h 2005-01-12 12:06:15 UTC (rev 12957)
@@ -1,7 +1,28 @@
/* $Id$ */
#include <ddk/ntifs.h>
+#include <ddk/ntdddisk.h>
+#undef DeleteFile /* FIXME */
+#define USE_ROS_CC_AND_FS
+
+/* FIXME */
+#ifdef __USE_W32API
+NTSTATUS NTAPI RtlOemStringToUnicodeString(PUNICODE_STRING, CONST STRING *, BOOLEAN);
+NTSTATUS NTAPI RtlDowncaseUnicodeString(PUNICODE_STRING, PCUNICODE_STRING, BOOLEAN);
+NTSTATUS NTAPI RtlUnicodeStringToOemString(POEM_STRING, PCUNICODE_STRING, BOOLEAN);
+#endif
+
+#ifdef USE_ROS_CC_AND_FS
+NTSTATUS STDCALL CcRosInitializeFileCache(PFILE_OBJECT, ULONG);
+NTSTATUS STDCALL CcRosReleaseFileCache(PFILE_OBJECT);
+#define FSCTL_ROS_QUERY_LCN_MAPPING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
+typedef struct _ROS_QUERY_LCN_MAPPING { LARGE_INTEGER LcnDiskOffset; } ROS_QUERY_LCN_MAPPING, *PROS_QUERY_LCN_MAPPING;
+#endif
+
+#define KEBUGCHECK(a) DbgPrint("KeBugCheck at %s:%i\n",__FILE__,__LINE__), KeBugCheck(a)
+#define KEBUGCHECKEX(a,b,c,d,e) DbgPrint("KeBugCheckEx at %s:%i\n",__FILE__,__LINE__), KeBugCheckEx(a,b,c,d,e)
+
#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
#define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
@@ -75,9 +96,11 @@
typedef struct _BootSector BootSector;
-#define VFAT_CASE_LOWER_BASE 8 // base is lower case
-#define VFAT_CASE_LOWER_EXT 16 // extension is lower case
+#define VFAT_CASE_LOWER_BASE 8 // base is lower case
+#define VFAT_CASE_LOWER_EXT 16 // extension is lower case
+#define LONGNAME_MAX_LENGTH 256 // max length for a long filename
+
#define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
#define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
#define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
@@ -284,7 +307,7 @@
UNICODE_STRING PathNameU;
/* buffer for PathNameU */
- WCHAR PathNameBuffer[MAX_PATH];
+ PWCHAR PathNameBuffer;
/* buffer for ShortNameU */
WCHAR ShortNameBuffer[13];