123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- using System;
- using System.Collections.Generic;
- using System.Text;
- using Utilities;
- namespace DiskAccessLibrary.FileSystems.NTFS
- {
- public partial class NTFSVolume : IExtendableFileSystem
- {
- public long GetMaximumSizeToExtend()
- {
-
- return m_volume.Size - (this.Size + m_volume.BytesPerSector);
- }
- public void Extend(long additionalNumberOfSectors)
- {
- Extend((ulong)additionalNumberOfSectors);
- }
- public void Extend(ulong additionalNumberOfSectors)
- {
- ulong originalNumberOfSectors = m_bootRecord.TotalSectors;
- ulong currentNumberOfClusters = m_bootRecord.TotalSectors / m_bootRecord.SectorsPerCluster;
- ulong additionalNumberOfClusters = additionalNumberOfSectors / m_bootRecord.SectorsPerCluster;
- Extend(currentNumberOfClusters, additionalNumberOfClusters);
-
- m_bootRecord.TotalSectors += additionalNumberOfClusters * m_bootRecord.SectorsPerCluster;
-
- byte[] bootRecordBytes = m_bootRecord.GetBytes();
- WriteSectors(0, bootRecordBytes);
-
-
- long backupBootSectorIndex = (long)(originalNumberOfSectors + additionalNumberOfSectors);
- WriteSectors(backupBootSectorIndex, bootRecordBytes);
- }
-
- private void Extend(ulong currentNumberOfClusters, ulong additionalNumberOfClusters)
- {
-
-
-
-
-
-
- byte[] bitmap;
- ulong nextClusterIndexInBitmap = 0;
- ulong writeOffset = m_bitmap.Length;
- if (currentNumberOfClusters % 64 > 0)
- {
- ulong numberOfClustersToAllocate = additionalNumberOfClusters - (64 - (currentNumberOfClusters % 64));
- ulong numberOfBytesToAllocate = (ulong)Math.Ceiling((double)numberOfClustersToAllocate / 8);
- numberOfBytesToAllocate = (ulong)Math.Ceiling((double)numberOfBytesToAllocate / 8) * 8;
-
-
-
- m_bitmap.ExtendFile(numberOfBytesToAllocate);
- bitmap = new byte[8 + numberOfBytesToAllocate];
-
- writeOffset = writeOffset - 8;
- byte[] temp = m_bitmap.ReadFromFile(writeOffset, 8);
- Array.Copy(temp, bitmap, 8);
- nextClusterIndexInBitmap = currentNumberOfClusters % 64;
- while (nextClusterIndexInBitmap < 64)
- {
- ClusterUsageBitmap.UpdateClusterStatus(bitmap, nextClusterIndexInBitmap, false);
- nextClusterIndexInBitmap++;
- }
- nextClusterIndexInBitmap += numberOfClustersToAllocate;
- }
- else
- {
- ulong additionalNumberOfBytes = (ulong)Math.Ceiling((double)additionalNumberOfClusters / 8);
- additionalNumberOfBytes = (ulong)Math.Ceiling((double)additionalNumberOfBytes / 8) * 8;
- bitmap = new byte[additionalNumberOfBytes];
- nextClusterIndexInBitmap = additionalNumberOfClusters;
- }
-
- while (nextClusterIndexInBitmap < (ulong)bitmap.Length * 8)
- {
- ClusterUsageBitmap.UpdateClusterStatus(bitmap, nextClusterIndexInBitmap, true);
- nextClusterIndexInBitmap++;
- }
- m_bitmap.WriteToFile(writeOffset, bitmap);
- }
- }
- }
|