MBRPartitionTable.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. #ifdef KERNEL
  36. static ErrorOr<NonnullOwnPtr<MBRPartitionTable>> try_to_initialize(Kernel::StorageDevice&);
  37. static OwnPtr<MBRPartitionTable> try_to_initialize(Kernel::StorageDevice&, u32 start_lba);
  38. explicit MBRPartitionTable(Kernel::StorageDevice&);
  39. MBRPartitionTable(Kernel::StorageDevice&, u32 start_lba);
  40. #else
  41. static ErrorOr<NonnullOwnPtr<MBRPartitionTable>> try_to_initialize(NonnullRefPtr<Core::DeprecatedFile>);
  42. static OwnPtr<MBRPartitionTable> try_to_initialize(NonnullRefPtr<Core::DeprecatedFile>, u32 start_lba);
  43. explicit MBRPartitionTable(NonnullRefPtr<Core::DeprecatedFile>);
  44. MBRPartitionTable(NonnullRefPtr<Core::DeprecatedFile>, u32 start_lba);
  45. #endif
  46. bool is_protective_mbr() const;
  47. bool contains_ebr() const;
  48. virtual bool is_valid() const override { return m_valid; };
  49. protected:
  50. Header const& header() const;
  51. bool is_header_valid() const { return m_header_valid; };
  52. private:
  53. bool read_boot_record();
  54. bool initialize();
  55. bool m_valid { false };
  56. bool m_header_valid { false };
  57. const u32 m_start_lba;
  58. ByteBuffer m_cached_header;
  59. };
  60. }