Based on a patch by Herve Poussineau poussine@freesurf.fr: - Compile using W32API. - Use documented structures names instead of ReactOS equivalent. - Get rid of MAX_PATH constant (only valid in user mode). 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 _____
Modified: trunk/reactos/drivers/fs/vfat/create.c --- 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; }
_____
Modified: trunk/reactos/drivers/fs/vfat/dir.c --- 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; _____
Modified: trunk/reactos/drivers/fs/vfat/dirwr.c --- 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; _____
Modified: trunk/reactos/drivers/fs/vfat/fcb.c --- 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; } _____
Modified: trunk/reactos/drivers/fs/vfat/finfo.c --- 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)) { _____
Modified: trunk/reactos/drivers/fs/vfat/fsctl.c --- 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.HighPar t = 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; _____
Modified: trunk/reactos/drivers/fs/vfat/makefile --- 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 _____
Modified: trunk/reactos/drivers/fs/vfat/rw.c --- 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>
_____
Modified: trunk/reactos/drivers/fs/vfat/vfat.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];