mirror of
https://github.com/WerWolv/ImHex-Patterns.git
synced 2026-03-28 07:47:02 -05:00
* patterns/zip: simplify find_sequence_in_range check
hex(340282366920938463463374607431768211455) =
0xffffffffffffffffffffffffffffffff
* patterns/7z: use Magic<> for signature, add pragma
* patterns/{nro, ogg}: use Magic<> for signature
* patterns/ttf: refactor, check magic
Use the "Field field @ position;" syntax instead of saving and restoring
the cursor position.
* readme: fix copy-paste error in pattern listing
94 lines
3.2 KiB
Rust
94 lines
3.2 KiB
Rust
#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{
|
|
startPosition = 0x00, // Start position
|
|
sizeStartHeader = 0x20, // Size of start Header
|
|
};
|
|
|
|
struct StartHeader {
|
|
// File signature
|
|
type::Magic<"7z\xBC\xAF\x27\x1C"> signature [[color("FF0000")] ];
|
|
// Version format
|
|
u16 formatVersion [[color("00FF00")]];
|
|
// CRC start header
|
|
u32 crcOfTheFollowing20Bytes [[color("0000FF")]];
|
|
// Relative offset of End Header
|
|
u64 relativeOffsetEndHeader [[color("FFFF00")]];
|
|
// Length of End Header
|
|
u64 theLengthOfEndHeader [[color("00FFFF")]];
|
|
// CRC of End Ender
|
|
u32 crcOftheEndHeader [[color("FF00FF")]];
|
|
// File size calculation
|
|
u64 fileSize = relativeOffsetEndHeader + theLengthOfEndHeader + Type::sizeStartHeader;
|
|
// Absolute offset calculation End Header
|
|
u64 startEndHeader = relativeOffsetEndHeader + Type::sizeStartHeader;
|
|
};
|
|
|
|
StartHeader startheader @ Type::startPosition;
|
|
|
|
struct CompressedData {
|
|
// Start of compressed data
|
|
u8 startOfCompressedData[4] [[color("C0C0C0")]];
|
|
};
|
|
|
|
CompressedData compresseddata @ Type::sizeStartHeader;
|
|
|
|
|
|
struct EndHeader {
|
|
// Set padding to place End Header in right position
|
|
padding[startheader.relativeOffsetEndHeader];
|
|
// Mark link to meta block
|
|
u8 linkToMetaBlock [[color("FF0000")]];
|
|
// Mark all End Header
|
|
char fullEndHeader[startheader.theLengthOfEndHeader] [[color("63954A")]];
|
|
// Detect LZMA signature
|
|
u64 lzmaSignaturePosition = std::mem::find_sequence_in_range(0, addressof(fullEndHeader), addressof(fullEndHeader) + sizeof(fullEndHeader), 0x23, 0x03, 0x01, 0x01, 0x05, 0x5D);
|
|
|
|
// Mark positions if LZMA signature was detected
|
|
if(lzmaSignaturePosition != 0xFFFFFFFFFFFFFFFF){
|
|
u48 lzmaSignature @ lzmaSignaturePosition [[color("0000FF")]];
|
|
}
|
|
};
|
|
|
|
EndHeader endheader @ Type::sizeStartHeader;
|
|
|
|
std::print("Format Version {} ",startheader.formatVersion);
|
|
|
|
// Version verification
|
|
if(startheader.formatVersion == 0x0400){
|
|
std::print("Major Version 0x00 || 0 - Minor Version 0x04 || 4");
|
|
}
|
|
|
|
// Verification of the compressed method is LZMA, Bzip2 or LZMA2
|
|
if(compresseddata.startOfCompressedData[0] == Type::startPosition){
|
|
std::print("Compressed Method LZMA");
|
|
}else if(compresseddata.startOfCompressedData[0] == 0x42){
|
|
std::print("Compressed Method Bzip2");
|
|
}else{
|
|
std::print("Compressed Method LZMA2");
|
|
}
|
|
|
|
|
|
|
|
std::print("CRC Start Header 0x{:X}",startheader.crcOfTheFollowing20Bytes);
|
|
|
|
std::print("CRC End Header 0x{:X} ", startheader.crcOftheEndHeader);
|
|
|
|
std::print("CompressedData length 0x{:X} || {} bytes ",startheader.relativeOffsetEndHeader, startheader.relativeOffsetEndHeader);
|
|
|
|
std::print("Relative Offset of End Header 0x{:X} || {} bytes",startheader.relativeOffsetEndHeader, startheader.relativeOffsetEndHeader);
|
|
|
|
std::print("Offset to start End Header 0x{:X} || {} bytes",startheader.startEndHeader,startheader.startEndHeader);
|
|
|
|
std::print("End Header length 0x{:X} || {} bytes",startheader.theLengthOfEndHeader,startheader.theLengthOfEndHeader);
|
|
|
|
std::print("File size 0x{:X} || {} bytes",startheader.fileSize, startheader.fileSize);
|