From 3185503be199d535e5764317357dd531861e4b59 Mon Sep 17 00:00:00 2001 From: Enaium <32991121+Enaium@users.noreply.github.com> Date: Sat, 10 May 2025 18:29:50 +0800 Subject: [PATCH] patterns: Added valve vpk pattern (#384) --- README.md | 1 + patterns/valve_vpk.hexpat | 62 ++++++++++++++++++ tests/patterns/test_data/valve_vpk.hexpat.vpk | Bin 0 -> 6996 bytes 3 files changed, 63 insertions(+) create mode 100644 patterns/valve_vpk.hexpat create mode 100644 tests/patterns/test_data/valve_vpk.hexpat.vpk 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 0000000000000000000000000000000000000000..9a1834734a9f0ab44489091f64873adec57f6e74 GIT binary patch literal 6996 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