mirror of
https://github.com/WerWolv/ImHex-Patterns.git
synced 2026-03-27 23:37:04 -05:00
patterns/zip: Handling padded extra fields (#369)
* Handling unresolved extra fields * Update zip.hexpat * Update zip.hexpat * Update zip.hexpat
This commit is contained in:
@@ -75,19 +75,26 @@ namespace extra {
|
|||||||
struct ExtraField {
|
struct ExtraField {
|
||||||
u16 tag;
|
u16 tag;
|
||||||
u16 TSize;
|
u16 TSize;
|
||||||
if (tag == 0x5455){
|
if (tag == 0x5455) {
|
||||||
extra::X5455_ExtendedTimestamp x5455_ExtendedTimestamp;
|
extra::X5455_ExtendedTimestamp x5455_ExtendedTimestamp;
|
||||||
}else if (tag == 0x000a){
|
} else if (tag == 0x000a) {
|
||||||
extra::X000A_NTFS x000A_NTFS;
|
extra::X000A_NTFS x000A_NTFS;
|
||||||
}else if (tag == 0x7875){
|
} else if (tag == 0x7875) {
|
||||||
extra::X7875_NewUnix x7875_NewUnix;
|
extra::X7875_NewUnix x7875_NewUnix;
|
||||||
}else if (tag == 0x5855){
|
} else if (tag == 0x5855) {
|
||||||
extra::X5855_InfoZipUnix x5855_InfoZipUnix;
|
extra::X5855_InfoZipUnix x5855_InfoZipUnix;
|
||||||
}else{
|
} else {
|
||||||
std::print("Unsupported tag 0x{:02X}", tag);
|
std::print("Unsupported tag 0x{:02X}", tag);
|
||||||
padding[TSize];
|
padding[TSize];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fn has_extra_field(u32 extraEnd) {
|
||||||
|
if ($ + 4 > extraEnd) return false;
|
||||||
|
u16 tag = std::mem::read_unsigned($, 2, std::mem::Endian::Little);
|
||||||
|
u16 len = std::mem::read_unsigned($ + 2, 2, std::mem::Endian::Little);
|
||||||
|
return !(tag == 0 || len == 0) && $ + 4 + len <= extraEnd;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_eocd() {
|
fn find_eocd() {
|
||||||
@@ -184,7 +191,8 @@ struct LocalFileHeader {
|
|||||||
u16 extraFieldLength [[ comment("Extra field length (m)") ]];
|
u16 extraFieldLength [[ comment("Extra field length (m)") ]];
|
||||||
char fileName[fileNameLength] [[ comment("File Name") ]];
|
char fileName[fileNameLength] [[ comment("File Name") ]];
|
||||||
u64 extraEnd = $ + extraFieldLength;
|
u64 extraEnd = $ + extraFieldLength;
|
||||||
extra::ExtraField extraFields[while ($ < extraEnd)] [[comment("Extra Fields")]];
|
extra::ExtraField extraFields[while (extra::has_extra_field(extraEnd))] [[comment("Extra Fields")]];
|
||||||
|
padding[extraEnd - $];
|
||||||
u8 data[compressedSize] [[name("File Data")]];
|
u8 data[compressedSize] [[name("File Data")]];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -213,8 +221,9 @@ struct CentralDirectoryFileHeader {
|
|||||||
File file;
|
File file;
|
||||||
char fileName[fileNameLength];
|
char fileName[fileNameLength];
|
||||||
u64 extraEnd = $ + extraFieldLength;
|
u64 extraEnd = $ + extraFieldLength;
|
||||||
extra::ExtraField extraFields[while ($ < extraEnd)] [[comment("Extra Fields")]];
|
extra::ExtraField extraFields[while (extra::has_extra_field(extraEnd))] [[comment("Extra Fields")]];
|
||||||
char comment[fileCommentLength];
|
padding[extraEnd - $];
|
||||||
|
char comment[fileCommentLength] @ extraEnd;
|
||||||
};
|
};
|
||||||
|
|
||||||
CentralDirectoryFileHeader centralDirHeaders[fileInfo.CDRCount] @ (fileInfo.CDOffset) [[name("Files")]];
|
CentralDirectoryFileHeader centralDirHeaders[fileInfo.CDRCount] @ (fileInfo.CDOffset) [[name("Files")]];
|
||||||
|
|||||||
Reference in New Issue
Block a user