public void WriteDataClusters(NTFSVolume volume, long firstClusterVCN, byte[] data) { int count; long lastClusterVcnToWrite; if (data.Length % volume.BytesPerCluster > 0) { int paddedLength = (int)Math.Ceiling((double)data.Length / volume.BytesPerCluster) * volume.BytesPerCluster; // last cluster could be partial, we must zero-fill it before write count = paddedLength / volume.BytesPerCluster; lastClusterVcnToWrite = firstClusterVCN + count - 1; if (lastClusterVcnToWrite == HighestVCN) { byte[] temp = new byte[paddedLength]; Array.Copy(data, temp, data.Length); data = temp; } else { // only the last cluster can be partial throw new ArgumentException("Cannot write partial cluster"); } } else { count = data.Length / volume.BytesPerCluster; lastClusterVcnToWrite = firstClusterVCN + count - 1; } if (firstClusterVCN < LowestVCN || lastClusterVcnToWrite > HighestVCN) { string message = String.Format("Cluster VCN {0}-{1} is not within the valid range ({2}-{3})", firstClusterVCN, firstClusterVCN + count, LowestVCN, HighestVCN); throw new ArgumentOutOfRangeException(message); } KeyValuePairList <long, int> sequence = m_dataRunSequence.TranslateToLCN(firstClusterVCN, count); long bytesWritten = 0; foreach (KeyValuePair <long, int> run in sequence) { byte[] clusters = new byte[run.Value * volume.BytesPerCluster]; Array.Copy(data, bytesWritten, clusters, 0, clusters.Length); volume.WriteClusters(run.Key, clusters); bytesWritten += clusters.Length; } }