/// <summary> /// Создаёт файл-образ раздела жёсткого диска с файловой системой DehaxFS с параметрами. /// </summary> /// <param name="diskPartitionSize">Размер раздела</param> /// <param name="diskClusterFactor">Размер кластера, множитель секторов диска</param> public DFSImage(long diskPartitionSize, byte diskClusterFactor) { diskClusterFactor = (byte)Math.Pow(2, diskClusterFactor - 1); _diskPartitionSize = diskPartitionSize; _diskClusterFactor = diskClusterFactor; _diskClusterSize = DISK_BYTES_PER_SECTOR * diskClusterFactor; _bitMap = new BitMap((int)(_diskPartitionSize / _diskClusterSize)); _inodes = new Inodes((int)(_diskPartitionSize / _diskClusterSize)); _rootDirectory = new RootDirectory(_diskClusterSize); _emptyData = new byte[_diskPartitionSize - Marshal.SizeOf <Superblock>() - _bitMap.GetLength() - _inodes.GetLength() - _rootDirectory.GetLength()]; _superblock = new Superblock() { filesystemType = 0x28, numClusters = (int)(_diskPartitionSize / _diskClusterSize), clusterFactor = diskClusterFactor, inodeArraySize = _inodes.GetLength(), bitMapSize = _bitMap.GetLength(), numFreeClusters = _emptyData.Length / _diskClusterSize, numFreeInode = (int)(_diskPartitionSize / _diskClusterSize - 1) }; InitializeFileSystem(); }
/// <summary> /// Создаёт файл-образ раздела жёсткого диска с файловой системой DehaxFS с параметрами. /// </summary> /// <param name="diskPartitionSize">Размер раздела</param> /// <param name="diskClusterFactor">Размер кластера, множитель секторов диска</param> public DFSImage(long diskPartitionSize, byte diskClusterFactor) { diskClusterFactor = (byte)Math.Pow(2, diskClusterFactor - 1); _diskPartitionSize = diskPartitionSize; _diskClusterFactor = diskClusterFactor; _diskClusterSize = DISK_BYTES_PER_SECTOR * diskClusterFactor; _bitMap = new BitMap((int)(_diskPartitionSize / _diskClusterSize)); _inodes = new Inodes((int)(_diskPartitionSize / _diskClusterSize)); _rootDirectory = new RootDirectory(_diskClusterSize); _emptyData = new byte[_diskPartitionSize - Marshal.SizeOf<Superblock>() - _bitMap.GetLength() - _inodes.GetLength() - _rootDirectory.GetLength()]; _superblock = new Superblock() { filesystemType = 0x28, numClusters = (int)(_diskPartitionSize / _diskClusterSize), clusterFactor = diskClusterFactor, inodeArraySize = _inodes.GetLength(), bitMapSize = _bitMap.GetLength(), numFreeClusters = _emptyData.Length / _diskClusterSize, numFreeInode = (int)(_diskPartitionSize / _diskClusterSize - 1) }; InitializeFileSystem(); }
private void InitializeFileSystem() { Inodes.Inode inode = new Inodes.Inode() { fileType = 0x02, // Каталог inodeId = 1, // root-каталог userId = 1, // root пользователь groupId = 1, // root группа permissions = 0x01FD, // rwx|rwx|r-x attributes = 0x2, // Системный fileSize = _diskClusterSize, datetimeFileCreated = Utils.GetTimestamp(), datetimeFileModified = Utils.GetTimestamp(), datetimeInodeModified = Utils.GetTimestamp(), firstClusterIndex = 0x0 // Корневой каталог }; _inodes[0] = inode; for (int i = 1; i < _inodes.GetCount(); i++) { inode = new Inodes.Inode() { fileType = 0xFF, inodeId = i + 1, datetimeInodeModified = Utils.GetTimestamp() }; _inodes[i] = inode; } _superblock.bitMapAddress = Marshal.SizeOf <Superblock>(); _superblock.inodeArrayAddress = _superblock.bitMapAddress + _bitMap.GetLength(); _superblock.rootAddress = _superblock.inodeArrayAddress + _inodes.GetLength(); _superblock.dataAddress = _superblock.rootAddress + _rootDirectory.GetLength(); }