[fastfat_new]
authorAleksey Bragin <aleksey@reactos.org>
Fri, 16 Oct 2009 18:39:38 +0000 (18:39 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Fri, 16 Oct 2009 18:39:38 +0000 (18:39 +0000)
- Improve FatCreateDcb so that it sets the dir name.
- Implement relative file object open.

svn path=/trunk/; revision=43517

reactos/drivers/filesystems/fastfat_new/create.c
reactos/drivers/filesystems/fastfat_new/dir.c
reactos/drivers/filesystems/fastfat_new/fastfat.h

index c71dc1e..61cb5bf 100644 (file)
@@ -126,8 +126,7 @@ FatiOpenExistingDir(IN PFAT_IRP_CONTEXT IrpContext,
     }
 
     /* Create a new DCB for this directory */
-    Fcb = FatCreateDcb(IrpContext, Vcb, ParentDcb);
-    Fcb->FatHandle = FileHandle;
+    Fcb = FatCreateDcb(IrpContext, Vcb, ParentDcb, FileHandle);
 
     /* Set share access */
     IoSetShareAccess(*DesiredAccess, ShareAccess, FileObject, &Fcb->ShareAccess);
@@ -332,9 +331,9 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
     ULONG CreateDisposition;
 
     /* Control blocks */
-    PVCB Vcb, DecodedVcb;
-    PFCB Fcb, NextFcb;
-    PCCB Ccb;
+    PVCB Vcb, DecodedVcb, RelatedVcb;
+    PFCB Fcb, NextFcb, RelatedDcb;
+    PCCB Ccb, RelatedCcb;
     PFCB ParentDcb;
 
     /* IRP data */
@@ -357,6 +356,7 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
     UNICODE_STRING RemainingPart, FirstName, NextName;
     OEM_STRING AnsiFirstName;
     FF_ERROR FfError;
+    TYPE_OF_OPEN TypeOfOpen;
 
     Iosb.Status = STATUS_SUCCESS;
 
@@ -533,8 +533,42 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
     /* Check if this is a relative open */
     if (RelatedFO)
     {
-        // RelatedFO will be a parent directory
-        UNIMPLEMENTED;
+        /* Decode the file object */
+        TypeOfOpen = FatDecodeFileObject(RelatedFO,
+                                         &RelatedVcb,
+                                         &RelatedDcb,
+                                         &RelatedCcb);
+
+        /* Check open type */
+        if (TypeOfOpen != UserFileOpen &&
+            TypeOfOpen != UserDirectoryOpen)
+        {
+            DPRINT1("Invalid file object!\n");
+
+            /* Cleanup and return */
+            FatReleaseVcb(IrpContext, Vcb);
+            return STATUS_OBJECT_PATH_NOT_FOUND;
+        }
+
+        /* File path must be relative */
+        if (FileName.Length != 0 &&
+            FileName.Buffer[0] == L'\\')
+        {
+            /* The name is absolute, fail */
+            FatReleaseVcb(IrpContext, Vcb);
+            return STATUS_OBJECT_NAME_INVALID;
+        }
+
+        /* Make sure volume is the same */
+        ASSERT(RelatedVcb == Vcb);
+
+        /* Save VPB */
+        FileObject->Vpb = RelatedFO->Vpb;
+
+        /* Set parent DCB */
+        ParentDcb = RelatedDcb;
+
+        DPRINT1("Opening file '%wZ' relatively to '%wZ'\n", &FileName, &ParentDcb->FullFileName);
     }
     else
     {
@@ -743,7 +777,8 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
             /* Create a DCB for this entry */
             ParentDcb = FatCreateDcb(IrpContext,
                                      Vcb,
-                                     ParentDcb);
+                                     ParentDcb,
+                                     NULL);
 
             /* Set its name */
             FatSetFullNameInFcb(ParentDcb, &FirstName);
index abab230..2dd3584 100644 (file)
@@ -127,7 +127,8 @@ PFCB
 NTAPI
 FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext,
              IN PVCB Vcb,
-             IN PFCB ParentDcb)
+             IN PFCB ParentDcb,
+             IN FF_FILE *FileHandle)
 {
     PFCB Fcb;
 
@@ -162,6 +163,13 @@ FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext,
     /* Initialize parent dcb list */
     InitializeListHead(&Fcb->Dcb.ParentDcbList);
 
+    /* Set FullFAT handle */
+    Fcb->FatHandle = FileHandle;
+
+    /* Set names */
+    if (FileHandle)
+        FatSetFcbNames(IrpContext, Fcb);
+
     return Fcb;
 }
 
index 181aebd..9fec7c0 100644 (file)
@@ -84,7 +84,8 @@ FatCreateRootDcb(IN PFAT_IRP_CONTEXT IrpContext,
 PFCB NTAPI
 FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext,
              IN PVCB Vcb,
-             IN PFCB ParentDcb);
+             IN PFCB ParentDcb,
+             IN FF_FILE *FileHandle);
 
 /*  --------------------------------------------------------  create.c  */