MBRPartitionTable.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * Copyright (c) 2020-2022, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Error.h>
  8. #include <LibPartition/PartitionTable.h>
  9. namespace Partition {
  10. class MBRPartitionTable : public PartitionTable {
  11. public:
  12. struct [[gnu::packed]] Entry {
  13. u8 status;
  14. u8 chs1[3];
  15. u8 type;
  16. u8 chs2[3];
  17. u32 offset;
  18. u32 length;
  19. };
  20. struct [[gnu::packed]] Header {
  21. u8 code1[218];
  22. u16 ts_zero;
  23. u8 ts_drive;
  24. u8 ts_seconds;
  25. u8 ts_minutes;
  26. u8 ts_hours;
  27. u8 code2[216];
  28. u32 disk_signature;
  29. u16 disk_signature_zero;
  30. Entry entry[4];
  31. u16 mbr_signature;
  32. };
  33. public:
  34. ~MBRPartitionTable();
  35. static ErrorOr<NonnullOwnPtr<MBRPartitionTable>> try_to_initialize(PartitionableDevice);
  36. static OwnPtr<MBRPartitionTable> try_to_initialize(PartitionableDevice, u32 start_lba);
  37. explicit MBRPartitionTable(PartitionableDevice);
  38. MBRPartitionTable(PartitionableDevice, u32 start_lba);
  39. bool is_protective_mbr() const;
  40. bool contains_ebr() const;
  41. virtual bool is_valid() const override { return m_valid; }
  42. protected:
  43. Header const& header() const;
  44. bool is_header_valid() const { return m_header_valid; }
  45. private:
  46. bool read_boot_record();
  47. bool initialize();
  48. bool m_valid { false };
  49. bool m_header_valid { false };
  50. const u32 m_start_lba;
  51. ByteBuffer m_cached_header;
  52. };
  53. }