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(); }
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; } }