Skip to content

Commit

Permalink
wip: header lba
Browse files Browse the repository at this point in the history
  • Loading branch information
swysocki committed Nov 9, 2021
1 parent 40e636c commit d204cd9
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 2 deletions.
24 changes: 22 additions & 2 deletions pygpt_disk/table.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,41 @@
LBA 2 - 33 partitions
"""
from pygpt_disk.disk import Disk
import struct


class Table:
_header_sig = b"\x45\x46\x49\x20\x50\x41\x52\x54"
_revision = b"\x00\x00\x01\x00"
_header_sig = b"\x45\x46\x49\x20\x50\x41\x52\x54" # "EFI PART"
_revision = b"\x00\x00\x01\x00" # "1.0"
_header_size = b"\x5C\x00\x00\x00" # 92 bytes
_header_crc = (
b"\x00\x00\x00\x00" # CRC/zlib of header with this field zero'd during calc
)
_reserved = b"\x00\x00\x00\x00" # reserved (all zeros)

def __init__(self, disk: Disk) -> None:
self.disk = disk
self._primary_header_lba = int(self.disk.sector_size / self.disk.sector_size)
self._backup_header_lba = int(
(self.disk.size - self.disk.sector_size) / self.disk.sector_size
)

def create(self) -> None:
"""Create blank GPT Table Header"""
# move to LBA 1
self.disk.buffer.seek(self.disk.sector_size)
self.disk.buffer.write(Table._header_sig)
self.disk.buffer.write(Table._revision)
self.disk.buffer.write(Table._header_size)
self.disk.buffer.write(Table._header_crc)
self.disk.buffer.write(Table._reserved)
# use struct.pack with implicit native byte order and long type to
# align data on 8 byte boundaries
self.disk.buffer.write(struct.pack("l", self._primary_header_lba))
self.disk.buffer.write(struct.pack("l", self._backup_header_lba))
self.disk.buffer.seek(self.disk.size - 1)
# move to the end of the buffer and write to avoid truncating the stream
self.disk.buffer.write(b"\0")

def checksum_header(self) -> None:
pass
3 changes: 3 additions & 0 deletions tests/test_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,7 @@ def test_init(fresh_disk: disk.Disk):
t.disk.buffer.seek(fresh_disk.sector_size)
assert t.disk.buffer.read(8) == b"EFI PART"
assert t.disk.buffer.read(4) == b"\x00\x00\x01\x00"
assert t.disk.buffer.read(4) == b"\x5C\x00\x00\x00"
assert t.disk.buffer.read(4) == b"\x00" * 4
assert t.disk.buffer.read(4) == b"\x00" * 4
fresh_disk.write()

0 comments on commit d204cd9

Please sign in to comment.