// /*************************************************************************** // Aaru Data Preservation Suite // ---------------------------------------------------------------------------- // // Filename : Structs.cs // Author(s) : Natalia Portillo // // Component : OS/2 High Performance File System plugin. // // --[ Description ] ---------------------------------------------------------- // // Identifies the OS/2 High Performance File System and shows information. // // --[ License ] -------------------------------------------------------------- // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; either version 2.1 of the // License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, see . // // ---------------------------------------------------------------------------- // Copyright © 2011-2024 Natalia Portillo // ****************************************************************************/ using System.Runtime.InteropServices; namespace Aaru.Filesystems; // Information from an old unnamed document /// /// Implements detection of IBM's High Performance File System (HPFS) public sealed partial class HPFS { #region Nested type: BiosParameterBlock /// BIOS Parameter Block, at sector 0 [StructLayout(LayoutKind.Sequential, Pack = 1)] readonly struct BiosParameterBlock { /// 0x000, Jump to boot code [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public readonly byte[] jump; /// 0x003, OEM Name, 8 bytes, space-padded [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public readonly byte[] oem_name; /// 0x00B, Bytes per sector public readonly ushort bps; /// 0x00D, Sectors per cluster public readonly byte spc; /// 0x00E, Reserved sectors between BPB and... does it have sense in HPFS? public readonly ushort rsectors; /// 0x010, Number of FATs... seriously? public readonly byte fats_no; /// 0x011, Number of entries on root directory... ok public readonly ushort root_ent; /// 0x013, Sectors in volume... doubt it public readonly ushort sectors; /// 0x015, Media descriptor public readonly byte media; /// 0x016, Sectors per FAT... again public readonly ushort spfat; /// 0x018, Sectors per track... you're kidding public readonly ushort sptrk; /// 0x01A, Heads... stop! public readonly ushort heads; /// 0x01C, Hidden sectors before BPB public readonly uint hsectors; /// 0x024, Sectors in volume if > 65535... public readonly uint big_sectors; /// 0x028, Drive number public readonly byte drive_no; /// 0x029, Volume flags? public readonly byte nt_flags; /// 0x02A, EPB signature, 0x29 public readonly byte signature; /// 0x02B, Volume serial number public readonly uint serial_no; /// 0x02F, Volume label, 11 bytes, space-padded [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] public readonly byte[] volume_label; /// 0x03A, Filesystem type, 8 bytes, space-padded ("HPFS ") [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public readonly byte[] fs_type; /// Boot code. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 448)] public readonly byte[] boot_code; /// 0x1FE, 0xAA55 public readonly ushort signature2; } #endregion #region Nested type: SpareBlock /// HPFS spareblock at sector 17 [StructLayout(LayoutKind.Sequential, Pack = 1)] readonly struct SpareBlock { /// 0x000, 0xF9911849 public readonly uint magic1; /// 0x004, 0xFA5229C5 public readonly uint magic2; /// 0x008, HPFS flags public readonly byte flags1; /// 0x009, HPFS386 flags public readonly byte flags2; /// 0x00A, Alignment public readonly ushort dummy; /// 0x00C, LSN of hotfix directory public readonly uint hotfix_start; /// 0x010, Used hotfixes public readonly uint hotfix_used; /// 0x014, Total hotfixes available public readonly uint hotfix_entries; /// 0x018, Unused spare dnodes public readonly uint spare_dnodes_free; /// 0x01C, Length of spare dnodes list public readonly uint spare_dnodes; /// 0x020, LSN of codepage directory public readonly uint codepage_lsn; /// 0x024, Number of codepages used public readonly uint codepages; /// 0x028, SuperBlock CRC32 (only HPFS386) public readonly uint sb_crc32; /// 0x02C, SpareBlock CRC32 (only HPFS386) public readonly uint sp_crc32; } #endregion #region Nested type: SuperBlock /// HPFS superblock at sector 16 [StructLayout(LayoutKind.Sequential, Pack = 1)] readonly struct SuperBlock { /// 0x000, 0xF995E849 public readonly uint magic1; /// 0x004, 0xFA53E9C5 public readonly uint magic2; /// 0x008, HPFS version public readonly byte version; /// 0x009, 2 if <= 4 GiB, 3 if > 4 GiB public readonly byte func_version; /// 0x00A, Alignment public readonly ushort dummy; /// 0x00C, LSN pointer to root fnode public readonly uint root_fnode; /// 0x010, Sectors on volume public readonly uint sectors; /// 0x014, Bad blocks on volume public readonly uint badblocks; /// 0x018, LSN pointer to volume bitmap public readonly uint bitmap_lsn; /// 0x01C, 0 public readonly uint zero1; /// 0x020, LSN pointer to badblock directory public readonly uint badblock_lsn; /// 0x024, 0 public readonly uint zero2; /// 0x028, Time of last CHKDSK public readonly int last_chkdsk; /// 0x02C, Time of last optimization public readonly int last_optim; /// 0x030, Sectors of dir band public readonly uint dband_sectors; /// 0x034, Start sector of dir band public readonly uint dband_start; /// 0x038, Last sector of dir band public readonly uint dband_last; /// 0x03C, LSN of free space bitmap public readonly uint dband_bitmap; /// 0x040, Can be used for volume name (32 bytes) public readonly ulong zero3; /// 0x048, ... public readonly ulong zero4; /// 0x04C, ... public readonly ulong zero5; /// 0x050, ...; public readonly ulong zero6; /// 0x058, LSN pointer to ACLs (only HPFS386) public readonly uint acl_start; } #endregion }