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