Serenity Operating System
at master 70 lines 1.9 kB view raw
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}