Windows: Add Cell to FS Volume Information Label
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSVolumeInfo.cpp
index 672e4a6..6e57fdb 100644 (file)
@@ -287,7 +287,7 @@ AFSQueryFsVolumeInfo( IN AFSVolumeInfoCB *VolumeInfo,
 {
 
     NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
-    ULONG ulCopyLength;
+    ULONG ulLabelLength;
 
     RtlZeroMemory( Buffer,
                    *Length);
@@ -295,18 +295,17 @@ AFSQueryFsVolumeInfo( IN AFSVolumeInfoCB *VolumeInfo,
     if( *Length >= (ULONG)sizeof( FILE_FS_VOLUME_INFORMATION))
     {
 
-        if( *Length >= (ULONG)(FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel) + (LONG)VolumeInfo->VolumeLabelLength))
-        {
+        ulLabelLength = VolumeInfo->VolumeLabelLength +
+            VolumeInfo->CellLength + sizeof( WCHAR);
 
-            ulCopyLength = (LONG)VolumeInfo->VolumeLabelLength;
+        if( *Length >= (ULONG)(FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel) + ulLabelLength))
+        {
 
             ntStatus = STATUS_SUCCESS;
         }
         else
         {
 
-            ulCopyLength = *Length - FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel);
-
             ntStatus = STATUS_BUFFER_OVERFLOW;
         }
 
@@ -314,20 +313,37 @@ AFSQueryFsVolumeInfo( IN AFSVolumeInfoCB *VolumeInfo,
 
         Buffer->VolumeSerialNumber = VolumeInfo->VolumeID;
 
-        Buffer->VolumeLabelLength = VolumeInfo->VolumeLabelLength;
+        Buffer->VolumeLabelLength = ulLabelLength;
 
         Buffer->SupportsObjects = FALSE;
 
         *Length -= FIELD_OFFSET( FILE_FS_VOLUME_INFORMATION, VolumeLabel);
 
-        if( ulCopyLength > 0)
+        if( *Length > 0)
         {
 
             RtlCopyMemory( Buffer->VolumeLabel,
-                           VolumeInfo->VolumeLabel,
-                           ulCopyLength);
+                           VolumeInfo->Cell,
+                           min( *Length, VolumeInfo->CellLength));
+
+            *Length -= min( *Length, VolumeInfo->CellLength);
+
+            if ( *Length >= sizeof( WCHAR))
+            {
 
-            *Length -= ulCopyLength;
+                Buffer->VolumeLabel[ VolumeInfo->CellLength / sizeof( WCHAR)] = L'#';
+
+                *Length -= sizeof( WCHAR);
+
+                if ( *Length > 0) {
+
+                    RtlCopyMemory( &Buffer->VolumeLabel[ (VolumeInfo->CellLength + sizeof( WCHAR)) / sizeof( WCHAR)],
+                                   VolumeInfo->VolumeLabel,
+                                   min( *Length, VolumeInfo->VolumeLabelLength));
+
+                    *Length -= min( *Length, VolumeInfo->VolumeLabelLength);
+                }
+            }
         }
     }
 
@@ -425,7 +441,6 @@ AFSQueryFsAttributeInfo( IN AFSVolumeInfoCB *VolumeInfo,
                          IN PFILE_FS_ATTRIBUTE_INFORMATION Buffer,
                          IN OUT PULONG Length)
 {
-    UNREFERENCED_PARAMETER(VolumeInfo);
     NTSTATUS ntStatus = STATUS_SUCCESS;
 
     RtlZeroMemory( Buffer,
@@ -434,10 +449,7 @@ AFSQueryFsAttributeInfo( IN AFSVolumeInfoCB *VolumeInfo,
     if( *Length >= (LONG)(sizeof( FILE_FS_ATTRIBUTE_INFORMATION)))
     {
 
-        Buffer->FileSystemAttributes = (FILE_CASE_PRESERVED_NAMES |
-                                        FILE_UNICODE_ON_DISK |
-                                        FILE_SUPPORTS_HARD_LINKS |
-                                        FILE_SUPPORTS_REPARSE_POINTS);
+        Buffer->FileSystemAttributes = VolumeInfo->FileSystemAttributes;
 
         Buffer->MaximumComponentNameLength = 255;