예제 #1
0
        public Fat16Partition(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((uint)bytesPerSector);

            fatCopiesNumber       = fatInfo.AsWord(16);
            fatSize               = fatInfo.AsWord(22);
            reservedAreaSize      = fatInfo.AsWord(14);
            sectorsPerCluster     = fatInfo.AsByte(13);
            fatAddress            = reservedAreaSize;
            rootDirectoryEntities = fatInfo.AsWord(17);
            rootDirectorySector   = reservedAreaSize + (fatCopiesNumber * fatSize);
            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 = 0
            };

            directoryStack.Push(currentDirectory);
            LoadCurrentDirectoryObjects();
        }
예제 #2
0
        void Initialize()
        {
            int hddNumber        = ...;
            int partitionAddress = ...;

            string hardDriveName = "\\\\.\\PHYSICALDRIVE" + hddNumber;

            diskFile       = new UnmanagedFile(hardDriveName);
            bytesPerSector = GetBytesPerSector();
            bitsPerSector  = GetBitsNumber(bytesPerSector);
            diskFile.MovePointer(partitionAddress << bitsPerSector,
                                 partitionAddress >> (32 - bitsPerSector));

            byte[] fatInfo = diskFile.ReadFile(bytesPerSector);
            fatCopiesNumber       = fatInfo.AsWord(16);
            fatSize               = fatInfo.AsWord(22);
            reservedAreaSize      = fatInfo.AsWord(14);
            sectorsPerCluster     = fatInfo.AsByte(13);
            fatAddress            = reservedAreaSize;
            rootDirectoryEntities = fatInfo.AsWord(17);
            rootDirectorySector   = reservedAreaSize + (fatCopiesNumber * fatSize);

            bytesPerCluster = bytesPerSector * sectorsPerCluster;
            fatContentSize  = (uint)(fatSize * bytesPerSector);
            fatContent      = LoadFatContent();

            contents = LoadCurrentDirectoryObjects().ToList();
        }
예제 #3
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;
            }
        }
예제 #4
0
        void Initialize()
        {
            int hddNumber = ...;
            int partitionAddress = ...;

            string hardDriveName = "\\\\.\\PHYSICALDRIVE" + hddNumber;
            diskFile = new UnmanagedFile(hardDriveName);
            bytesPerSector = GetBytesPerSector();
            bitsPerSector = GetBitsNumber(bytesPerSector);
            diskFile.MovePointer(partitionAddress << bitsPerSector,
                                 partitionAddress >> (32 - bitsPerSector));

            byte[] fatInfo = diskFile.ReadFile(bytesPerSector);
            fatCopiesNumber = fatInfo.AsWord(16);
            fatSize = fatInfo.AsWord(22);
            reservedAreaSize = fatInfo.AsWord(14);
            sectorsPerCluster = fatInfo.AsByte(13);
            fatAddress = reservedAreaSize;
            rootDirectoryEntities = fatInfo.AsWord(17);
            rootDirectorySector = reservedAreaSize + (fatCopiesNumber * fatSize);

            bytesPerCluster = bytesPerSector * sectorsPerCluster;
            fatContentSize = (uint)(fatSize * bytesPerSector);
            fatContent = LoadFatContent();

            contents = LoadCurrentDirectoryObjects().ToList();
        }