1use plain::Plain;
4use uefi::guid::Guid;
5
6#[derive(Debug)]
7pub enum HeaderKind {
8 Compression,
9 GuidDefined,
10 Disposable,
11 Pe32,
12 Pic,
13 Te,
14 DxeDepex,
15 Version,
16 UserInterface,
17 Compatibility16,
18 VolumeImage,
19 Freeform,
20 Raw,
21 PeiDepex,
22 MmDepex,
23 Unknown(u8)
24}
25
26#[repr(packed)]
28pub struct Header {
29 size: [u8; 3],
30 kind: u8,
31}
32
33impl Header {
34 pub fn size(&self) -> usize {
35 self.size[0] as usize | (self.size[1] as usize) << 8 | (self.size[2] as usize) << 16
36 }
37
38 pub fn kind(&self) -> HeaderKind {
39 match self.kind {
40 0x01 => HeaderKind::Compression,
41 0x02 => HeaderKind::GuidDefined,
42 0x03 => HeaderKind::Disposable,
43 0x10 => HeaderKind::Pe32,
44 0x11 => HeaderKind::Pic,
45 0x12 => HeaderKind::Te,
46 0x13 => HeaderKind::DxeDepex,
47 0x14 => HeaderKind::Version,
48 0x15 => HeaderKind::UserInterface,
49 0x16 => HeaderKind::Compatibility16,
50 0x17 => HeaderKind::VolumeImage,
51 0x18 => HeaderKind::Freeform,
52 0x19 => HeaderKind::Raw,
53 0x1B => HeaderKind::PeiDepex,
54 0x1C => HeaderKind::MmDepex,
55 unknown => HeaderKind::Unknown(unknown)
56 }
57 }
58}
59
60unsafe impl Plain for Header {}
61
62#[repr(packed)]
63pub struct GuidDefined {
64 pub guid: Guid,
65 pub data_offset: u16,
66 pub attributes: u16,
67}
68
69unsafe impl Plain for GuidDefined {}