=== Dump Hardware Block (`DMP*`)

This block defines the set of hardware components involved in capturing the media content.
It includes an array listing each device used during the dumping process, along with the specific extents each device recorded.

This structure allows implementations to trace data provenance and associate dumped regions with their corresponding hardware sources, ensuring accountability and reproducibility in the dumping workflow.

==== Structure Definition

[source,c]
/**Dump hardware block, contains a list of hardware used to dump the media on this image */
typedef struct DumpHardwareHeader
{
    uint32_t identifier;  ///< Block identifier, must be BlockType::DumpHardwareBlock.
    uint16_t entries;     ///< Number of DumpHardwareEntry records that follow.
    uint32_t length;      ///< Total payload bytes after this header (sum of entries, strings, and extents arrays).
    uint64_t crc64;       ///< CRC64-ECMA of the payload (byte-swapped for legacy v1 images, handled automatically).
} DumpHardwareHeader;

==== Field Descriptions

[cols="2,2,2,6",options="header"]
|===
|Type
|Size
|Name
|Description

|uint32_t
|4 bytes
|identifier
|The dump hardware block identifier, always `DMP*`

|uint16_t
|2 bytes
|entries
|The number of entries following this header

|uint32_t
|4 bytes
|length
|The length in bytes of the data following this header.

|uint64_t
|8 bytes
|crc64
|The CRC64-ECMA checksum of the data following this header
|===

==== Dump hardware entries

[source,c]
/**Dump hardware entry, contains length of strings that follow, in the same order as the length, this structure */
typedef struct DumpHardwareEntry
{
    uint32_t manufacturerLength;             ///< Length in bytes of manufacturer UTF-8 string.
    uint32_t modelLength;                    ///< Length in bytes of model UTF-8 string.
    uint32_t revisionLength;                 ///< Length in bytes of revision / hardware revision string.
    uint32_t firmwareLength;                 ///< Length in bytes of firmware version string.
    uint32_t serialLength;                   ///< Length in bytes of device serial number string.
    uint32_t softwareNameLength;             ///< Length in bytes of dumping software name string.
    uint32_t softwareVersionLength;          ///< Length in bytes of dumping software version string.
    uint32_t softwareOperatingSystemLength;  ///< Length in bytes of host operating system string.
    uint32_t extents;                        ///< Number of DumpExtent records following the strings (0 = none).
} DumpHardwareEntry;

==== Field Descriptions

[cols="2,2,2,6",options="header"]
|===
|Type
|Size
|Name
|Description

|uint32_t
|4 bytes
|manufacturerLength
|Length of UTF-8 manufacturer string.

|uint32_t
|4 bytes
|modelLength
|Length of UTF-8 model string.

|uint32_t
|4 bytes
|revisionLength
|Length of UTF-8 revision string.

|uint32_t
|4 bytes
|firmwareLength
|Length of UTF-8 firmware version string.

|uint32_t
|4 bytes
|serialLength
|Length of UTF-8 serial number string.

|uint32_t
|4 bytes
|softwareNameLength
|Length of UTF-8 software name string.

|uint32_t
|4 bytes
|softwareVersionLength
|Length of UTF-8 software version string.

|uint32_t
|4 bytes
|softwareOperatingSystemLength
|Length of UTF-8 software operating system string.

|uint32_t
|4 bytes
|extents
|How many extents are after the strings.
|===

==== Extents

[source,c]
/**Dump hardware extent, contains the start and end of the extent in the media */
typedef struct DumpExtent
{
    uint64_t start;  ///< Starting LBA (inclusive).
    uint64_t end;    ///< Ending LBA (inclusive); >= start.
} DumpExtent;

==== Field Descriptions

[cols="2,2,2,6",options="header"]
|===
|Type
|Size
|Name
|Description

|uint64_t
|8 bytes
|start
|Starting LBA of the extent (inclusive).

|uint64_t
|8 bytes
|end
|Ending LBA of the extent (inclusive).
|===

Each dump hardware entry is followed by a sequence of string fields in the following fixed order:

. Manufacturer
. Model
. Revision
. Firmware Version
. Serial Number
. Software Name
. Software Version
. Software Operating System

Immediately after the final string (`Software Operating System`), the list of extents associated with that hardware entry begins.
