digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__vdi {
label="Vdi";
graph[style=dotted];
vdi__seq [label=<
pos | size | type | id |
0 | ... | Header | header |
>];
vdi__inst__block_discarded [label=<
id | value |
block_discarded | 4294967294 |
>];
vdi__inst__block_unallocated [label=<
id | value |
block_unallocated | 4294967295 |
>];
vdi__inst__blocks_map [label=<
pos | size | type | id |
header.blocks_map_offset | header.blocks_map_size | BlocksMap | blocks_map |
>];
vdi__inst__disk [label=<
pos | size | type | id |
header.blocks_offset | ... | Disk | disk |
>];
subgraph cluster__header {
label="Vdi::Header";
graph[style=dotted];
header__seq [label=<
pos | size | type | id |
0 | 64 | str(utf-8) | text |
64 | 4 | | signature |
68 | 4 | Version | version |
72 | 4 | u4le | header_size_optional |
76 | header_size | HeaderMain | header_main |
>];
header__inst__header_size [label=<
id | value |
header_size | (subheader_size_is_dynamic ? header_size_optional : 336) |
>];
header__inst__blocks_map_offset [label=<
id | value |
blocks_map_offset | header_main.blocks_map_offset |
>];
header__inst__subheader_size_is_dynamic [label=<
id | value |
subheader_size_is_dynamic | version.major >= 1 |
>];
header__inst__blocks_offset [label=<
id | value |
blocks_offset | header_main.offset_data |
>];
header__inst__block_size [label=<
id | value |
block_size | (header_main.block_metadata_size + header_main.block_data_size) |
>];
header__inst__blocks_map_size [label=<
id | value |
blocks_map_size | (((((header_main.blocks_in_image * 4) + header_main.geometry.sector_size) - 1) / header_main.geometry.sector_size) * header_main.geometry.sector_size) |
>];
subgraph cluster__uuid {
label="Vdi::Header::Uuid";
graph[style=dotted];
uuid__seq [label=<>];
}
subgraph cluster__version {
label="Vdi::Header::Version";
graph[style=dotted];
version__seq [label=<
pos | size | type | id |
0 | 2 | u2le | major |
2 | 2 | u2le | minor |
>];
}
subgraph cluster__header_main {
label="Vdi::Header::HeaderMain";
graph[style=dotted];
header_main__seq [label=<
pos | size | type | id |
0 | 4 | u4le→ImageType | image_type |
4 | 4 | Flags | image_flags |
8 | 256 | str(utf-8) | description |
264 | 4 | u4le | blocks_map_offset |
268 | 4 | u4le | offset_data |
272 | 16 | Geometry | geometry |
288 | 4 | u4le | reserved1 |
292 | 8 | u8le | disk_size |
300 | 4 | u4le | block_data_size |
304 | 4 | u4le | block_metadata_size |
308 | 4 | u4le | blocks_in_image |
312 | 4 | u4le | blocks_allocated |
316 | 16 | Uuid | uuid_image |
332 | 16 | Uuid | uuid_last_snap |
348 | 16 | Uuid | uuid_link |
364 | 16 | Uuid | uuid_parent |
380 | 16 | Geometry | lchc_geometry |
>];
subgraph cluster__geometry {
label="Vdi::Header::HeaderMain::Geometry";
graph[style=dotted];
geometry__seq [label=<
pos | size | type | id |
0 | 4 | u4le | cylinders |
4 | 4 | u4le | heads |
8 | 4 | u4le | sectors |
12 | 4 | u4le | sector_size |
>];
}
subgraph cluster__flags {
label="Vdi::Header::HeaderMain::Flags";
graph[style=dotted];
flags__seq [label=<
pos | size | type | id |
0 | 15b | b15 | reserved0 |
1:7 | 1b | BitsType1(BigBitEndian) | zero_expand |
2 | 6b | b6 | reserved1 |
2:6 | 1b | BitsType1(BigBitEndian) | diff |
2:7 | 1b | BitsType1(BigBitEndian) | fixed |
3 | 1 | b8 | reserved2 |
>];
}
}
}
subgraph cluster__blocks_map {
label="Vdi::BlocksMap";
graph[style=dotted];
blocks_map__seq [label=<
pos | size | type | id |
0 | 4 | BlockIndex | index |
repeat _root.header.header_main.blocks_in_image times |
>];
subgraph cluster__block_index {
label="Vdi::BlocksMap::BlockIndex";
graph[style=dotted];
block_index__seq [label=<
pos | size | type | id |
0 | 4 | u4le | index |
>];
block_index__inst__is_allocated [label=<
id | value |
is_allocated | index < _root.block_discarded |
>];
block_index__inst__block [label=<
id | value |
block | _root.disk.blocks[index] |
>];
}
}
subgraph cluster__disk {
label="Vdi::Disk";
graph[style=dotted];
disk__seq [label=<
pos | size | type | id |
0 | ... | Block | blocks |
repeat _root.header.header_main.blocks_in_image times |
>];
subgraph cluster__block {
label="Vdi::Disk::Block";
graph[style=dotted];
block__seq [label=<
pos | size | type | id |
0 | _root.header.header_main.block_metadata_size | | metadata |
... | _root.header.header_main.block_data_size | Sector | data |
repeat to end of stream |
>];
subgraph cluster__sector {
label="Vdi::Disk::Block::Sector";
graph[style=dotted];
sector__seq [label=<
pos | size | type | id |
0 | _root.header.header_main.geometry.sector_size | | data |
>];
}
}
}
}
vdi__seq:header_type -> header__seq [style=bold];
header__inst__blocks_map_offset:blocks_map_offset_type -> vdi__inst__blocks_map:blocks_map_pos [color="#404040"];
header__inst__blocks_map_size:blocks_map_size_type -> vdi__inst__blocks_map:blocks_map_size [color="#404040"];
vdi__inst__blocks_map:blocks_map_type -> blocks_map__seq [style=bold];
header__inst__blocks_offset:blocks_offset_type -> vdi__inst__disk:disk_pos [color="#404040"];
vdi__inst__disk:disk_type -> disk__seq [style=bold];
header__seq:version_type -> version__seq [style=bold];
header__inst__header_size:header_size_type -> header__seq:header_main_size [color="#404040"];
header__seq:header_main_type -> header_main__seq [style=bold];
header__inst__subheader_size_is_dynamic:subheader_size_is_dynamic_type -> header__inst__header_size [color="#404040"];
header__seq:header_size_optional_type -> header__inst__header_size [color="#404040"];
header_main__seq:blocks_map_offset_type -> header__inst__blocks_map_offset [color="#404040"];
version__seq:major_type -> header__inst__subheader_size_is_dynamic [color="#404040"];
header_main__seq:offset_data_type -> header__inst__blocks_offset [color="#404040"];
header_main__seq:block_metadata_size_type -> header__inst__block_size [color="#404040"];
header_main__seq:block_data_size_type -> header__inst__block_size [color="#404040"];
header_main__seq:blocks_in_image_type -> header__inst__blocks_map_size [color="#404040"];
geometry__seq:sector_size_type -> header__inst__blocks_map_size [color="#404040"];
geometry__seq:sector_size_type -> header__inst__blocks_map_size [color="#404040"];
geometry__seq:sector_size_type -> header__inst__blocks_map_size [color="#404040"];
header_main__seq:image_flags_type -> flags__seq [style=bold];
header_main__seq:geometry_type -> geometry__seq [style=bold];
header_main__seq:uuid_image_type -> uuid__seq [style=bold];
header_main__seq:uuid_last_snap_type -> uuid__seq [style=bold];
header_main__seq:uuid_link_type -> uuid__seq [style=bold];
header_main__seq:uuid_parent_type -> uuid__seq [style=bold];
header_main__seq:lchc_geometry_type -> geometry__seq [style=bold];
blocks_map__seq:index_type -> block_index__seq [style=bold];
header_main__seq:blocks_in_image_type -> blocks_map__seq:index__repeat [color="#404040"];
block_index__seq:index_type -> block_index__inst__is_allocated [color="#404040"];
vdi__inst__block_discarded:block_discarded_type -> block_index__inst__is_allocated [color="#404040"];
disk__seq:blocks_type -> block_index__inst__block [color="#404040"];
block_index__seq:index_type -> block_index__inst__block [color="#404040"];
disk__seq:blocks_type -> block__seq [style=bold];
header_main__seq:blocks_in_image_type -> disk__seq:blocks__repeat [color="#404040"];
header_main__seq:block_metadata_size_type -> block__seq:metadata_size [color="#404040"];
header_main__seq:block_data_size_type -> block__seq:data_size [color="#404040"];
block__seq:data_type -> sector__seq [style=bold];
geometry__seq:sector_size_type -> sector__seq:data_size [color="#404040"];
}