diff --git a/FileSystemIDandChk/ChangeLog b/FileSystemIDandChk/ChangeLog index a1733d3c..6f814a1d 100644 --- a/FileSystemIDandChk/ChangeLog +++ b/FileSystemIDandChk/ChangeLog @@ -1,3 +1,12 @@ +2012-08-06 Natalia Portillo + + * Plugins/UNIXBFS.cs: + * FileSystemIDandChk.csproj: + Added UNIX Boot filesystem. + + * Plugins/FAT.cs: + Don't seek to FAT if value is bigger than volume size. + 2012-08-06 Natalia Portillo * Plugins/SolarFS.cs: diff --git a/FileSystemIDandChk/FileSystemIDandChk.csproj b/FileSystemIDandChk/FileSystemIDandChk.csproj index 233f135e..78dac517 100644 --- a/FileSystemIDandChk/FileSystemIDandChk.csproj +++ b/FileSystemIDandChk/FileSystemIDandChk.csproj @@ -65,6 +65,7 @@ + diff --git a/FileSystemIDandChk/Plugins/FAT.cs b/FileSystemIDandChk/Plugins/FAT.cs index 896f16da..bed746f1 100644 --- a/FileSystemIDandChk/Plugins/FAT.cs +++ b/FileSystemIDandChk/Plugins/FAT.cs @@ -39,7 +39,10 @@ namespace FileSystemIDandChk.Plugins rsectors = br.ReadUInt16(); if(rsectors==0) rsectors=1; - br.BaseStream.Seek(bps*rsectors + offset, SeekOrigin.Begin); // First FAT entry + if((ulong)br.BaseStream.Length > (ulong)(bps*rsectors + offset)) + br.BaseStream.Seek(bps*rsectors + offset, SeekOrigin.Begin); // First FAT entry + else + return false; first_fat_entry = br.ReadUInt32(); // Easier to manage if(MainClass.isDebug) diff --git a/FileSystemIDandChk/Plugins/UNIXBFS.cs b/FileSystemIDandChk/Plugins/UNIXBFS.cs new file mode 100644 index 00000000..7e0eaa35 --- /dev/null +++ b/FileSystemIDandChk/Plugins/UNIXBFS.cs @@ -0,0 +1,87 @@ +using System; +using System.IO; +using System.Text; +using FileSystemIDandChk; + +namespace FileSystemIDandChk.Plugins +{ + class BFS : Plugin + { + private const UInt32 BFS_MAGIC = 0x1BADFACE; + + public BFS(PluginBase Core) + { + base.Name = "UNIX Boot filesystem"; + base.PluginUUID = new Guid("1E6E0DA6-F7E4-494C-80C6-CB5929E96155"); + } + + public override bool Identify(FileStream stream, long offset) + { + UInt32 magic; + + BinaryReader br = new BinaryReader(stream); + br.BaseStream.Seek(offset, SeekOrigin.Begin); + + magic = br.ReadUInt32(); + if(magic == BFS_MAGIC) + return true; + else + return false; + } + + public override void GetInformation (FileStream stream, long offset, out string information) + { + information = ""; + + StringBuilder sb = new StringBuilder(); + BinaryReader br = new BinaryReader(stream); + + BFSSuperBlock bfs_sb = new BFSSuperBlock(); + + br.BaseStream.Seek(offset, SeekOrigin.Begin); + bfs_sb.s_magic = br.ReadUInt32(); + bfs_sb.s_start = br.ReadUInt32(); + bfs_sb.s_end = br.ReadUInt32(); + bfs_sb.s_from = br.ReadUInt32(); + bfs_sb.s_to = br.ReadUInt32(); + bfs_sb.s_bfrom = br.ReadInt32(); + bfs_sb.s_bto = br.ReadInt32(); + bfs_sb.s_fsname = StringHandlers.CToString(br.ReadBytes(6)); + bfs_sb.s_volume = StringHandlers.CToString(br.ReadBytes(6)); + + if(MainClass.isDebug) + { + Console.WriteLine("(BFS) bfs_sb.s_magic: 0x{0:X8}", bfs_sb.s_magic); + Console.WriteLine("(BFS) bfs_sb.s_start: 0x{0:X8}", bfs_sb.s_start); + Console.WriteLine("(BFS) bfs_sb.s_end: 0x{0:X8}", bfs_sb.s_end); + Console.WriteLine("(BFS) bfs_sb.s_from: 0x{0:X8}", bfs_sb.s_from); + Console.WriteLine("(BFS) bfs_sb.s_to: 0x{0:X8}", bfs_sb.s_to); + Console.WriteLine("(BFS) bfs_sb.s_bfrom: 0x{0:X8}", bfs_sb.s_bfrom); + Console.WriteLine("(BFS) bfs_sb.s_bto: 0x{0:X8}", bfs_sb.s_bto); + Console.WriteLine("(BFS) bfs_sb.s_fsname: 0x{0}", bfs_sb.s_fsname); + Console.WriteLine("(BFS) bfs_sb.s_volume: 0x{0}", bfs_sb.s_volume); + } + + sb.AppendLine("UNIX Boot filesystem"); + sb.AppendFormat("Volume goes from byte {0} to byte {1}, for {2} bytes", bfs_sb.s_start, bfs_sb.s_end, bfs_sb.s_end-bfs_sb.s_start).AppendLine(); + sb.AppendFormat("Filesystem name: {0}", bfs_sb.s_fsname).AppendLine(); + sb.AppendFormat("Volume name: {0}", bfs_sb.s_volume).AppendLine(); + + information = sb.ToString(); + } + + private struct BFSSuperBlock + { + public UInt32 s_magic; // 0x00, 0x1BADFACE + public UInt32 s_start; // 0x04, start in bytes of volume + public UInt32 s_end; // 0x08, end in bytes of volume + public UInt32 s_from; // 0x0C, unknown :p + public UInt32 s_to; // 0x10, unknown :p + public Int32 s_bfrom; // 0x14, unknown :p + public Int32 s_bto; // 0x18, unknown :p + public string s_fsname; // 0x1C, 6 bytes, filesystem name + public string s_volume; // 0x22, 6 bytes, volume name + } + } +} +