Added support for accessing the raw volume.
authorHartmut Birr <osexpert@googlemail.com>
Sun, 5 May 2002 20:18:33 +0000 (20:18 +0000)
committerHartmut Birr <osexpert@googlemail.com>
Sun, 5 May 2002 20:18:33 +0000 (20:18 +0000)
svn path=/trunk/; revision=2911

reactos/drivers/fs/vfat/close.c
reactos/drivers/fs/vfat/create.c
reactos/drivers/fs/vfat/vfat.h

index ca295be..f8b0c37 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: close.c,v 1.9 2001/11/02 22:44:34 hbirr Exp $
+/* $Id: close.c,v 1.10 2002/05/05 20:18:33 hbirr Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -39,12 +39,18 @@ VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
   {
     return  STATUS_SUCCESS;
   }
-  if (FileObject->FileName.Buffer)
+  pFcb = pCcb->pFcb;
+  if (pFcb->Flags & FCB_IS_VOLUME)
+  {
+     DPRINT1("Volume\n");
+     pFcb->RefCount--;
+     FileObject->FsContext2 = NULL;
+  }
+  else if (FileObject->FileName.Buffer)
   {
     // This a FO, that was created outside from FSD.
     // Some FO's are created with IoCreateStreamFileObject() insid from FSD.
     // This FO's haven't a FileName.
-    pFcb = pCcb->pFcb;
     if (FileObject->DeletePending)
     {
       if (pFcb->Flags & FCB_DELETE_PENDING)
index 307e713..848be64 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: create.c,v 1.39 2002/03/18 22:37:12 hbirr Exp $
+/* $Id: create.c,v 1.40 2002/05/05 20:18:33 hbirr Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -583,6 +583,43 @@ VfatCreateFile (PDEVICE_OBJECT DeviceObject, PIRP Irp)
   DeviceExt = DeviceObject->DeviceExtension;
   assert (DeviceExt);
 
+  if (FileObject->FileName.Length == 0 && FileObject->RelatedFileObject == NULL)
+  {
+    /* This a open operation for the volume itself */
+    if (RequestedDisposition == FILE_CREATE ||
+        RequestedDisposition == FILE_OVERWRITE_IF ||
+        RequestedDisposition == FILE_SUPERSEDE)
+    {
+       Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
+       return STATUS_ACCESS_DENIED;
+    }
+    if (RequestedOptions & FILE_DIRECTORY_FILE)
+    {
+       Irp->IoStatus.Status = STATUS_NOT_A_DIRECTORY;
+       return STATUS_NOT_A_DIRECTORY;
+    }
+    pFcb = DeviceExt->VolumeFcb;
+    pCcb = ExAllocatePoolWithTag (NonPagedPool, sizeof (VFATCCB), TAG_CCB);
+    if (pCcb == NULL)
+    {
+       Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
+       return  STATUS_INSUFFICIENT_RESOURCES;
+    }
+    memset(pCcb, 0, sizeof(VFATCCB));
+    FileObject->Flags |= FO_FCB_IS_VALID;
+    FileObject->SectionObjectPointers = &pFcb->SectionObjectPointers;
+    FileObject->FsContext = (PVOID) &pFcb->RFCB;
+    FileObject->FsContext2 = pCcb;
+    pCcb->pFcb = pFcb;
+    pCcb->PtrFileObject = FileObject;
+    pFcb->pDevExt = DeviceExt;
+    pFcb->RefCount++;
+
+    Irp->IoStatus.Information = FILE_OPENED;
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    return STATUS_SUCCESS;
+  }
+
   /*
    * Check for illegal characters in the file name
    */
index f87c9ba..1eb184a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: vfat.h,v 1.40 2002/03/18 22:37:13 hbirr Exp $ */
+/* $Id: vfat.h,v 1.41 2002/05/05 20:18:33 hbirr Exp $ */
 
 #include <ddk/ntifs.h>
 
@@ -113,9 +113,12 @@ typedef struct
   ULONG BytesPerCluster;
   ULONG NumberOfClusters;
   ULONG FatType;
+  ULONG Sectors;
 }
 FATINFO, *PFATINFO;
 
+struct _VFATFCB;
+
 typedef struct
 {
   ERESOURCE DirResource;
@@ -131,6 +134,7 @@ typedef struct
   ULONG AvailableClusters;
   BOOLEAN AvailableClustersValid;
   ULONG Flags;
+  struct _VFATFCB * VolumeFcb;
 }
 DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
 
@@ -148,6 +152,7 @@ extern PVFAT_GLOBAL_DATA VfatGlobalData;
 #define FCB_DELETE_PENDING      0x0002
 #define FCB_IS_FAT              0x0004
 #define FCB_IS_PAGE_FILE        0x0008
+#define FCB_IS_VOLUME           0x0010
 
 typedef struct _VFATFCB
 {
@@ -482,7 +487,7 @@ NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext);
 NTSTATUS vfatExtendSpace (PDEVICE_EXTENSION pDeviceExt,
                           PFILE_OBJECT pFileObject,
                           ULONG NewSize);
-/*
+
 NTSTATUS VfatWriteFile (PDEVICE_EXTENSION DeviceExt,
                         PFILE_OBJECT FileObject,
                         PVOID Buffer,
@@ -498,7 +503,6 @@ NTSTATUS VfatReadFile (PDEVICE_EXTENSION DeviceExt,
                        ULONG ReadOffset,
                        PULONG LengthRead,
                        ULONG NoCache);
-*/
 
 NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt,
                      PVFATFCB Fcb,
@@ -517,11 +521,11 @@ VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext);
 
 NTSTATUS STDCALL VfatBuildRequest (PDEVICE_OBJECT DeviceObject,
                                    PIRP Irp);
-/*
+
 PVOID VfatGetUserBuffer(IN PIRP);
 
 NTSTATUS VfatLockUserBuffer(IN PIRP, IN ULONG,
                             IN LOCK_OPERATION);
-*/
+
 
 /* EOF */