diff --git a/README.md b/README.md index 8ca5bba..0945f2f 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | BSON | `application/bson` | [`patterns/bson.hexpat`](patterns/bson.hexpat) | BSON (Binary JSON) format | | bplist | `application/x-bplist` | [`patterns/bplist.hexpat`](patterns/bplist.hexpat) | Apple's binary property list format (bplist) | | BSP | | [`patterns/bsp_goldsrc.hexpat`](patterns/bsp_goldsrc.hexpat) | GoldSrc engine maps format (used in Half-Life 1) | -| BZIP3 | | [`patterns/bzip3.hexpat`](patterns/bzip3.hexpat) | GoldSrc engine maps format (used in Half-Life 1) | +| BZIP3 | | [`patterns/bzip3.hexpat`](patterns/bzip3.hexpat) | Parses BZip3 compression (file format) by Kamila Szewczyk | | CAB | | [`patterns/cab.hexpat`](patterns/cab.hexpat) | Microsoft Cabinet (CAB) Files | | CCHVA | | [`patterns/cchva.hexpat`](patterns/cchva.hexpat) | Command and Conquer Voxel Animation | | CCVXL | | [`patterns/ccvxl.hexpat`](patterns/ccvxl.hexpat) | Command and Conquer Voxel Model | diff --git a/patterns/7z.hexpat b/patterns/7z.hexpat index bc9f095..b378688 100644 --- a/patterns/7z.hexpat +++ b/patterns/7z.hexpat @@ -1,9 +1,11 @@ #pragma description 7z Archive #pragma MIME application/x-7z-compressed +#pragma magic [ 37 7A BC AF 27 1C ] @ 0x00 import std.io; import std.mem; import std.math; +import type.magic; enum Type:u8{ @@ -11,13 +13,9 @@ enum Type:u8{ sizeStartHeader = 0x20, // Size of start Header }; -enum TypeB:u48{ - sevenZipSignature = 0x1C27AFBC7A37, // Defining 7z signature -}; - struct StartHeader { // File signature - u48 signature [[color("FF0000")] ]; + type::Magic<"7z\xBC\xAF\x27\x1C"> signature [[color("FF0000")] ]; // Version format u16 formatVersion [[color("00FF00")]]; // CRC start header @@ -62,13 +60,6 @@ struct EndHeader { EndHeader endheader @ Type::sizeStartHeader; -// Check 7z type -if(startheader.signature == TypeB::sevenZipSignature){ - std::print("It is a 7z File Type"); -}else{ - std::print("The file is not 7z type"); -} - std::print("Format Version {} ",startheader.formatVersion); // Version verification diff --git a/patterns/nro.hexpat b/patterns/nro.hexpat index 057a7fd..b25398d 100644 --- a/patterns/nro.hexpat +++ b/patterns/nro.hexpat @@ -4,6 +4,7 @@ import std.io; import std.sys; +import type.magic; struct MOD0 { char magic[4]; @@ -27,7 +28,7 @@ struct SegmentHeader { }; struct Header { - char magic[4]; + type::Magic<"NRO0"> magic; u32 version; u32 file_size; u32 flags; @@ -67,7 +68,6 @@ fn is_homebrew() { Start start @ 0x00; Header header @ $; -std::assert(header.magic == "NRO0", "Invalid NRO File!"); AssetHeader assets @ header.file_size; diff --git a/patterns/ogg.hexpat b/patterns/ogg.hexpat index bd95d17..19434b3 100644 --- a/patterns/ogg.hexpat +++ b/patterns/ogg.hexpat @@ -5,6 +5,7 @@ import std.core; import std.mem; +import type.magic; bitfield HeaderType { Continuation : 1; @@ -17,7 +18,7 @@ struct SegmentData { }; struct Ogg { - char capturePattern[4]; + type::Magic<"OggS"> capturePattern; u8 version; HeaderType headerType; u64 granulePosition; @@ -29,4 +30,4 @@ struct Ogg { SegmentData data[pageSegments]; }; -Ogg ogg[while(!std::mem::eof())] @ 0x00; \ No newline at end of file +Ogg ogg[while(!std::mem::eof())] @ 0x00; diff --git a/patterns/ttf.hexpat b/patterns/ttf.hexpat index 1386a76..f85837f 100644 --- a/patterns/ttf.hexpat +++ b/patterns/ttf.hexpat @@ -10,6 +10,7 @@ import std.mem; import std.string; import std.time; import std.io; +import type.magic; struct TableDirectory { char tag[4]; @@ -47,7 +48,6 @@ struct LongDatetime { s64 time; } [[format("format_longdatetime")]]; -using HeadTable; u64 currentOffset; u64 currentLength; @@ -55,7 +55,7 @@ u64 glyfStart; bool hasPostScriptOutlines = false; u16 numHMetrics; u16 gNumGlyphs; -HeadTable headTable; +s16 indexToLocFormat; // begin avar @@ -185,12 +185,7 @@ struct EncodingRecord { u16 encodingId; u32 offset; - u64 endEncodingRecord = $; - $ = startOfCmapTable + offset; - - CmapSubtable subtable; - - $ = endEncodingRecord; + CmapSubtable subtable @ startOfCmapTable + offset; }; struct CmapTable { @@ -397,7 +392,7 @@ struct HeadTable { FixedPoint32 version; FixedPoint32 fontRevision; u32 checksumAdjustment; - u32 magic; + type::Magic<"\x5f\x0f\x3c\xf5"> magicNumber; HeadFlag flags; u16 unitsPerEm; LongDatetime created; @@ -467,16 +462,13 @@ struct GlyfWithOffset { u32 nextOff = u32(std::mem::read_unsigned($, 2, std::mem::Endian::Big)) * 2; } curGlyfSize = nextOff - realOffset; - u64 prev = $; - $ = glyfStart + realOffset; if (curGlyfSize != 0) { - GlyfTable glyf; + GlyfTable glyf @ glyfStart + realOffset; } - $ = prev; }; struct LocaTable { - if (headTable.indexToLocFormat == 1) { + if (indexToLocFormat == 1) { //u32 offsets[gNumGlyphs + 1]; GlyfWithOffset glyfs[gNumGlyphs]; } else { @@ -522,19 +514,13 @@ struct NameRecord { u16 nameId; u16 length; u16 stringOffset; - u64 cur = $; - $ = curStorageOffset + stringOffset; - char16 string[length / 2]; - $ = cur; + char16 string[length / 2] @ curStorageOffset + stringOffset; }; struct LangTagRecord { u16 length; u16 langTagOffset; - u64 cur = $; - $ = curStorageOffset + langTagOffset; - char16 langTag[length / 2]; - $ = cur; + char16 langTag[length / 2] @ curStorageOffset + langTagOffset; }; struct NameTableV0 { @@ -670,7 +656,7 @@ struct HiddenForPreprocessing { ("maxp"): MaxpTable table; ("head"): { HeadTable table; - headTable = table; + indexToLocFormat = table.indexToLocFormat; } ("glyf"): { glyfStart = $; @@ -716,9 +702,7 @@ struct TTF { u16 entrySelector; u16 rangeShift; - u64 start = $; - HiddenForPreprocessing hidden[numTables] [[hidden]]; - $ = start; + HiddenForPreprocessing hidden[numTables] @ $ [[hidden]]; Table tables[numTables]; }; diff --git a/patterns/zip.hexpat b/patterns/zip.hexpat index c4df97d..492e7ad 100644 --- a/patterns/zip.hexpat +++ b/patterns/zip.hexpat @@ -102,10 +102,10 @@ fn find_eocd() { u128 offset_search_from = std::math::max(0, std::mem::size()-65536-22); u128 prev_address; while(1){ - u128 current_address = std::mem::find_sequence_in_range(0, offset_search_from, std::mem::size(), 0x50,0x4B,0x05,0x06); + s128 current_address = std::mem::find_sequence_in_range(0, offset_search_from, std::mem::size(), 0x50,0x4B,0x05,0x06); //Reached EOF and did not find valid eocd. - if (current_address == 340282366920938463463374607431768211455){ + if (current_address == -1) { std::error("Could not find EOCD."); }