Example #1
0
        public Fat32Partition(PartitionInfo info)
        {
            _info = base.info = info;

            diskFileName = String.Format("\\\\.\\{0}:", info.Letter);
            rootDirectoryName = String.Format("{0}:\\", info.Letter);

            bytesPerSector = GetBytesPerSector();
            diskFile = new UnmanagedFile(diskFileName);
            byte[] fatInfo = diskFile.ReadFile(bytesPerSector);

            fatCopiesNumber = fatInfo.AsWord(16);
            fatSize = fatInfo.AsWord(36);
            reservedAreaSize = fatInfo.AsWord(14);
            sectorsPerCluster = fatInfo.AsByte(13);
            fatAddress = reservedAreaSize;
            rootDirectoryCluster = fatInfo.AsInt32(44);

            bitsPerSector = GetBitsNumber(bytesPerSector);
            bytesPerCluster = bytesPerSector * sectorsPerCluster;
            fatContentSize = (uint)(fatSize * bytesPerSector);

            fatContent = LoadFatContent();
            info.FreeSpace = GetFreeDiskSpace();

            currentDirectory = new FatDirectoryObject
            {
                Name = String.Empty,
                Type = DirectoryObjectType.Directory,
                Cluster = rootDirectoryCluster
            };

            directoryStack.Push(currentDirectory);
            LoadCurrentDirectoryObjects();
        }
Example #2
0
        public HardDriveInfo(int hddNumber)
        {
            _number = hddNumber;
            _sectorSize = 0;
            _extendedAreaAddress = 0;
            string hardDriveName = "\\\\.\\PHYSICALDRIVE" + hddNumber;

            try
            {
                _handle = new UnmanagedFile(hardDriveName);
                byte[] mbr = ReadMbr();
                if (mbr.AsWord(0x01fe) != 0xAA55)
                {
                    throw new ErrorException("Partition is broken or not valid.");
                }

                var partitions = GetHddPartitions(mbr);
                if (_extendedAreaAddress != 0)
                {
                    int ext = _extendedAreaAddress;
                    _extendedAreaAddress = 0;

                    while (true)
                    {
                        int nextMbrAddress = ext + _extendedAreaAddress;

                        _handle.MovePointer(nextMbrAddress << _bitsPerSector, nextMbrAddress >> (32 - _bitsPerSector));
                        mbr = ReadMbr();
                        if (mbr.AsWord(0x01fe) != 0xAA55)
                        {
                            throw new ErrorException("Partition is broken or not valid.");
                        }

                        partitions.Concat(GetHddPartitions(mbr, nextMbrAddress));

                        if (_extendedAreaAddress == 0)
                        {
                            break;
                        }
                    }
                }

                Partitions = partitions;
            }
            catch (System.IO.FileNotFoundException)
            {
                Partitions = null;
            }
        }