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.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;

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];