Ejemplo n.º 1
0
        /// <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();
        }
Ejemplo n.º 2
0
        /// <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();
        }
Ejemplo n.º 3
0
        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();
        }