commit
272a201d12
@ -40,19 +40,17 @@ u32 LZSS_GetDecompressedSize(u8* buffer, u32 size) {
|
|||||||
bool LZSS_Decompress(u8* compressed, u32 compressed_size, u8* decompressed, u32 decompressed_size) {
|
bool LZSS_Decompress(u8* compressed, u32 compressed_size, u8* decompressed, u32 decompressed_size) {
|
||||||
u8* footer = compressed + compressed_size - 8;
|
u8* footer = compressed + compressed_size - 8;
|
||||||
u32 buffer_top_and_bottom = *(u32*)footer;
|
u32 buffer_top_and_bottom = *(u32*)footer;
|
||||||
u32 i, j;
|
|
||||||
u32 out = decompressed_size;
|
u32 out = decompressed_size;
|
||||||
u32 index = compressed_size - ((buffer_top_and_bottom >> 24) & 0xFF);
|
u32 index = compressed_size - ((buffer_top_and_bottom >> 24) & 0xFF);
|
||||||
u8 control;
|
|
||||||
u32 stop_index = compressed_size - (buffer_top_and_bottom & 0xFFFFFF);
|
u32 stop_index = compressed_size - (buffer_top_and_bottom & 0xFFFFFF);
|
||||||
|
|
||||||
memset(decompressed, 0, decompressed_size);
|
memset(decompressed, 0, decompressed_size);
|
||||||
memcpy(decompressed, compressed, compressed_size);
|
memcpy(decompressed, compressed, compressed_size);
|
||||||
|
|
||||||
while(index > stop_index) {
|
while(index > stop_index) {
|
||||||
control = compressed[--index];
|
u8 control = compressed[--index];
|
||||||
|
|
||||||
for(i = 0; i < 8; i++) {
|
for(u32 i = 0; i < 8; i++) {
|
||||||
if(index <= stop_index)
|
if(index <= stop_index)
|
||||||
break;
|
break;
|
||||||
if(index <= 0)
|
if(index <= 0)
|
||||||
@ -76,13 +74,13 @@ bool LZSS_Decompress(u8* compressed, u32 compressed_size, u8* decompressed, u32
|
|||||||
if(out < segment_size) {
|
if(out < segment_size) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for(j = 0; j < segment_size; j++) {
|
for(u32 j = 0; j < segment_size; j++) {
|
||||||
u8 data;
|
|
||||||
// Check if compression is out of bounds
|
// Check if compression is out of bounds
|
||||||
if(out + segment_offset >= decompressed_size) {
|
if(out + segment_offset >= decompressed_size) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
data = decompressed[out + segment_offset];
|
|
||||||
|
u8 data = decompressed[out + segment_offset];
|
||||||
decompressed[--out] = data;
|
decompressed[--out] = data;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -46,17 +46,17 @@ struct NCCH_Header {
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// ExeFS (executable file system) headers
|
// ExeFS (executable file system) headers
|
||||||
|
|
||||||
typedef struct {
|
struct ExeFs_SectionHeader {
|
||||||
char name[8];
|
char name[8];
|
||||||
u32 offset;
|
u32 offset;
|
||||||
u32 size;
|
u32 size;
|
||||||
} ExeFs_SectionHeader;
|
};
|
||||||
|
|
||||||
typedef struct {
|
struct ExeFs_Header {
|
||||||
ExeFs_SectionHeader section[8];
|
ExeFs_SectionHeader section[8];
|
||||||
u8 reserved[0x80];
|
u8 reserved[0x80];
|
||||||
u8 hashes[8][0x20];
|
u8 hashes[8][0x20];
|
||||||
} ExeFs_Header;
|
};
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// ExHeader (executable file system header) headers
|
// ExHeader (executable file system header) headers
|
||||||
|
Loading…
Reference in New Issue
Block a user