Author: tfaber
Date: Wed Jun 17 19:19:39 2015
New Revision: 68175

URL: http://svn.reactos.org/svn/reactos?rev=68175&view=rev
Log:
[FASTFAT]
- Set the correct length in 
FsdGetFsVolumeInformation/FsdGetFsAttributeInformation, and write back partial 
data when returning STATUS_BUFFER_OVERFLOW
- Replace unnecessary checks with ASSERTs
CORE-9820 #resolve

Modified:
    trunk/reactos/drivers/filesystems/fastfat/volume.c

Modified: trunk/reactos/drivers/filesystems/fastfat/volume.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/volume.c?rev=68175&r1=68174&r2=68175&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/volume.c  [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/volume.c  [iso-8859-1] Wed Jun 17 
19:19:39 2015
@@ -23,28 +23,41 @@
     PFILE_FS_VOLUME_INFORMATION FsVolumeInfo,
     PULONG BufferLength)
 {
+    NTSTATUS Status;
     PDEVICE_EXTENSION DeviceExt;
 
     DPRINT("FsdGetFsVolumeInformation()\n");
     DPRINT("FsVolumeInfo = %p\n", FsVolumeInfo);
     DPRINT("BufferLength %lu\n", *BufferLength);
 
-    DPRINT("Required length %lu\n", (sizeof(FILE_FS_VOLUME_INFORMATION) + 
DeviceObject->Vpb->VolumeLabelLength));
+    DPRINT("Required length %lu\n", FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION, 
VolumeLabel) + DeviceObject->Vpb->VolumeLabelLength);
     DPRINT("LabelLength %hu\n", DeviceObject->Vpb->VolumeLabelLength);
     DPRINT("Label %*.S\n", DeviceObject->Vpb->VolumeLabelLength / 
sizeof(WCHAR), DeviceObject->Vpb->VolumeLabel);
 
-    if (*BufferLength < sizeof(FILE_FS_VOLUME_INFORMATION))
-        return STATUS_INFO_LENGTH_MISMATCH;
-
-    if (*BufferLength < (sizeof(FILE_FS_VOLUME_INFORMATION) + 
DeviceObject->Vpb->VolumeLabelLength))
-        return STATUS_BUFFER_OVERFLOW;
+    ASSERT(*BufferLength >= sizeof(FILE_FS_VOLUME_INFORMATION));
+    *BufferLength -= FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION, VolumeLabel);
 
     DeviceExt = DeviceObject->DeviceExtension;
 
     /* valid entries */
     FsVolumeInfo->VolumeSerialNumber = DeviceObject->Vpb->SerialNumber;
     FsVolumeInfo->VolumeLabelLength = DeviceObject->Vpb->VolumeLabelLength;
-    RtlCopyMemory(FsVolumeInfo->VolumeLabel, DeviceObject->Vpb->VolumeLabel, 
FsVolumeInfo->VolumeLabelLength);
+    if (*BufferLength < DeviceObject->Vpb->VolumeLabelLength)
+    {
+        Status =  STATUS_BUFFER_OVERFLOW;
+        RtlCopyMemory(FsVolumeInfo->VolumeLabel,
+                      DeviceObject->Vpb->VolumeLabel,
+                      *BufferLength);
+        *BufferLength = 0;
+    }
+    else
+    {
+        Status =  STATUS_SUCCESS;
+        RtlCopyMemory(FsVolumeInfo->VolumeLabel,
+                      DeviceObject->Vpb->VolumeLabel,
+                      FsVolumeInfo->VolumeLabelLength);
+        *BufferLength -= DeviceObject->Vpb->VolumeLabelLength;
+    }
 
     if (DeviceExt->VolumeFcb->Flags & FCB_IS_FATX_ENTRY)
     {
@@ -64,12 +77,9 @@
     FsVolumeInfo->SupportsObjects = FALSE;
 
     DPRINT("Finished FsdGetFsVolumeInformation()\n");
-
-    *BufferLength -= (sizeof(FILE_FS_VOLUME_INFORMATION) + 
DeviceObject->Vpb->VolumeLabelLength);
-
     DPRINT("BufferLength %lu\n", *BufferLength);
 
-    return STATUS_SUCCESS;
+    return Status;
 }
 
 
