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