- Used the parent fcb instead to determine it from parent fileobject.
Modified: trunk/reactos/drivers/fs/vfat/create.c
Modified: trunk/reactos/drivers/fs/vfat/dirwr.c
Modified: trunk/reactos/drivers/fs/vfat/fcb.c
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-01 11:02:35 UTC
(rev 12686)
+++ trunk/reactos/drivers/fs/vfat/create.c      2005-01-01 11:11:52 UTC
(rev 12687)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: create.c,v 1.78 2004/12/25 11:18:38 navaraf Exp $
+/* $Id$
  *
  * PROJECT:          ReactOS kernel
  * FILE:             drivers/fs/vfat/create.c
@@ -314,46 +314,30 @@
 }
 NTSTATUS
-VfatOpenFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
-             PUNICODE_STRING FileNameU)
+VfatOpenFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
PVFATFCB* ParentFcb)
 /*
  * FUNCTION: Opens a file
  */
 {
-  PVFATFCB ParentFcb;
   PVFATFCB Fcb;
   NTSTATUS Status;
+  UNICODE_STRING PathNameU;
+  WCHAR Buffer[260];
-
-//  PDEVICE_OBJECT DeviceObject =
DeviceExt->StorageDevice->Vpb->DeviceObject;
-
   DPRINT ("VfatOpenFile(%08lx, %08lx, '%wZ')\n", DeviceExt, FileObject,
&FileObject->FileName);
   if (FileObject->RelatedFileObject)
     {
-      DPRINT ("Converting relative filename to absolute filename\n");
+      DPRINT ("'%wZ'\n",
&FileObject->RelatedFileObject->FileName);
-      Fcb = FileObject->RelatedFileObject->FsContext;
-      RtlCopyUnicodeString(FileNameU, &Fcb->PathNameU);
-      if (!vfatFCBIsRoot(Fcb))
-        {
-         RtlAppendUnicodeToString(FileNameU, L"\\");
-       }
-      RtlAppendUnicodeStringToString(FileNameU, &FileObject->FileName);
+      *ParentFcb = FileObject->RelatedFileObject->FsContext;
+      (*ParentFcb)->RefCount++;
     }
   else
     {
-      RtlCopyUnicodeString(FileNameU, &FileObject->FileName);
+      *ParentFcb = NULL;
     }
-  if (FileNameU->Length > sizeof(WCHAR) &&
-      FileNameU->Buffer[FileNameU->Length / sizeof(WCHAR) - 1] ==
L'\\')
-    {
-      FileNameU->Length -= sizeof(WCHAR);
-    }
-  FileNameU->Buffer[FileNameU->Length / sizeof(WCHAR)] = 0;
-  DPRINT ("PathName to open: '%wZ'\n", FileNameU);
-
   if (!DeviceExt->FatInfo.FixedMedia)
     {
       Status = VfatBlockDeviceIoControl (DeviceExt->StorageDevice,
@@ -382,40 +366,47 @@
       if (!NT_SUCCESS(Status))
        {
          DPRINT ("Status %lx\n", Status);
+         *ParentFcb = NULL;
          return Status;
        }
     }
+  if (*ParentFcb)
+  {
+     (*ParentFcb)->RefCount++;
+  }
-  /*  try first to find an existing FCB in memory  */
-  DPRINT ("Checking for existing FCB in memory\n");
-  Fcb = vfatGrabFCBFromTable (DeviceExt, FileNameU);
-  if (Fcb == NULL)
+  PathNameU.Buffer = Buffer;
+  PathNameU.Length = 0;
+  PathNameU.MaximumLength = sizeof(Buffer);
+  RtlCopyUnicodeString(&PathNameU, &FileObject->FileName);
+  if (PathNameU.Length > sizeof(WCHAR) &&
+      PathNameU.Buffer[PathNameU.Length / sizeof(WCHAR) - 1] == L'\\')
     {
-      DPRINT ("No existing FCB found, making a new one if file
exists.\n");
-      Status = vfatGetFCBForFile (DeviceExt, &ParentFcb, &Fcb,
FileNameU);
-      if (ParentFcb != NULL)
-        {
-          vfatReleaseFCB (DeviceExt, ParentFcb);
-        }
-      if (!NT_SUCCESS (Status))
-        {
-          DPRINT ("Could not make a new FCB, status: %x\n", Status);
-          return  Status;
-       }
+      PathNameU.Length -= sizeof(WCHAR);
     }
-  else
-    {
-      RtlCopyUnicodeString(FileNameU, &Fcb->PathNameU);
-    }
+  PathNameU.Buffer[PathNameU.Length / sizeof(WCHAR)] = 0;
+
+  /*  try first to find an existing FCB in memory  */
+  DPRINT ("Checking for existing FCB in memory\n");
+
+  Status = vfatGetFCBForFile (DeviceExt, ParentFcb, &Fcb, &PathNameU);
+  if (!NT_SUCCESS (Status))
+  {
+     DPRINT ("Could not make a new FCB, status: %x\n", Status);
+     return  Status;
+  }
   if (Fcb->Flags & FCB_DELETE_PENDING)
-    {
-      vfatReleaseFCB (DeviceExt, Fcb);
-      return STATUS_DELETE_PENDING;
-    }
+  {
+     vfatReleaseFCB (DeviceExt, Fcb);
+     return STATUS_DELETE_PENDING;
+  }
   DPRINT ("Attaching FCB to fileObject\n");
   Status = vfatAttachFCBToFileObject (DeviceExt, Fcb, FileObject);
-
+  if (!NT_SUCCESS(Status))
+  {
+     vfatReleaseFCB (DeviceExt, Fcb);
+  }
   return  Status;
 }
@@ -481,12 +472,12 @@
   ULONG RequestedDisposition, RequestedOptions;
   PVFATCCB pCcb;
   PVFATFCB pFcb;
+  PVFATFCB ParentFcb;
   PWCHAR c, last;
   BOOLEAN PagingFileCreate = FALSE;
   LARGE_INTEGER AllocationSize;
   BOOLEAN Dots;
-  UNICODE_STRING NameU;
-  WCHAR NameW[MAX_PATH];
+  UNICODE_STRING FileNameU;
   /* Unpack the various parameters. */
   Stack = IoGetCurrentIrpStackLocation (Irp);
@@ -563,12 +554,8 @@
        }
     }