@@ -80,29 +90,38 @@
     PFILE_FS_ATTRIBUTE_INFORMATION FsAttributeInfo,
     PULONG BufferLength)
 {
-    PCWSTR pName; ULONG Length;
+    NTSTATUS Status;
+    PCWSTR pName;
+    ULONG Length;
+
     DPRINT("FsdGetFsAttributeInformation()\n");
     DPRINT("FsAttributeInfo = %p\n", FsAttributeInfo);
     DPRINT("BufferLength %lu\n", *BufferLength);
 
-    if (*BufferLength < sizeof (FILE_FS_ATTRIBUTE_INFORMATION))
-        return STATUS_INFO_LENGTH_MISMATCH;
+    ASSERT(*BufferLength >= sizeof(FILE_FS_ATTRIBUTE_INFORMATION));
+    *BufferLength -= FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION, 
FileSystemName);
 
     if (DeviceExt->FatInfo.FatType == FAT32)
     {
-        Length = 10;
         pName = L"FAT32";
     }
     else
     {
-        Length = 6;
         pName = L"FAT";
     }
 
-    DPRINT("Required length %lu\n", (sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 
Length));
-
-    if (*BufferLength < (sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + Length))
-        return STATUS_BUFFER_OVERFLOW;
+    Length = wcslen(pName) * sizeof(WCHAR);
+    DPRINT("Required length %lu\n", 
(FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName) + Length));
+
+    if (*BufferLength < Length)
+    {
+        Status = STATUS_BUFFER_OVERFLOW;
+        Length = *BufferLength;
+    }
+    else
+    {
+        Status = STATUS_SUCCESS;
+    }
 
     FsAttributeInfo->FileSystemAttributes =
         FILE_CASE_PRESERVED_NAMES | FILE_UNICODE_ON_DISK;
@@ -115,10 +134,10 @@
 
     DPRINT("Finished FsdGetFsAttributeInformation()\n");
 
-    *BufferLength -= (sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + Length);
+    *BufferLength -= Length;
     DPRINT("BufferLength %lu\n", *BufferLength);
 
-    return STATUS_SUCCESS;
+    return Status;
 }
 
 
@@ -135,8 +154,7 @@
     DPRINT("FsdGetFsSizeInformation()\n");
     DPRINT("FsSizeInfo = %p\n", FsSizeInfo);
 
-    if (*BufferLength < sizeof(FILE_FS_SIZE_INFORMATION))
-        return STATUS_BUFFER_OVERFLOW;
+    ASSERT(*BufferLength >= sizeof(FILE_FS_SIZE_INFORMATION));
 
     DeviceExt = DeviceObject->DeviceExtension;
     Status = CountAvailableClusters(DeviceExt, 
&FsSizeInfo->AvailableAllocationUnits);
@@ -165,8 +183,7 @@
     DPRINT("BufferLength %lu\n", *BufferLength);
     DPRINT("Required length %lu\n", sizeof(FILE_FS_DEVICE_INFORMATION));
 
-    if (*BufferLength < sizeof(FILE_FS_DEVICE_INFORMATION))
-        return STATUS_BUFFER_OVERFLOW;
+    ASSERT(*BufferLength >= sizeof(FILE_FS_DEVICE_INFORMATION));
 
     FsDeviceInfo->DeviceType = FILE_DEVICE_DISK;
     FsDeviceInfo->Characteristics = DeviceObject->Characteristics;
@@ -193,8 +210,7 @@
     DPRINT("FsdGetFsFullSizeInformation()\n");
     DPRINT("FsSizeInfo = %p\n", FsSizeInfo);
 
-    if (*BufferLength < sizeof(FILE_FS_FULL_SIZE_INFORMATION))
-        return STATUS_BUFFER_OVERFLOW;
+    ASSERT(*BufferLength >= sizeof(FILE_FS_FULL_SIZE_INFORMATION));
 
     DeviceExt = DeviceObject->DeviceExtension;
     Status = CountAvailableClusters(DeviceExt, 
&FsSizeInfo->CallerAvailableAllocationUnits);
@@ -445,11 +461,8 @@
 
     
ExReleaseResourceLite(&((PDEVICE_EXTENSION)IrpContext->DeviceObject->DeviceExtension)->DirResource);
 
-    if (NT_SUCCESS(RC))
-        IrpContext->Irp->IoStatus.Information =
-            IrpContext->Stack->Parameters.QueryVolume.Length - BufferLength;
-    else
-        IrpContext->Irp->IoStatus.Information = 0;
+    IrpContext->Irp->IoStatus.Information =
+        IrpContext->Stack->Parameters.QueryVolume.Length - BufferLength;
 
     return RC;
 }


Reply via email to