:py:mod:`dissect.hypervisor.disk.vhd` ===================================== .. py:module:: dissect.hypervisor.disk.vhd Module Contents --------------- Classes ~~~~~~~ .. autoapisummary:: dissect.hypervisor.disk.vhd.VHD dissect.hypervisor.disk.vhd.Disk dissect.hypervisor.disk.vhd.FixedDisk dissect.hypervisor.disk.vhd.DynamicDisk dissect.hypervisor.disk.vhd.BlockAllocationTable Functions ~~~~~~~~~ .. autoapisummary:: :nosignatures: dissect.hypervisor.disk.vhd.read_footer .. py:function:: read_footer(fh: BinaryIO) -> dissect.hypervisor.disk.c_vhd.c_vhd.footer .. py:class:: VHD(fh: BinaryIO) Bases: :py:obj:`dissect.util.stream.AlignedStream` Basic buffered stream that provides aligned reads. Must be subclassed for various stream implementations. Subclasses can implement: - :meth:`~AlignedStream._read` - :meth:`~AlignedStream._seek` The offset and length for ``_read`` are guaranteed to be aligned for streams of a known size. If your stream has an unknown size (i.e. ``size == None``), reads of length ``-1`` (i.e. read until EOF) will be passed through to your implementation of ``_read``. The only time that overriding ``_seek`` would make sense is if there's no known size of your stream, but still want to provide ``SEEK_END`` functionality. Most subclasses of ``AlignedStream`` take one or more file-like objects as source. Operations on these subclasses, like reading, will modify the source file-like object as a side effect. :param size: The size of the stream. This is used in read and seek operations. ``None`` if unknown. :param align: The alignment size. Read operations are aligned on this boundary. Also determines buffer size. .. automethod:: _read .. automethod:: _seek .. py:attribute:: fh .. py:class:: Disk(fh: BinaryIO, footer: dissect.hypervisor.disk.c_vhd.c_vhd.footer | None = None) .. py:attribute:: fh .. py:attribute:: footer .. py:attribute:: size .. py:method:: read_sectors(sector: int, count: int) -> bytes :abstractmethod: .. py:class:: FixedDisk(fh: BinaryIO, footer: dissect.hypervisor.disk.c_vhd.c_vhd.footer | None = None) Bases: :py:obj:`Disk` .. py:method:: read_sectors(sector: int, count: int) -> bytes .. py:class:: DynamicDisk(fh: BinaryIO, footer: dissect.hypervisor.disk.c_vhd.c_vhd.footer | None = None) Bases: :py:obj:`Disk` .. py:attribute:: header .. py:attribute:: bat .. py:method:: read_sectors(sector: int, count: int) -> bytes .. py:class:: BlockAllocationTable(fh: BinaryIO, offset: int, max_entries: int) Implementation of the BAT. Entries are uint32 sector offsets to blocks in the file. .. py:attribute:: ENTRY .. py:attribute:: fh .. py:attribute:: offset .. py:attribute:: max_entries .. py:attribute:: get .. py:method:: __getitem__(block: int) -> int | None