mirror of
https://github.com/WerWolv/ImHex-Patterns.git
synced 2026-03-28 07:47:02 -05:00
* repo-wide: trim trailing spaces Note: This doesn't touch the .tbl files in encodings/ since they include meaningful trailing spaces (`20= `) * patterns: clean up duplicate semicolons * ELF: add header magic check * glTF: use type::Magic for magic value * glTF: check that the file size in the header matches * xgstexture: fix generics syntax for magic value * JPEG: define hex enum with 0x00 instead of 0X00 * CI: update deprecated actions --------- Co-authored-by: Nik <werwolv98@gmail.com>
116 lines
2.2 KiB
Rust
116 lines
2.2 KiB
Rust
#pragma description macOS .DS_Store
|
|
|
|
// Apple macOS .DS_Store format
|
|
#pragma endian big
|
|
import std.io;
|
|
|
|
struct RecordEntry {
|
|
u32 length;
|
|
char16 filename[length];
|
|
|
|
char id[4];
|
|
// either blob or length
|
|
char type[4];
|
|
|
|
if (type == "blob") {
|
|
u32 blobCount;
|
|
u8 blobData[blobCount];
|
|
}
|
|
else if (type == "long") {
|
|
u32 value;
|
|
}
|
|
else if (type == "shor") {
|
|
u32 value;
|
|
}
|
|
else if (type == "bool") {
|
|
u8 value;
|
|
}
|
|
};
|
|
|
|
struct TreeBlock {
|
|
u32 mode;
|
|
u32 count;
|
|
RecordEntry entries[count];
|
|
};
|
|
|
|
struct BuddyRootBlockOffsets {
|
|
u32 count;
|
|
u8 reserved[4];
|
|
u32 addresses[count];
|
|
padding[(1024 - (count * 4))];
|
|
};
|
|
|
|
struct BuddyTableOfContentEntry {
|
|
u8 count;
|
|
char name[count];
|
|
u32 value;
|
|
};
|
|
|
|
struct BuddyTableOfContents {
|
|
u32 count;
|
|
BuddyTableOfContentEntry toc[count];
|
|
};
|
|
|
|
struct BuddyFreeList {
|
|
u32 count;
|
|
u32 offsets[count];
|
|
};
|
|
|
|
struct BuddyRootBlock {
|
|
BuddyRootBlockOffsets offsets;
|
|
BuddyTableOfContents toc;
|
|
BuddyFreeList freelists[32];
|
|
};
|
|
|
|
struct BuddyBlock {
|
|
u32 blockCount;
|
|
u8 reserved[4];
|
|
// padding for next multiple of 256 entries (1024 bytes)
|
|
u32 addresses[blockCount];
|
|
|
|
// u8 padding[paddingCount];
|
|
u32 directoryCount;
|
|
|
|
// directory entries
|
|
u8 count;
|
|
u8 name[count];
|
|
u32 blockNumber;
|
|
|
|
// free lists
|
|
// 32 free lists
|
|
BuddyRootBlockOffsets off[32];
|
|
};
|
|
|
|
struct BlocksList {
|
|
u32 blockId [[color("E57373")]];
|
|
u32 internalBlocks [[color("80CBC4")]];
|
|
u32 countRecords [[color("ffeb3b")]];
|
|
u32 countBlocks [[color("64b5f6")]];
|
|
u32 reserved [[color("a1887f")]];
|
|
};
|
|
|
|
struct BuddyAllocator {
|
|
char header[4];
|
|
u32 offsetBookkeeping;
|
|
u32 sizeBookkeeping;
|
|
u32 offsetBookkeeping2;
|
|
u32 offsetData;
|
|
u8 reserved[12];
|
|
|
|
BuddyRootBlock root @ offsetBookkeeping + 4;
|
|
|
|
std::print("TOC {} address 0x{:08x}",
|
|
root.toc.toc[0].value,
|
|
root.offsets.addresses[root.toc.toc[0].value] >> 0x5 << 0x5);
|
|
|
|
BlocksList blocks @ (root.offsets.addresses[root.toc.toc[0].value] >> 0x5 << 0x5) + 4;
|
|
|
|
std::print("Blocks start at address 0x{:08x}, size 0x{:04x}",
|
|
root.offsets.addresses[blocks.blockId] >> 0x5 << 0x5,
|
|
1 << (root.offsets.addresses[blocks.blockId] & 0x1f));
|
|
|
|
TreeBlock entries @ (root.offsets.addresses[blocks.blockId] >> 0x5 << 0x5) + 4;
|
|
};
|
|
|
|
BuddyAllocator buddy @0x04;
|