-  NameU.Buffer = NameW;
-  NameU.Length = 0;
-  NameU.MaximumLength = sizeof(NameW);
-
   /* Try opening the file. */
-  Status = VfatOpenFile (DeviceExt, FileObject, &NameU);
+  Status = VfatOpenFile (DeviceExt, FileObject, &ParentFcb);
   /*
    * If the directory containing the file to open doesn't exist then
@@ -578,6 +565,10 @@
       Status == STATUS_INVALID_PARAMETER ||
       Status == STATUS_DELETE_PENDING)
     {
+      if (ParentFcb)
+      {
+         vfatReleaseFCB (DeviceExt, ParentFcb);
+      }
       return(Status);
     }
@@ -593,12 +584,15 @@
        {
          ULONG Attributes;
          Attributes = Stack->Parameters.Create.FileAttributes;
-         Status = VfatAddEntry (DeviceExt, &NameU, FileObject,
RequestedOptions,
+
+          vfatSplitPathName(&FileObject->FileName, NULL, &FileNameU);
+         Status = VfatAddEntry (DeviceExt, &FileNameU, &pFcb,
ParentFcb, RequestedOptions,
                                 (UCHAR)(Attributes &
FILE_ATTRIBUTE_VALID_FLAGS));
+          vfatReleaseFCB (DeviceExt, ParentFcb);
          if (NT_SUCCESS (Status))
            {
-             pFcb = FileObject->FsContext;
-
+              vfatAttachFCBToFileObject (DeviceExt, pFcb, FileObject);
+
              Irp->IoStatus.Information = FILE_CREATED;
              VfatSetAllocationSizeInformation(FileObject,
@@ -621,11 +615,16 @@
        }
       else
        {
+          vfatReleaseFCB (DeviceExt, ParentFcb);
          return(Status);
        }
     }
   else
     {
+      if (ParentFcb)
+      {
+         vfatReleaseFCB (DeviceExt, ParentFcb);
+      }
       /* Otherwise fail if the caller wanted to create a new file  */
       if (RequestedDisposition == FILE_CREATE)
        {
  _____
Modified: trunk/reactos/drivers/fs/vfat/dirwr.c
--- trunk/reactos/drivers/fs/vfat/dirwr.c       2005-01-01 11:02:35 UTC
(rev 12686)
+++ trunk/reactos/drivers/fs/vfat/dirwr.c       2005-01-01 11:11:52 UTC
(rev 12687)
@@ -1,4 +1,4 @@
-/* $Id: dirwr.c,v 1.44 2004/12/25 11:18:38 navaraf Exp $
+/* $Id$
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -183,10 +183,11 @@
 NTSTATUS
 FATAddEntry (PDEVICE_EXTENSION DeviceExt,
-             PUNICODE_STRING PathNameU,
-             PFILE_OBJECT pFileObject,
-             ULONG RequestedOptions,
-             UCHAR ReqAttr)
+            PUNICODE_STRING NameU,
+            PVFATFCB* Fcb,
+            PVFATFCB ParentFcb,
+            ULONG RequestedOptions,
+            UCHAR ReqAttr)
 /*
   create a new FAT entry
 */
@@ -198,11 +199,9 @@
   PUCHAR Buffer;
   BOOLEAN needTilde = FALSE, needLong = FALSE;
   BOOLEAN lCaseBase = FALSE, uCaseBase, lCaseExt = FALSE, uCaseExt;
-  PVFATFCB newFCB;
   ULONG CurrentCluster;
   LARGE_INTEGER SystemTime, FileOffset;
   NTSTATUS Status = STATUS_SUCCESS;
-  PVFATFCB pDirFcb;
   ULONG size;
   long i;
@@ -212,33 +211,20 @@
   BOOLEAN SpacesFound;
   VFAT_DIRENTRY_CONTEXT DirContext;
-  UNICODE_STRING DirNameU;
   WCHAR LongNameBuffer[MAX_PATH];
   WCHAR ShortNameBuffer[13];
-  DPRINT ("addEntry: Pathname='%wZ'\n", PathNameU);
+  DPRINT ("addEntry: Name='%wZ', Dir='%wZ'\n", NameU,
&ParentFcb->PathNameU);
-  vfatSplitPathName(PathNameU, &DirNameU, &DirContext.LongNameU);
-  if (DirNameU.Length > sizeof(WCHAR))
-    {
-      DirNameU.Length -= sizeof(WCHAR);
-    }
-
-  pDirFcb = vfatGrabFCBFromTable(DeviceExt, &DirNameU);
-  if (pDirFcb == NULL)
-    {
-      return STATUS_UNSUCCESSFUL;
-    }
-
-  if (!ExAcquireResourceExclusiveLite(&pDirFcb->MainResource, TRUE))
-    {
-      DPRINT("Failed acquiring lock\n");
-      return STATUS_UNSUCCESSFUL;
-    }
+  DirContext.LongNameU = *NameU;
   nbSlots = (DirContext.LongNameU.Length / sizeof(WCHAR) + 12) / 13 +
1;      //nb of entry needed for long name+normal entry
   DPRINT ("NameLen= %d, nbSlots =%d\n", DirContext.LongNameU.Length /
sizeof(WCHAR), nbSlots);
   Buffer = ExAllocatePool (NonPagedPool, (nbSlots - 1) * sizeof
(FAT_DIR_ENTRY));
+  if (Buffer == NULL)
+  {
+    return STATUS_INSUFFICIENT_RESOURCES;
+  }
   RtlZeroMemory (Buffer, (nbSlots - 1) * sizeof (FAT_DIR_ENTRY));
   pSlots = (slot *) Buffer;
@@ -254,7 +240,7 @@
   IsNameLegal = RtlIsNameLegalDOS8Dot3(&DirContext.LongNameU, &NameA,
&SpacesFound);
-  if (IsNameLegal == FALSE || SpacesFound != FALSE)
+  if (!IsNameLegal || SpacesFound)
     {
       GENERATE_NAME_CONTEXT NameContext;
       VFAT_DIRENTRY_CONTEXT SearchContext;
@@ -272,7 +258,7 @@
           RtlGenerate8dot3Name(&DirContext.LongNameU, FALSE,
&NameContext, &DirContext.ShortNameU);
           DirContext.ShortNameU.Buffer[DirContext.ShortNameU.Length /
sizeof(WCHAR)] = 0;
          SearchContext.DirIndex = 0;
-          Status = FindFile (DeviceExt, pDirFcb,
&DirContext.ShortNameU, &SearchContext, TRUE);
+          Status = FindFile (DeviceExt, ParentFcb,
&DirContext.ShortNameU, &SearchContext, TRUE);
           if (!NT_SUCCESS(Status))
             {
              break;
@@ -280,8 +266,6 @@
         }
       if (i == 100) /* FIXME : what to do after this ? */
         {
-          ExReleaseResourceLite(&pDirFcb->MainResource);
-          vfatReleaseFCB(DeviceExt, pDirFcb);
           ExFreePool (Buffer);
           CHECKPOINT;
           return STATUS_UNSUCCESSFUL;
@@ -386,6 +370,16 @@
     }
   /* 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;
@@ -421,10 +415,8 @@
        }
     }
   /* try to find nbSlots contiguous entries frees in directory */
-  if (!vfatFindDirSpace(DeviceExt, pDirFcb, nbSlots,
&DirContext.StartIndex))
+  if (!vfatFindDirSpace(DeviceExt, ParentFcb, nbSlots,
&DirContext.StartIndex))
     {
-      ExReleaseResourceLite(&pDirFcb->MainResource);
-      vfatReleaseFCB(DeviceExt, pDirFcb);
       ExFreePool (Buffer);
       return STATUS_DISK_FULL;
     }
@@ -435,8 +427,6 @@
       Status = NextCluster (DeviceExt, 0, &CurrentCluster, TRUE);
       if (CurrentCluster == 0xffffffff || !NT_SUCCESS(Status))
         {
-          ExReleaseResourceLite(&pDirFcb->MainResource);
-          vfatReleaseFCB(DeviceExt, pDirFcb);
           ExFreePool (Buffer);
           if (!NT_SUCCESS(Status))
             {
@@ -458,7 +448,7 @@
     {
       /* one cluster */
       CHECKPOINT;
-      CcMapData (pDirFcb->FileObject, &FileOffset, nbSlots *
sizeof(FAT_DIR_ENTRY),
+      CcMapData (ParentFcb->FileObject, &FileOffset, nbSlots *
sizeof(FAT_DIR_ENTRY),
                  TRUE, &Context, (PVOID*)&pFatEntry);
       if (nbSlots > 1)
         {
@@ -473,13 +463,13 @@
       size = DeviceExt->FatInfo.BytesPerCluster -
              (DirContext.StartIndex * sizeof(FAT_DIR_ENTRY)) %
DeviceExt->FatInfo.BytesPerCluster;
       i = size / sizeof(FAT_DIR_ENTRY);
-      CcMapData (pDirFcb->FileObject, &FileOffset, size, TRUE,
+      CcMapData (ParentFcb->FileObject, &FileOffset, size, TRUE,
                  &Context, (PVOID*)&pFatEntry);
       RtlCopyMemory(pFatEntry, Buffer, size);
       CcSetDirtyPinnedData(Context, NULL);
       CcUnpinData(Context);
       FileOffset.u.LowPart += size;
-      CcMapData (pDirFcb->FileObject, &FileOffset,
+      CcMapData (ParentFcb->FileObject, &FileOffset,
                  nbSlots * sizeof(FAT_DIR_ENTRY) - size,
                  TRUE, &Context, (PVOID*)&pFatEntry);
       if (nbSlots - 1 > i)
@@ -492,16 +482,15 @@
   CcUnpinData(Context);
   /* FIXME: check status */
-  vfatMakeFCBFromDirEntry (DeviceExt, pDirFcb, &DirContext, &newFCB);
-  vfatAttachFCBToFileObject (DeviceExt, newFCB, pFileObject);
+  vfatMakeFCBFromDirEntry (DeviceExt, ParentFcb, &DirContext, Fcb);
-  DPRINT ("new : entry=%11.11s\n", newFCB->entry.Fat.Filename);
+  DPRINT ("new : entry=%11.11s\n", (*Fcb)->entry.Fat.Filename);
   DPRINT ("new : entry=%11.11s\n", DirContext.DirEntry.Fat.Filename);
   if (RequestedOptions & FILE_DIRECTORY_FILE)
     {
       FileOffset.QuadPart = 0;
-      CcMapData (pFileObject, &FileOffset,
DeviceExt->FatInfo.BytesPerCluster, TRUE,
+      CcMapData ((*Fcb)->FileObject, &FileOffset,
DeviceExt->FatInfo.BytesPerCluster, TRUE,
                  &Context, (PVOID*)&pFatEntry);
       /* clear the new directory cluster */
       RtlZeroMemory (pFatEntry, DeviceExt->FatInfo.BytesPerCluster);
@@ -510,9 +499,9 @@
       RtlCopyMemory (pFatEntry[0].Filename, ".          ", 11);
       RtlCopyMemory (&pFatEntry[1].Attrib,
&DirContext.DirEntry.Fat.Attrib, sizeof(FAT_DIR_ENTRY) - 11);
       RtlCopyMemory (pFatEntry[1].Filename, "..         ", 11);
-      pFatEntry[1].FirstCluster = pDirFcb->entry.Fat.FirstCluster;
-      pFatEntry[1].FirstClusterHigh =
pDirFcb->entry.Fat.FirstClusterHigh;
-      if (vfatFCBIsRoot(pDirFcb))
+      pFatEntry[1].FirstCluster = ParentFcb->entry.Fat.FirstCluster;
+      pFatEntry[1].FirstClusterHigh =
ParentFcb->entry.Fat.FirstClusterHigh;
+      if (vfatFCBIsRoot(ParentFcb))
         {
           pFatEntry[1].FirstCluster = 0;
           pFatEntry[1].FirstClusterHigh = 0;
@@ -520,8 +509,6 @@
       CcSetDirtyPinnedData(Context, NULL);
       CcUnpinData(Context);
     }
-  ExReleaseResourceLite(&pDirFcb->MainResource);
-  vfatReleaseFCB (DeviceExt, pDirFcb);
   ExFreePool (Buffer);
   DPRINT ("addentry ok\n");
   return STATUS_SUCCESS;
@@ -529,8 +516,9 @@
 NTSTATUS
 FATXAddEntry (PDEVICE_EXTENSION DeviceExt,
-             PUNICODE_STRING PathNameU,
-             PFILE_OBJECT pFileObject,
+             PUNICODE_STRING NameU,
+             PVFATFCB* Fcb,
+             PVFATFCB ParentFcb,
              ULONG RequestedOptions,
              UCHAR ReqAttr)
 /*
@@ -538,21 +526,14 @@
 */
 {
    PVOID Context = NULL;
-   PVFATFCB newFCB;
    LARGE_INTEGER SystemTime, FileOffset;
-   PVFATFCB pDirFcb;
    OEM_STRING NameA;
    VFAT_DIRENTRY_CONTEXT DirContext;
    PFATX_DIR_ENTRY pFatXDirEntry;
-   UNICODE_STRING DirNameU;
-   DPRINT ("addEntry: Pathname='%wZ'\n", PathNameU);
+   DPRINT ("addEntry: Name='%wZ', Dir='%wZ'\n", NameU,
&ParentFcb->PathNameU);
-   vfatSplitPathName(PathNameU, &DirNameU, &DirContext.LongNameU);
-   if (DirNameU.Length > sizeof(WCHAR))
-   {
-      DirNameU.Length -= sizeof(WCHAR);
-   }
+   DirContext.LongNameU = *NameU;
    if (DirContext.LongNameU.Length / sizeof(WCHAR) > 42)
    {
@@ -561,27 +542,13 @@
       return STATUS_NAME_TOO_LONG;
    }
-   pDirFcb = vfatGrabFCBFromTable(DeviceExt, &DirNameU);
-   if (pDirFcb == NULL)
-   {
-      return STATUS_UNSUCCESSFUL;
-   }
-
-   if (!ExAcquireResourceExclusiveLite(&pDirFcb->MainResource, TRUE))
-   {
-      DPRINT("Failed acquiring lock\n");
-      return STATUS_UNSUCCESSFUL;
-   }
-
    /* try to find 1 entry free in directory */
-   if (!vfatFindDirSpace(DeviceExt, pDirFcb, 1,
&DirContext.StartIndex))
+   if (!vfatFindDirSpace(DeviceExt, ParentFcb, 1,
&DirContext.StartIndex))
    {
-      ExReleaseResourceLite(&pDirFcb->MainResource);
-      vfatReleaseFCB(DeviceExt, pDirFcb);
       return STATUS_DISK_FULL;
    }
    DirContext.DirIndex = DirContext.StartIndex;
-   if (!vfatFCBIsRoot(pDirFcb))
+   if (!vfatFCBIsRoot(ParentFcb))
    {
       DirContext.DirIndex += 2;
    }
@@ -620,33 +587,31 @@
    /* add entry into parent directory */
    FileOffset.u.HighPart = 0;
    FileOffset.u.LowPart = DirContext.StartIndex *
sizeof(FATX_DIR_ENTRY);
-   CcMapData(pDirFcb->FileObject, &FileOffset, sizeof(FATX_DIR_ENTRY),
-                 TRUE, &Context, (PVOID*)&pFatXDirEntry);
+   CcMapData(ParentFcb->FileObject, &FileOffset,
sizeof(FATX_DIR_ENTRY),
+             TRUE, &Context, (PVOID*)&pFatXDirEntry);
    RtlCopyMemory(pFatXDirEntry, &DirContext.DirEntry.FatX,
sizeof(FATX_DIR_ENTRY));
    CcSetDirtyPinnedData(Context, NULL);
    CcUnpinData(Context);
    /* FIXME: check status */
-   vfatMakeFCBFromDirEntry(DeviceExt, pDirFcb, &DirContext, &newFCB);
-   vfatAttachFCBToFileObject(DeviceExt, newFCB, pFileObject);
+   vfatMakeFCBFromDirEntry(DeviceExt, ParentFcb, &DirContext, Fcb);
-   ExReleaseResourceLite(&pDirFcb->MainResource);
-   vfatReleaseFCB(DeviceExt, pDirFcb);
    DPRINT("addentry ok\n");
    return STATUS_SUCCESS;
 }
 NTSTATUS
 VfatAddEntry (PDEVICE_EXTENSION DeviceExt,
-             PUNICODE_STRING PathNameU,
-             PFILE_OBJECT pFileObject,
+             PUNICODE_STRING NameU,
+             PVFATFCB *Fcb,
+             PVFATFCB ParentFcb,
              ULONG RequestedOptions,
              UCHAR ReqAttr)
 {
    if (DeviceExt->Flags & VCB_IS_FATX)
-      return FATXAddEntry(DeviceExt, PathNameU, pFileObject,
RequestedOptions, ReqAttr);
+      return FATXAddEntry(DeviceExt, NameU, Fcb, ParentFcb,
RequestedOptions, ReqAttr);
    else
-      return FATAddEntry(DeviceExt, PathNameU, pFileObject,
RequestedOptions, ReqAttr);
+      return FATAddEntry(DeviceExt, NameU, Fcb, ParentFcb,
RequestedOptions, ReqAttr);
 }
 NTSTATUS
  _____
Modified: trunk/reactos/drivers/fs/vfat/fcb.c
--- trunk/reactos/drivers/fs/vfat/fcb.c 2005-01-01 11:02:35 UTC (rev
12686)
+++ trunk/reactos/drivers/fs/vfat/fcb.c 2005-01-01 11:11:52 UTC (rev
12687)
@@ -1,4 +1,4 @@
-/* $Id: fcb.c,v 1.43 2004/12/05 16:31:51 gvg Exp $
+/* $Id$
  *
  *
  * FILE:             drivers/fs/vfat/fcb.c
@@ -55,18 +55,25 @@
 vfatSplitPathName(PUNICODE_STRING PathNameU, PUNICODE_STRING DirNameU,
PUNICODE_STRING FileNameU)
 {
   PWCHAR pName;
-  DirNameU->Buffer = PathNameU->Buffer;
+  ULONG Length = 0;
   pName = PathNameU->Buffer + PathNameU->Length / sizeof(WCHAR) - 1;
-  while (*pName != L'\\' && pName > PathNameU->Buffer)
+  while (*pName != L'\\' && pName >= PathNameU->Buffer)
     {
       pName--;
+      Length++;
     }
-  ASSERT(*pName == L'\\');
-  FileNameU->Buffer = pName + 1;
-  DirNameU->Length = (FileNameU->Buffer - PathNameU->Buffer) *
sizeof(WCHAR);
-  DirNameU->MaximumLength = DirNameU->Length;
-  FileNameU->Length = PathNameU->Length - DirNameU->Length;
-  FileNameU->MaximumLength = FileNameU->Length;
+  ASSERT(*pName == L'\\' || pName < PathNameU->Buffer);
+  if (FileNameU)
+    {
+      FileNameU->Buffer = pName + 1;
+      FileNameU->Length = FileNameU->MaximumLength = Length *
sizeof(WCHAR);
+    }
+  if (DirNameU)
+    {
+      DirNameU->Buffer = PathNameU->Buffer;
+      DirNameU->Length = (pName + 1 - PathNameU->Buffer) *
sizeof(WCHAR);
+      DirNameU->MaximumLength = DirNameU->Length;
+    }
 }
 VOID
@@ -637,63 +644,85 @@
           pFCB,
           pFileNameU);
-  RtlRosInitUnicodeStringFromLiteral(&RootNameU, L"\\");
+  parentFCB = *pParentFCB;
-  //  Trivial case, open of the root directory on volume
-  if (RtlEqualUnicodeString(pFileNameU, &RootNameU, FALSE))
-    {
-      DPRINT ("returning root FCB\n");
+  if (parentFCB == NULL)
+  {
+     RtlRosInitUnicodeStringFromLiteral(&RootNameU, L"\\");
-      FCB = vfatOpenRootFCB (pVCB);
-      *pFCB = FCB;
-      *pParentFCB = NULL;
+     //  Trivial case, open of the root directory on volume
+     if (RtlEqualUnicodeString(pFileNameU, &RootNameU, FALSE))
+     {
+        DPRINT ("returning root FCB\n");
-      return  (FCB != NULL) ? STATUS_SUCCESS :
STATUS_OBJECT_PATH_NOT_FOUND;
-    }
+        FCB = vfatOpenRootFCB (pVCB);
+        *pFCB = FCB;
+        *pParentFCB = NULL;
-  last = curr = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR)
- 1;
-  while (*curr != L'\\' && curr > pFileNameU->Buffer)
-    {
-      curr--;
-    }
+        return  (FCB != NULL) ? STATUS_SUCCESS :
STATUS_OBJECT_PATH_NOT_FOUND;
+     }
+
+     /* Check for an existing FCB */
+     FCB = vfatGrabFCBFromTable (pVCB, pFileNameU);
+     if (FCB)
+     {
+        *pFCB = FCB;
+        *pParentFCB = FCB->parentFcb;
+        (*pParentFCB)->RefCount++;
+        return STATUS_SUCCESS;
+     }
+
+     last = curr = pFileNameU->Buffer + pFileNameU->Length /
sizeof(WCHAR) - 1;
+     while (*curr != L'\\' && curr > pFileNameU->Buffer)
+     {
+        curr--;
+     }
-  if (curr > pFileNameU->Buffer)
-    {
-      NameU.Buffer = pFileNameU->Buffer;
-      NameU.MaximumLength = NameU.Length = (curr - pFileNameU->Buffer)
* sizeof(WCHAR);
-      FCB = vfatGrabFCBFromTable(pVCB, &NameU);
-      if (FCB)
+     if (curr > pFileNameU->Buffer)
+     {
+        NameU.Buffer = pFileNameU->Buffer;
+        NameU.MaximumLength = NameU.Length = (curr -
pFileNameU->Buffer) * sizeof(WCHAR);
+        FCB = vfatGrabFCBFromTable(pVCB, &NameU);
+        if (FCB)
         {
-         Length = (curr - pFileNameU->Buffer) * sizeof(WCHAR);
-          if (Length != FCB->PathNameU.Length)
-           {
+          Length = (curr - pFileNameU->Buffer) * sizeof(WCHAR);
+           if (Length != FCB->PathNameU.Length)
+          {
              if (pFileNameU->Length + FCB->PathNameU.Length - Length >
pFileNameU->MaximumLength)
-               {
-                 vfatReleaseFCB (pVCB, FCB);
-                 return STATUS_OBJECT_NAME_INVALID;
-               }
+             {
+                vfatReleaseFCB (pVCB, FCB);
+                return STATUS_OBJECT_NAME_INVALID;
+              }
              memmove(pFileNameU->Buffer + FCB->PathNameU.Length /
sizeof(WCHAR),
                      curr, pFileNameU->Length - Length);
              pFileNameU->Length += FCB->PathNameU.Length - Length;
              curr = pFileNameU->Buffer + FCB->PathNameU.Length /
sizeof(WCHAR);
               last = pFileNameU->Buffer + pFileNameU->Length /
sizeof(WCHAR) - 1;
-           }
+         }
          RtlCopyMemory(pFileNameU->Buffer, FCB->PathNameU.Buffer,
FCB->PathNameU.Length);
-       }
-    }
-  else
-    {
-      FCB = NULL;
-    }
+        }
+     }
+     else
+     {
+       FCB = NULL;
+     }
-  if (FCB == NULL)
-    {
-      FCB = vfatOpenRootFCB(pVCB);
-      curr = pFileNameU->Buffer;
-    }
+     if (FCB == NULL)
+     {
+       FCB = vfatOpenRootFCB(pVCB);
+       curr = pFileNameU->Buffer;
+     }
-  parentFCB = NULL;
-  prev = curr;
+     parentFCB = NULL;
+     prev = curr;
+  }
+  else
+  {
+     FCB = parentFCB;
+     parentFCB = NULL;
+     prev = curr = pFileNameU->Buffer - 1;
+     last = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR) -
1;
+  }
   while (curr <= last)
     {
@@ -751,14 +780,16 @@
          status = vfatDirFindFile(pVCB, parentFCB, &NameU, &FCB);
           if (status == STATUS_OBJECT_NAME_NOT_FOUND)
             {
-              *pParentFCB = parentFCB;
               *pFCB = NULL;
              if (curr > last)
                {
+                  *pParentFCB = parentFCB;
                   return  STATUS_OBJECT_NAME_NOT_FOUND;
                }
               else
                 {
+                  vfatReleaseFCB (pVCB, parentFCB);
+                 *pParentFCB = NULL;
                   return  STATUS_OBJECT_PATH_NOT_FOUND;
                 }
            }
@@ -778,3 +809,4 @@
   return  STATUS_SUCCESS;
 }
+
  _____
Modified: trunk/reactos/drivers/fs/vfat/rw.c
--- trunk/reactos/drivers/fs/vfat/rw.c  2005-01-01 11:02:35 UTC (rev
12686)
+++ trunk/reactos/drivers/fs/vfat/rw.c  2005-01-01 11:11:52 UTC (rev
12687)
@@ -1,5 +1,5 @@
-/* $Id: rw.c,v 1.72 2004/12/05 16:31:51 gvg Exp $
+/* $Id$
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -642,7 +642,7 @@
       Resource = &Fcb->MainResource;
    }
    if (!ExAcquireResourceSharedLite(Resource,
-                                    (BOOLEAN)(IrpContext->Flags &
IRPCONTEXT_CANWAIT)))
+                                    IrpContext->Flags &
IRPCONTEXT_CANWAIT ? TRUE : FALSE))
    {
       Resource = NULL;
       Status = STATUS_PENDING;
  _____
Modified: trunk/reactos/drivers/fs/vfat/vfat.h
--- trunk/reactos/drivers/fs/vfat/vfat.h        2005-01-01 11:02:35 UTC
(rev 12686)
+++ trunk/reactos/drivers/fs/vfat/vfat.h        2005-01-01 11:11:52 UTC
(rev 12687)
@@ -1,4 +1,4 @@
-/* $Id: vfat.h,v 1.70 2004/12/05 16:31:51 gvg Exp $ */
+/* $Id$ */
 #include <ddk/ntifs.h>
@@ -457,7 +457,7 @@
 NTSTATUS VfatOpenFile (PDEVICE_EXTENSION DeviceExt,
                        PFILE_OBJECT FileObject,
-                       PUNICODE_STRING FileNameU);
+                      PVFATFCB* parentFcb);
 NTSTATUS FindFile (PDEVICE_EXTENSION DeviceExt,
                    PVFATFCB Parent,
@@ -507,7 +507,8 @@
 NTSTATUS VfatAddEntry (PDEVICE_EXTENSION DeviceExt,
                       PUNICODE_STRING PathNameU,
-                      PFILE_OBJECT pFileObject,
+                      PVFATFCB* Fcb,
+                      PVFATFCB ParentFcb,
                       ULONG RequestedOptions,
                       UCHAR ReqAttr);