private static ushort GetPhysicalOffset(FloppyHeader floppyHeader, ushort sector) { var rootDirectory = floppyHeader.DirectoryEntries * 32; var initialOffset = (ushort)(floppyHeader.BytesPerSector + 2 * floppyHeader.BytesPerSector * floppyHeader.SectorsPerFat) + rootDirectory; return((ushort)(initialOffset + (sector - 2) * 512)); }
private static void DisplayFloppyHeader(FloppyHeader floppyHeader) { Console.WriteLine("Boot trap: " + Encoding.ASCII.GetString(floppyHeader.BootTrap)); Console.WriteLine("OEM: " + Encoding.ASCII.GetString(floppyHeader.Oem)); Console.WriteLine("Bytes per sector: " + floppyHeader.BytesPerSector); Console.WriteLine("Sectors per cluster: " + floppyHeader.SectorsPerCluster); Console.WriteLine("Reserved sectors: " + floppyHeader.ReservedSectors); Console.WriteLine("FAT count: " + floppyHeader.FatCount); Console.WriteLine("Directory entries: " + floppyHeader.DirectoryEntries); Console.WriteLine("Total sectors: " + floppyHeader.TotalSectors); Console.WriteLine("Media descriptor type: " + floppyHeader.MediaDescriptorType); Console.WriteLine("Sectors per FAT: " + floppyHeader.SectorsPerFat); Console.WriteLine("Sectors per track: " + floppyHeader.SectorsPerTrack); Console.WriteLine("Sides count: " + floppyHeader.SidesCount); Console.WriteLine("Hidden sectors: " + floppyHeader.HidddenSectors); Console.WriteLine("Large amount: " + floppyHeader.LargeAmount); Console.WriteLine(); Console.WriteLine("Drive number: " + floppyHeader.DriveNumber); Console.WriteLine("Flags in Windows NT: " + floppyHeader.FlagsInWindowsNt); Console.WriteLine("Signature: " + floppyHeader.Signature); Console.WriteLine("Volume ID: " + floppyHeader.VolumeId); Console.WriteLine("Volume label: " + Encoding.ASCII.GetString(floppyHeader.VolumeLabel)); Console.WriteLine("System identifier: " + Encoding.ASCII.GetString(floppyHeader.SystemIdentifier)); Console.WriteLine("Boot code: " + Encoding.ASCII.GetString(floppyHeader.BootCode)); Console.WriteLine("Bootloader signature: " + floppyHeader.BootSignature); }
public static List <Directory> Parse(FloppyHeader floppyHeader, byte[] floppyData) { var directories = new List <Directory>(); var sectorsToParse = floppyHeader.DirectoryEntries * 32 / floppyHeader.BytesPerSector; var initialOffset = (ushort)(floppyHeader.BytesPerSector + 2 * floppyHeader.BytesPerSector * floppyHeader.SectorsPerFat); var offset = initialOffset; for (var sector = 0; sector < sectorsToParse; sector++) { var data = floppyData.Skip(offset).Take(512).ToArray(); var fat = new Fat(); var size = Marshal.SizeOf(fat); var ptr = Marshal.AllocHGlobal(size); Marshal.Copy(data, 0, ptr, size); fat = (Fat)Marshal.PtrToStructure(ptr, fat.GetType()); Marshal.FreeHGlobal(ptr); directories.AddRange(fat.Directories); offset += floppyHeader.BytesPerSector; } return(directories); }
public static FloppyHeader Parse(byte[] floppyData) { var header = new FloppyHeader(); var size = Marshal.SizeOf(header); var ptr = Marshal.AllocHGlobal(size); Marshal.Copy(floppyData, 0, ptr, size); header = (FloppyHeader)Marshal.PtrToStructure(ptr, header.GetType()); Marshal.FreeHGlobal(ptr); return(header); }
public static string GetContent(FloppyHeader floppyHeader, byte[] floppyData, List <ushort> chain) { var content = ""; foreach (var sector in chain) { var physicalOffset = GetPhysicalOffset(floppyHeader, sector); var data = floppyData.Skip(physicalOffset).Take(512).ToArray(); content += Encoding.ASCII.GetString(data); } return(content); }
public static ushort[] Parse(FloppyHeader floppyHeader, byte[] floppyData, uint index) { var initialOffset = GetOffsetForFatIndex(floppyHeader, index); var fatSize = GetSizeOfFat(floppyHeader); var currentOffset = initialOffset; var maxOffset = currentOffset + fatSize; var clusters = new List <ushort>(); while (currentOffset < maxOffset) { var firstByte = floppyData[currentOffset]; var secondByte = floppyData[currentOffset + 1]; var thirdByte = floppyData[currentOffset + 2]; clusters.Add(GetClusterValueWithFullLeft(firstByte, secondByte)); clusters.Add(GetClusterValueWithFullRight(secondByte, thirdByte)); currentOffset += 3; } return(clusters.ToArray()); }
private static ushort GetSizeOfFat(FloppyHeader floppyHeader) { return((ushort)(floppyHeader.BytesPerSector * floppyHeader.SectorsPerFat)); }
private static ushort GetOffsetForFatIndex(FloppyHeader floppyHeader, uint index) { return((ushort)(floppyHeader.BytesPerSector + index * floppyHeader.BytesPerSector * floppyHeader.SectorsPerFat)); }