/// <summary> /// Refreshes the logical device. /// </summary> public void Refresh() { bootSector = null; data = new UInt16[0]; // Jump to FAT partition DeviceStream.Seek(partition.RelativeSector * PhysicalDevice.SectorSize, SeekOrigin.Begin); if (!partition.IsFAT) { return; } // Boot sector bootSector = (BootSector)StreamActivator.CreateInstance(typeof(BootSector), DeviceStream); DeviceStream.Seek(448, SeekOrigin.Current); // Failsafe .. be sure FAT partition table is valid if ((DeviceStream.ReadByte() != 0x55) || (DeviceStream.ReadByte() != 0xAA)) { bootSector = null; return; } // Get FAT sector BinaryReader br = new BinaryReader(DeviceStream); data = new UInt16[bootSector.NumberOfFATs * ((bootSector.SectorsPerFAT * PhysicalDevice.SectorSize) / 2)]; for (int i = 0; i < data.Length; i++) { data[i] = br.ReadUInt16(); } }
/// <summary> /// Refreshes the device. /// </summary> public void Refresh() { if (deviceStream == null) { return; } logicalDevices = null; ArrayList logicalDeviceList = new ArrayList(); deviceStream.Seek(0, SeekOrigin.Begin); BinaryReader br = new BinaryReader(deviceStream); // Read the MBR byte[] sector = br.ReadBytes(SectorSize); // Failsafe .. be sure MBR is vaild if ((sector[0x01FE] != 0x55) || (sector[0x01FF] != 0xAA)) { Console.WriteLine("Corrupt MBR; exiting"); return; } // Partition table int p = 0x01BE; // Beginning of partition table for (int i = 0; i < 4; i++, p += 16) { PartitionTable partition = (PartitionTable)StreamActivator.CreateInstance(typeof(PartitionTable), sector, p); if (partition.SysId == 0) { continue; } logicalDeviceList.Add(new LogicalDevice(this, partition)); } logicalDevices = (LogicalDevice[])logicalDeviceList.ToArray(typeof(LogicalDevice)); }
/// <summary> /// Enumerates the file entries contained in the current directory. /// </summary> private FileEntry[] EnumerateFileEntries(uint clusterNumber, bool includeFiles, bool includeDirectories, bool deleted, bool currentOnly, bool parentOnly) { ArrayList files = new ArrayList(); uint sector = (uint)(device.RootDirectorySector + ((((clusterNumber == 0) ? (0) : (clusterNumber + 2))) * device.BootSector.SectorsPerCluster)); // Jump to next directory sector DeviceStream.Seek((device.Partition.RelativeSector + sector) * device.BootSector.BytesPerSector, SeekOrigin.Begin); while (true) { FileEntry file = (FileEntry)StreamActivator.CreateInstance(typeof(FileEntry), DeviceStream); if (file.FileAttributes == FileAttributes.LongFileName) { continue; } if (file.Name[0] == 0x00) { break; // No more entries } if (currentOnly) { if ((clusterNumber == 0) && ((file.FileAttributes & FileAttributes.VolumeId) != 0)) { files.Add(file); } else if (file.Name == ". ") { files.Add(file); } continue; } if (parentOnly) { if (file.Name == ".. ") { files.Add(file); } continue; } // Skip the volume id if ((file.FileAttributes & FileAttributes.VolumeId) != 0) { continue; } // Skip deleted/non-deleted entries if ((file.Name[0] == '?') != deleted) { continue; } // Show info bool isDirectory = ((file.FileAttributes & FileAttributes.Directory) != 0); if ((isDirectory) && (!includeDirectories)) { continue; } if ((!isDirectory) && (!includeFiles)) { continue; } files.Add(file); } return((FileEntry[])files.ToArray(typeof(FileEntry))); }