diff --git a/README.md b/README.md index 0739a7a..323019d 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | UEFI | | [`patterns/uefi.hexpat`](patterns/uefi.hexpat)` | UEFI structs for parsing efivars | | UEFI Boot Entry | | [`patterns/uefi_boot_entry.hexpat`](patterns/uefi_boot_entry.hexpat) | UEFI Boot Entry (Load option) | | UF2 | | [`patterns/uf2.hexpat`](patterns/uf2.hexpat) | [USB Flashing Format](https://github.com/microsoft/uf2) | +| Valve VPK | | [`patterns/valve_vpk.hexpat`](valve_vpk.hexpat) | Valve Package File | | VBMeta | | [`patterns/vbmeta.hexpat`](patterns/vbmeta.hexpat) | Android VBMeta image | | VDF | | [`patterns/vdf.hexpat`](patterns/vdf.hexpat) | Binary Value Data Format (.vdf) files | | VEADO | | [`patterns/veado.hexpat`](patterns/veado.hexpat) | veadotube mini avatar file | diff --git a/patterns/valve_vpk.hexpat b/patterns/valve_vpk.hexpat new file mode 100644 index 0000000..621b769 --- /dev/null +++ b/patterns/valve_vpk.hexpat @@ -0,0 +1,62 @@ +#pragma author Enaium +#pragma description Valve VPK + +import std.io; +import std.mem; +import std.string; + +struct string { + char text[while(std::mem::read_unsigned($, 1) != 0x0)]; + u8 end [[hidden]]; + if (text == "") { + break; + } +}; + +struct entry { + string name; + u32 crc; + u16 preload_bytes; + u16 archive_index; + u32 entry_offset; + u32 entry_length; + u16 terminator; + + if (preload_bytes > 0x0) { + u8 preload[preload_bytes]; + } + + if (archive_index == 0x7fff) { + u8 data[entry_length] @ entry_offset; + } +}; + +struct path { + string name; + entry entry[while(true)]; +}; + +struct extension { + string name; + path path[while(true)]; +}; + +struct header { + u32 signature; + u32 version; + u32 tree_size; + + if (version == 0x2) { + u32 file_data_section_size; + u32 archive_md5_section_size; + u32 ohter_md5_section_size; + u32 signature_section_size; + } +}; + +struct vpk { + header header; + extension extension[while(true)]; +}; + +vpk vpk @ 0x0; \ No newline at end of file diff --git a/tests/patterns/test_data/valve_vpk.hexpat.vpk b/tests/patterns/test_data/valve_vpk.hexpat.vpk new file mode 100644 index 0000000..9a18347 Binary files /dev/null and b/tests/patterns/test_data/valve_vpk.hexpat.vpk differ