diff --git a/data/custombanner.bin b/data/custombanner.bin index 57af5d62..e9d0d130 100644 Binary files a/data/custombanner.bin and b/data/custombanner.bin differ diff --git a/data/save.bin b/data/save.bin index f214e69e..8ef4dc0a 100644 Binary files a/data/save.bin and b/data/save.bin differ diff --git a/data/stub.bin b/data/stub.bin index 6c1e3eb5..0fffaf07 100644 Binary files a/data/stub.bin and b/data/stub.bin differ diff --git a/resources/wiiflow_game_booter/source/lz77.c b/resources/wiiflow_game_booter/source/lz77.c index a31c09a2..99de3160 100644 --- a/resources/wiiflow_game_booter/source/lz77.c +++ b/resources/wiiflow_game_booter/source/lz77.c @@ -22,7 +22,7 @@ static inline u32 packBytes(int a, int b, int c, int d) return (d << 24) | (c << 16) | (b << 8) | (a); } -static int __decompressLZ77_11(u8 *in, u32 inputLen, u8 **output, u32 *outputLen) +static int __decompressLZ77_11(const u8 *in, u32 inputLen, u8 **output, u32 *outputLen) { int x = 0; u32 y = 0; @@ -98,7 +98,7 @@ static int __decompressLZ77_11(u8 *in, u32 inputLen, u8 **output, u32 *outputLen return 0; } -static int __decompressLZ77_10(u8 *in, u8 **output, u32 *outputLen) +static int __decompressLZ77_10(const u8 *in, u8 **output, u32 *outputLen) { int x = 0; u32 y = 0; @@ -148,14 +148,14 @@ static int __decompressLZ77_10(u8 *in, u8 **output, u32 *outputLen) return 0; } -int isLZ77compressed(u8 *buffer) +int isLZ77compressed(const u8 *buffer) { if((buffer[0] == LZ77_0x10_FLAG) || (buffer[0] == LZ77_0x11_FLAG)) return 1; return 0; } -int decompressLZ77content(u8 *buffer, u32 length, u8 **output, u32 *outputLen) +int decompressLZ77content(const u8 *buffer, u32 length, u8 **output, u32 *outputLen) { int ret = 0; switch(buffer[0]) diff --git a/resources/wiiflow_game_booter/source/lz77.h b/resources/wiiflow_game_booter/source/lz77.h index ac5c5048..45c189a5 100644 --- a/resources/wiiflow_game_booter/source/lz77.h +++ b/resources/wiiflow_game_booter/source/lz77.h @@ -23,8 +23,8 @@ extern "C" { #endif /* __cplusplus */ -int isLZ77compressed(u8 *buffer); -int decompressLZ77content(u8 *buffer, u32 length, u8 **output, u32 *outputLen); +int isLZ77compressed(const u8 *buffer); +int decompressLZ77content(const u8 *buffer, u32 length, u8 **output, u32 *outputLen); #ifdef __cplusplus } diff --git a/source/banner/AnimatedBanner.h b/source/banner/AnimatedBanner.h index 7cf61256..e6d88a8c 100644 --- a/source/banner/AnimatedBanner.h +++ b/source/banner/AnimatedBanner.h @@ -49,7 +49,7 @@ protected: u8 *sysFont2; }; -u8 *DecompressCopy(const u8 *stuff, const u32 len, u32 *size); +u8 *DecompressCopy(const u8 *stuff, u32 len, u32 *size); extern AnimatedBanner gameBanner; #endif diff --git a/source/channel/nand_save.cpp b/source/channel/nand_save.cpp index f8149911..d1ebf1a9 100644 --- a/source/channel/nand_save.cpp +++ b/source/channel/nand_save.cpp @@ -21,7 +21,7 @@ #include "gecko/gecko.hpp" #include "loader/fs.h" #include "loader/sys.h" -#include "unzip/lz77.h" +#include "banner/AnimatedBanner.h" #include "unzip/U8Archive.h" extern const u8 save_bin[]; @@ -65,7 +65,7 @@ bool NandSave::CheckSave() goto done; } /* extract our archive */ - decompressLZ77content(save_bin, save_bin_size, &u8_bin, &u8_bin_size); + u8_bin = DecompressCopy(save_bin, save_bin_size, &u8_bin_size); if(u8_bin == NULL || u8_bin_size == 0) goto error; /* grab cert.sys */ diff --git a/source/homebrew/homebrew.cpp b/source/homebrew/homebrew.cpp index 8eea92b4..b0f63311 100644 --- a/source/homebrew/homebrew.cpp +++ b/source/homebrew/homebrew.cpp @@ -7,6 +7,7 @@ #include #include #include "homebrew.h" +#include "banner/AnimatedBanner.h" #include "gecko/gecko.hpp" #define EXECUTE_ADDR ((u8 *)0x91000000) @@ -110,9 +111,16 @@ void writeStub() /* Clear potential homebrew channel stub */ memset((void*)0x80001800, 0, 0x1800); + /* Extract our stub */ + u32 StubSize = 0; + u8 *Stub = DecompressCopy(stub_bin, stub_bin_size, &StubSize); + /* Copy our own stub into memory */ - memcpy((void*)0x80001800, stub_bin, stub_bin_size); - DCFlushRange((void*)0x80001800, stub_bin_size); + memcpy((void*)0x80001800, Stub, StubSize); + DCFlushRange((void*)0x80001800, StubSize); + + /* And free the memory again */ + free(Stub); } void BootHomebrew() diff --git a/source/unzip/lz77.c b/source/unzip/lz77.c index 629ef421..1f499fcf 100644 --- a/source/unzip/lz77.c +++ b/source/unzip/lz77.c @@ -1,210 +1,177 @@ -/******************************************************************************* - * lz77.c - * - * Copyright (c) 2009 The Lemon Man - * Copyright (c) 2009 Nicksasa - * Copyright (c) 2009 WiiPower - * - * Distributed under the terms of the GNU General Public License (v2) - * See http://www.gnu.org/licenses/gpl-2.0.txt for more info. - * - * Description: - * ----------- - * - ******************************************************************************/ -#include -#include -#include -#include -#include "lz77.h" -#include "loader/utils.h" -#include "memory/mem2.hpp" - -u32 packBytes(int a, int b, int c, int d) -{ - return (d << 24) | (c << 16) | (b << 8) | (a); -} - -s32 __decompressLZ77_11(const u8 *in, const u32 inputLen, u8 **output, u32 *outputLen) -{ - int x, y; - - u8 *out = NULL; - - u32 compressedPos = 0x4; - u32 decompressedPos = 0x0; - u32 decompressedSize = 0; - - decompressedSize = packBytes(in[0], in[1], in[2], in[3]) >> 8; - - if (!decompressedSize) - { - decompressedSize = packBytes(in[4], in[5], in[6], in[7]); - compressedPos += 0x4; - } - - //printf("Decompressed size : %i\n", decompressedSize); - - out = MEM2_memalign(32, decompressedSize); - if (out == NULL) - { - printf("Out of memory\n"); - return -1; - } - - while (compressedPos < inputLen && decompressedPos < decompressedSize) - { - u8 byteFlag = in[compressedPos]; - compressedPos++; - - for (x = 7; x >= 0; x--) - { - if ((byteFlag & (1 << x)) > 0) - { - u8 first = in[compressedPos]; - u8 second = in[compressedPos + 1]; - - u32 pos, copyLen; - - if (first < 0x20) - { - u8 third = in[compressedPos + 2]; - - if (first >= 0x10) - { - u32 fourth = in[compressedPos + 3]; - - pos = (u32)(((third & 0xF) << 8) | fourth) + 1; - copyLen = (u32)((second << 4) | ((first & 0xF) << 12) | (third >> 4)) + 273; - - compressedPos += 4; - } else - { - pos = (u32)(((second & 0xF) << 8) | third) + 1; - copyLen = (u32)(((first & 0xF) << 4) | (second >> 4)) + 17; - - compressedPos += 3; - } - } else - { - pos = (u32)(((first & 0xF) << 8) | second) + 1; - copyLen = (u32)(first >> 4) + 1; - - compressedPos += 2; - } - - for (y = 0; y < (int)copyLen; y++) - { - out[decompressedPos + y] = out[decompressedPos - pos + y]; - } - - decompressedPos += copyLen; - } else - { - out[decompressedPos] = in[compressedPos]; - - decompressedPos++; - compressedPos++; - } - - if (compressedPos >= inputLen || decompressedPos >= decompressedSize) - break; - } - } - *output = out; - *outputLen = decompressedSize; - return 0; -} - -s32 __decompressLZ77_10(const u8 *in, u8 **output, u32 *outputLen) -{ - int x, y; - u8 *out = NULL; - - u32 compressedPos = 0; - u32 decompressedSize = 0x4; - u32 decompressedPos = 0; - - decompressedSize = packBytes(in[0], in[1], in[2], in[3]) >> 8; - - //int compressionType = (packBytes(in[0], in[1], in[2], in[3]) >> 4) & 0xF; - - //printf("Decompressed size : %i\n", decompressedSize); - - out = MEM2_memalign(32, decompressedSize); - if (out == NULL) - { - printf("Out of memory\n"); - return -1; - } - - compressedPos += 0x4; - - while (decompressedPos < decompressedSize) - { - u8 flag = *(u8*)(in + compressedPos); - compressedPos += 1; - - for (x = 0; x < 8; x++) - { - if (flag & 0x80) - { - u8 first = in[compressedPos]; - u8 second = in[compressedPos + 1]; - - u16 pos = (u16)((((first << 8) + second) & 0xFFF) + 1); - u8 copyLen = (u8)(3 + ((first >> 4) & 0xF)); - - for (y = 0; y < copyLen; y++) - { - out[decompressedPos + y] = out[decompressedPos - pos + (y % pos)]; - } - - compressedPos += 2; - decompressedPos += copyLen; - } else - { - out[decompressedPos] = in[compressedPos]; - compressedPos += 1; - decompressedPos += 1; - } - - flag <<= 1; - - if (decompressedPos >= decompressedSize) - break; - } - } - - *output = out; - *outputLen = decompressedSize; - return 0; -} - -int isLZ77compressed(const u8 *buffer) -{ - if((buffer[0] == LZ77_0x10_FLAG) || (buffer[0] == LZ77_0x11_FLAG)) - return 1; - return 0; -} - -int decompressLZ77content(const u8 *buffer, const u32 length, u8 **output, u32 *outputLen) -{ - int ret; - switch (buffer[0]) - { - case LZ77_0x10_FLAG: - //printf("LZ77 variant 0x10 compressed content...unpacking may take a while...\n"); - ret = __decompressLZ77_10(buffer, output, outputLen); - break; - case LZ77_0x11_FLAG: - //printf("LZ77 variant 0x11 compressed content...unpacking may take a while...\n"); - ret = __decompressLZ77_11(buffer, length, output, outputLen); - break; - default: - //printf("Not compressed ...\n"); - ret = -1; - break; - } - return ret; -} +/******************************************************************************* + * lz77.c + * + * Copyright (c) 2009 The Lemon Man + * Copyright (c) 2009 Nicksasa + * Copyright (c) 2009 WiiPower + * + * Distributed under the terms of the GNU General Public License (v2) + * See http://www.gnu.org/licenses/gpl-2.0.txt for more info. + * + * Description: + * ----------- + * + ******************************************************************************/ +#include +#include +#include "lz77.h" +#include "memory/mem2.hpp" + +static inline u32 packBytes(int a, int b, int c, int d) +{ + return (d << 24) | (c << 16) | (b << 8) | (a); +} + +static int __decompressLZ77_11(const u8 *in, u32 inputLen, u8 **output, u32 *outputLen) +{ + int x = 0; + u32 y = 0; + u32 compressedPos = 0x4; + u32 decompressedPos = 0; + u32 decompressedSize = packBytes(in[0], in[1], in[2], in[3]) >> 8; + if(decompressedSize == 0) + { + decompressedSize = packBytes(in[4], in[5], in[6], in[7]); + compressedPos += 0x4; + } + //printf("Decompressed size : %i\n", decompressedSize); + + u8 *out = (u8*)MEM2_alloc(decompressedSize); + if(out == NULL) + { + //printf("Out of memory\n"); + return -1; + } + + while(compressedPos < inputLen && decompressedPos < decompressedSize) + { + u8 byteFlag = in[compressedPos]; + compressedPos++; + + for(x = 7; x >= 0; x--) + { + if((byteFlag & (1 << x)) > 0) + { + u8 first = in[compressedPos]; + u8 second = in[compressedPos + 1]; + + u32 pos, copyLen; + if(first < 0x20) + { + u8 third = in[compressedPos + 2]; + if(first >= 0x10) + { + u32 fourth = in[compressedPos + 3]; + pos = (u32)(((third & 0xF) << 8) | fourth) + 1; + copyLen = (u32)((second << 4) | ((first & 0xF) << 12) | (third >> 4)) + 273; + compressedPos += 4; + } + else + { + pos = (u32)(((second & 0xF) << 8) | third) + 1; + copyLen = (u32)(((first & 0xF) << 4) | (second >> 4)) + 17; + compressedPos += 3; + } + } + else + { + pos = (u32)(((first & 0xF) << 8) | second) + 1; + copyLen = (u32)(first >> 4) + 1; + compressedPos += 2; + } + for(y = 0; y < copyLen; y++) + out[decompressedPos + y] = out[decompressedPos - pos + y]; + decompressedPos += copyLen; + } + else + { + out[decompressedPos] = in[compressedPos]; + decompressedPos++; + compressedPos++; + } + if(compressedPos >= inputLen || decompressedPos >= decompressedSize) + break; + } + } + *output = out; + *outputLen = decompressedSize; + return 0; +} + +static int __decompressLZ77_10(const u8 *in, u8 **output, u32 *outputLen) +{ + int x = 0; + u32 y = 0; + u32 compressedPos = 0x4; + u32 decompressedPos = 0; + u32 decompressedSize = packBytes(in[0], in[1], in[2], in[3]) >> 8; + //printf("Decompressed size : %i\n", decompressedSize); + + u8 *out = (u8*)MEM2_alloc(decompressedSize); + if(out == NULL) + { + //printf("Out of memory\n"); + return -1; + } + + while(decompressedPos < decompressedSize) + { + u8 byteFlag = in[compressedPos]; + compressedPos ++; + + for(x = 0; x < 8; ++x) + { + if(byteFlag & 0x80) + { + u8 first = in[compressedPos]; + u8 second = in[compressedPos + 1]; + u16 pos = (u16)((((first << 8) + second) & 0xFFF) + 1); + u8 copyLen = (u8)(3 + ((first >> 4) & 0xF)); + for(y = 0; y < copyLen; y++) + out[decompressedPos + y] = out[decompressedPos - pos + (y % pos)]; + compressedPos += 2; + decompressedPos += copyLen; + } + else + { + out[decompressedPos] = in[compressedPos]; + compressedPos += 1; + decompressedPos += 1; + } + byteFlag <<= 1; + if(decompressedPos >= decompressedSize) + break; + } + } + *output = out; + *outputLen = decompressedSize; + return 0; +} + +int isLZ77compressed(const u8 *buffer) +{ + if((buffer[0] == LZ77_0x10_FLAG) || (buffer[0] == LZ77_0x11_FLAG)) + return 1; + return 0; +} + +int decompressLZ77content(const u8 *buffer, u32 length, u8 **output, u32 *outputLen) +{ + int ret = 0; + switch(buffer[0]) + { + case LZ77_0x10_FLAG: + //printf("LZ77 variant 0x10 compressed content...unpacking may take a while...\n"); + ret = __decompressLZ77_10(buffer, output, outputLen); + break; + case LZ77_0x11_FLAG: + //printf("LZ77 variant 0x11 compressed content...unpacking may take a while...\n"); + ret = __decompressLZ77_11(buffer, length, output, outputLen); + break; + default: + //printf("Not compressed ...\n"); + ret = -1; + break; + } + return ret; +} diff --git a/source/unzip/lz77.h b/source/unzip/lz77.h index 6afc4468..45c189a5 100644 --- a/source/unzip/lz77.h +++ b/source/unzip/lz77.h @@ -1,34 +1,34 @@ -/******************************************************************************* - * lz77.h - * - * Copyright (c) 2009 The Lemon Man - * Copyright (c) 2009 Nicksasa - * Copyright (c) 2009 WiiPower - * - * Distributed under the terms of the GNU General Public License (v2) - * See http://www.gnu.org/licenses/gpl-2.0.txt for more info. - * - * Description: - * ----------- - * - ******************************************************************************/ - -#ifndef _LZ77_MODULE -#define _LZ77_MODULE - -#define LZ77_0x10_FLAG 0x10 -#define LZ77_0x11_FLAG 0x11 - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -int isLZ77compressed(const u8 *buffer); -int decompressLZ77content(const u8 *buffer, const u32 length, u8 **output, u32 *outputLen); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif - +/******************************************************************************* + * lz77.h + * + * Copyright (c) 2009 The Lemon Man + * Copyright (c) 2009 Nicksasa + * Copyright (c) 2009 WiiPower + * + * Distributed under the terms of the GNU General Public License (v2) + * See http://www.gnu.org/licenses/gpl-2.0.txt for more info. + * + * Description: + * ----------- + * + ******************************************************************************/ + +#ifndef _LZ77_MODULE +#define _LZ77_MODULE + +#define LZ77_0x10_FLAG 0x10 +#define LZ77_0x11_FLAG 0x11 + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +int isLZ77compressed(const u8 *buffer); +int decompressLZ77content(const u8 *buffer, u32 length, u8 **output, u32 *outputLen); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif +