[FASTFAT]
[reactos.git] / reactos / drivers / filesystems / fastfat / finfo.c
index b8e3a14..5b18261 100644 (file)
@@ -120,6 +120,10 @@ VfatGetPositionInformation(PFILE_OBJECT FileObject,
                           PFILE_POSITION_INFORMATION PositionInfo,
                           PULONG BufferLength)
 {
+  UNREFERENCED_PARAMETER(FileObject);
+  UNREFERENCED_PARAMETER(FCB);
+  UNREFERENCED_PARAMETER(DeviceObject);
+
   DPRINT ("VfatGetPositionInformation()\n");
 
   if (*BufferLength < sizeof(FILE_POSITION_INFORMATION))
@@ -148,7 +152,7 @@ VfatSetBasicInformation(PFILE_OBJECT FileObject,
   ASSERT(NULL != DeviceExt);
   ASSERT(NULL != BasicInfo);
   /* Check volume label bit */
-  ASSERT(0 == (*FCB->Attributes & 0x08));
+  ASSERT(0 == (*FCB->Attributes & _A_VOLID));
 
   if (FCB->Flags & FCB_IS_FATX_ENTRY)
   {
@@ -203,6 +207,9 @@ VfatGetBasicInformation(PFILE_OBJECT FileObject,
                        PULONG BufferLength)
 {
   PDEVICE_EXTENSION DeviceExt;
+  
+  UNREFERENCED_PARAMETER(FileObject);
+  
   DPRINT("VfatGetBasicInformation()\n");
 
   DeviceExt = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
@@ -267,7 +274,7 @@ VfatSetDispositionInformation(PFILE_OBJECT FileObject,
                              PDEVICE_OBJECT DeviceObject,
                              PFILE_DISPOSITION_INFORMATION DispositionInfo)
 {
-#ifdef DBG
+#if DBG
    PDEVICE_EXTENSION DeviceExt = DeviceObject->DeviceExtension;
 #endif
 
@@ -339,6 +346,10 @@ VfatGetNameInformation(PFILE_OBJECT FileObject,
  */
 {
   ULONG BytesToCopy;
+
+  UNREFERENCED_PARAMETER(FileObject);
+  UNREFERENCED_PARAMETER(DeviceObject);
+
   ASSERT(NameInfo != NULL);
   ASSERT(FCB != NULL);
 
@@ -470,6 +481,9 @@ VfatGetEaInformation(PFILE_OBJECT FileObject,
 {
     PDEVICE_EXTENSION DeviceExt = DeviceObject->DeviceExtension;
 
+    UNREFERENCED_PARAMETER(FileObject);
+    UNREFERENCED_PARAMETER(Fcb);
+
     /* FIXME - use SEH to access the buffer! */
     Info->EaSize = 0;
     *BufferLength -= sizeof(*Info);
@@ -548,10 +562,7 @@ static VOID UpdateFileSize(PFILE_OBJECT FileObject, PVFATFCB Fcb, ULONG Size, UL
    Fcb->RFCB.FileSize.QuadPart = Size;
    Fcb->RFCB.ValidDataLength.QuadPart = Size;
 
-   if (FileObject->SectionObjectPointer->SharedCacheMap != NULL)
-   {
-      CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&Fcb->RFCB.AllocationSize);
-   }
+   CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&Fcb->RFCB.AllocationSize);
 }
 
 NTSTATUS
@@ -639,7 +650,6 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
     }
     else
     {
-#if 0 /* FIXME */
        if (Fcb->LastCluster > 0)
        {
           if (Fcb->RFCB.AllocationSize.u.LowPart - ClusterSize == Fcb->LastOffset)
@@ -665,23 +675,14 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
           return Status;
        }
 
-       if (Fcb->LastCluster == 0)
-       {
-          Fcb->LastCluster = Cluster;
-          Fcb->LastOffset = Fcb->RFCB.AllocationSize.u.LowPart - ClusterSize;
-       }
+       Fcb->LastCluster = Cluster;
+       Fcb->LastOffset = Fcb->RFCB.AllocationSize.u.LowPart - ClusterSize;
 
        /* FIXME: Check status */
        /* Cluster points now to the last cluster within the chain */
        Status = OffsetToCluster(DeviceExt, Cluster,
                                ROUND_DOWN(NewSize - 1, ClusterSize) - Fcb->LastOffset,
                                 &NCluster, TRUE);
-#else
-       Status = OffsetToCluster(DeviceExt, FirstCluster,
-                               ROUND_DOWN(NewSize - 1, ClusterSize),
-                                &Cluster, TRUE);
-       NCluster = Cluster;
-#endif
        if (NCluster == 0xffffffff || !NT_SUCCESS(Status))
        {
          /* disk is full */
@@ -702,6 +703,17 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
   }
   else if (NewSize + ClusterSize <= Fcb->RFCB.AllocationSize.u.LowPart)
   {
+
+    DPRINT("Check for the ability to set file size\n");
+    if (!MmCanFileBeTruncated
+      (FileObject->SectionObjectPointer,
+      (PLARGE_INTEGER)AllocationSize))
+    {
+      DPRINT("Couldn't set file size!\n");
+      return STATUS_USER_MAPPED_FILE;
+    }
+    DPRINT("Can set file size\n");
+
     AllocSizeChanged = TRUE;
     /* FIXME: Use the cached cluster/offset better way. */
     Fcb->LastCluster = Fcb->LastOffset = 0;
@@ -901,6 +913,26 @@ NTSTATUS VfatSetInformation(PVFAT_IRP_CONTEXT IrpContext)
   DPRINT("FileInformationClass %d\n", FileInformationClass);
   DPRINT("SystemBuffer %p\n", SystemBuffer);
 
+  /* Special: We should call MmCanFileBeTruncated here to determine if changing
+     the file size would be allowed.  If not, we bail with the right error.
+     We must do this before acquiring the lock. */
+  if (FileInformationClass == FileEndOfFileInformation)
+  {
+      DPRINT("Check for the ability to set file size\n");
+      if (!MmCanFileBeTruncated
+         (IrpContext->FileObject->SectionObjectPointer,
+          (PLARGE_INTEGER)SystemBuffer))
+      {
+         DPRINT("Couldn't set file size!\n");
+         IrpContext->Irp->IoStatus.Status = STATUS_USER_MAPPED_FILE;
+         IrpContext->Irp->IoStatus.Information = 0;
+         IoCompleteRequest(IrpContext->Irp, IO_NO_INCREMENT);
+         VfatFreeIrpContext(IrpContext);
+         return STATUS_USER_MAPPED_FILE;
+      }
+      DPRINT("Can set file size\n");
+  }
+
   if (!(FCB->Flags & FCB_IS_PAGE_FILE))
     {
       if (!ExAcquireResourceExclusiveLite(&FCB->MainResource,