-Added translations for "Homebrew Channel is not installed" message

-Improved timing between messages
-Added support for GC/Classic controllers, and multiple remotes
-Changed "HD Edition" to "HacksDen Edition"
-Minor code cleanup
This commit is contained in:
Joostinonline 2014-06-19 17:47:13 +00:00
parent f7c14cb306
commit bc08e18949
12 changed files with 365 additions and 330 deletions

View File

@ -17,9 +17,9 @@ include $(DEVKITPPC)/wii_rules
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
TARGET := boot TARGET := boot
BUILD := build BUILD := build
SOURCES := source source/gfx SOURCES := source
DATA := data DATA := data
INCLUDES := include source/gfx INCLUDES := include
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# options for code generation # options for code generation
@ -134,28 +134,7 @@ $(OUTPUT).elf: $(OFILES)
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# This rule links in binary data with the .jpg extension # This rule links in binary data with the .jpg extension
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
%.jpg.o : %.jpg
#---------------------------------------------------------------------------------
@echo $(notdir $<)
$(bin2o)
#---------------------------------------------------------------------------------
# This rule links in binary data with the .png extension
#---------------------------------------------------------------------------------
%.png.o : %.png
#---------------------------------------------------------------------------------
@echo $(notdir $<)
$(bin2o)
#---------------------------------------------------------------------------------
# This rule links in binary data with the .ttf extension
#---------------------------------------------------------------------------------
%.ttf.o : %.ttf %.ttf.o : %.ttf
#---------------------------------------------------------------------------------
@echo $(notdir $<)
$(bin2o)
%.wad.o : %.wad
@echo $(notdir $<) @echo $(notdir $<)
$(bin2o) $(bin2o)
@ -163,38 +142,10 @@ $(OUTPUT).elf: $(OFILES)
@echo $(notdir $<) @echo $(notdir $<)
$(bin2o) $(bin2o)
%.certs.o : %.certs
@echo $(notdir $<)
$(bin2o)
%.sys.o : %.sys
@echo $(notdir $<)
$(bin2o)
%.dat.o : %.dat %.dat.o : %.dat
@echo $(notdir $<) @echo $(notdir $<)
$(bin2o) $(bin2o)
%.tmd.o : %.tmd
@echo $(notdir $<)
$(bin2o)
%.tik.o : %.tik
@echo $(notdir $<)
$(bin2o)
%.bin.o : %.bin
@echo $(notdir $<)
$(bin2o)
%.cert.o : %.cert
@echo $(notdir $<)
$(bin2o)
%.app.o : %.app
@echo $(notdir $<)
$(bin2o)
-include $(DEPENDS) -include $(DEPENDS)
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------

View File

@ -31,6 +31,7 @@ const char* TXT_SysMenu;
const char* TXT_SysMenu2; const char* TXT_SysMenu2;
const char* TXT_SysMenu3; const char* TXT_SysMenu3;
const char* TXT_HBF; const char* TXT_HBF;
const char* TXT_NO_HBC;
const char* TXT_HBC; const char* TXT_HBC;
const char* TXT_HBC_NEW; const char* TXT_HBC_NEW;
const char* TXT_HBC_112; const char* TXT_HBC_112;

View File

@ -1,18 +1,18 @@
/* mload.c (for PPC) (c) 2009, Hermes /* mload.c (for PPC) (c) 2009, Hermes
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#ifndef __MLOAD_H__ #ifndef __MLOAD_H__
@ -26,31 +26,31 @@
#include <gccore.h> #include <gccore.h>
#include "unistd.h" #include "unistd.h"
#define MLOAD_MLOAD_THREAD_ID 0x4D4C4400 #define MLOAD_MLOAD_THREAD_ID 0x4D4C4400
#define MLOAD_GET_IOS_BASE 0x4D4C4401 #define MLOAD_GET_IOS_BASE 0x4D4C4401
#define MLOAD_GET_MLOAD_VERSION 0x4D4C4402 #define MLOAD_GET_MLOAD_VERSION 0x4D4C4402
#define MLOAD_LOAD_MODULE 0x4D4C4480 #define MLOAD_LOAD_MODULE 0x4D4C4480
#define MLOAD_RUN_MODULE 0x4D4C4481 #define MLOAD_RUN_MODULE 0x4D4C4481
#define MLOAD_RUN_THREAD 0x4D4C4482 #define MLOAD_RUN_THREAD 0x4D4C4482
#define MLOAD_STOP_THREAD 0x4D4C4484 #define MLOAD_STOP_THREAD 0x4D4C4484
#define MLOAD_CONTINUE_THREAD 0x4D4C4485 #define MLOAD_CONTINUE_THREAD 0x4D4C4485
#define MLOAD_GET_LOAD_BASE 0x4D4C4490 #define MLOAD_GET_LOAD_BASE 0x4D4C4490
#define MLOAD_MEMSET 0x4D4C4491 #define MLOAD_MEMSET 0x4D4C4491
#define MLOAD_GET_EHCI_DATA 0x4D4C44A0 #define MLOAD_GET_EHCI_DATA 0x4D4C44A0
#define MLOAD_GET_LOG 0x4D4C44A1 #define MLOAD_GET_LOG 0x4D4C44A1
#define MLOAD_SET_ES_IOCTLV 0x4D4C44B0 #define MLOAD_SET_ES_IOCTLV 0x4D4C44B0
#define MLOAD_GETW 0x4D4C44C0 #define MLOAD_GETW 0x4D4C44C0
#define MLOAD_GETH 0x4D4C44C1 #define MLOAD_GETH 0x4D4C44C1
#define MLOAD_GETB 0x4D4C44C2 #define MLOAD_GETB 0x4D4C44C2
#define MLOAD_SETW 0x4D4C44C3 #define MLOAD_SETW 0x4D4C44C3
#define MLOAD_SETH 0x4D4C44C4 #define MLOAD_SETH 0x4D4C44C4
#define MLOAD_SETB 0x4D4C44C5 #define MLOAD_SETB 0x4D4C44C5
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -63,42 +63,42 @@ extern "C" {
typedef struct typedef struct
{ {
u32 ident0; u32 ident0;
u32 ident1; u32 ident1;
u32 ident2; u32 ident2;
u32 ident3; u32 ident3;
u32 machinetype; u32 machinetype;
u32 version; u32 version;
u32 entry; u32 entry;
u32 phoff; u32 phoff;
u32 shoff; u32 shoff;
u32 flags; u32 flags;
u16 ehsize; u16 ehsize;
u16 phentsize; u16 phentsize;
u16 phnum; u16 phnum;
u16 shentsize; u16 shentsize;
u16 shnum; u16 shnum;
u16 shtrndx; u16 shtrndx;
} elfheader; } elfheader;
typedef struct typedef struct
{ {
u32 type; u32 type;
u32 offset; u32 offset;
u32 vaddr; u32 vaddr;
u32 paddr; u32 paddr;
u32 filesz; u32 filesz;
u32 memsz; u32 memsz;
u32 flags; u32 flags;
u32 align; u32 align;
} elfphentry; } elfphentry;
typedef struct typedef struct
{ {
void *start; void *start;
int prio; int prio;
void *stack; void *stack;
int size_stack; int size_stack;
} data_elf; } data_elf;
/*--------------------------------------------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------------------------------------------*/

View File

@ -1,3 +1,6 @@
#ifndef __SHA1_H__
#define __SHA1_H__
typedef struct { typedef struct {
unsigned long state[5]; unsigned long state[5];
unsigned long count[2]; unsigned long count[2];
@ -8,5 +11,6 @@ void SHA1Transform(unsigned long state[5], unsigned char buffer[64]);
void SHA1Init(SHA1_CTX* context); void SHA1Init(SHA1_CTX* context);
void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len); void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len);
void SHA1Final(unsigned char digest[20], SHA1_CTX* context); void SHA1Final(unsigned char digest[20], SHA1_CTX* context);
void SHA1(unsigned char *ptr, unsigned int size, unsigned char *outbuf); void SHA1(unsigned char *ptr, unsigned int size, unsigned char *outbuf);
#endif

View File

@ -1,13 +1,16 @@
#ifndef _TOOLS_H_ #ifndef _TOOLS_H_
#define _TOOLS_H_ #define _TOOLS_H_
#define AHB_ACCESS ((*(vu32*)0xcd800064 == 0xFFFFFFFF) ? 1 : 0) #include <ogc\lwp_watchdog.h>
#define AHB_ACCESS (*(vu32*)0xcd800064 == 0xFFFFFFFF)
#define MEM_REG_BASE 0xd8b4000 #define MEM_REG_BASE 0xd8b4000
#define MEM_PROT (MEM_REG_BASE + 0x20a) #define MEM_PROT (MEM_REG_BASE + 0x20a)
#define HOLLYWOOD_VERSION (vu32*)0x80003138 #define HOLLYWOOD_VERSION (vu32*)0x80003138
#define LOADER_STUB (vu32*)0x80001800 #define LOADER_STUB (vu32*)0x80001800
#define IS_WII_U ((*(vu32*)(0xCd8005A0) >> 16 ) == 0xCAFE) #define IS_WII_U ((*(vu32*)(0xCd8005A0) >> 16 ) == 0xCAFE)
#define MAX_ELEMENTS(x) ((sizeof((x))) / (sizeof((x)[0]))) #define MAX_ELEMENTS(x) ((sizeof((x))) / (sizeof((x)[0])))
#define CheckTime(X,Y) while(!(ticks_to_millisecs(diff_ticks((X), gettick())) > (Y)))
// Turn upper and lower into a full title ID // Turn upper and lower into a full title ID
#define TITLE_ID(x,y) (((u64)(x) << 32) | (y)) #define TITLE_ID(x,y) (((u64)(x) << 32) | (y))
@ -19,6 +22,10 @@
#define FULL_TITLE_ID(titleId) ((u32)(titleId)) #define FULL_TITLE_ID(titleId) ((u32)(titleId))
#define TITLE_ID2(titleId) ((u32)((titleId) >> 32)) #define TITLE_ID2(titleId) ((u32)((titleId) >> 32))
// Values for DetectInput
#define DI_BUTTONS_HELD 0
#define DI_BUTTONS_DOWN 1
enum { enum {
APP_TITLE = 0, APP_TITLE = 0,
APP_IOS, APP_IOS,
@ -54,6 +61,16 @@ enum {
HBF_THBF HBF_THBF
}; };
enum {
TID_CBOOT2 = 252, // cBoot252
TID_NANDEMU,
TID_BOOTMII,
TID_BC = 256,
TID_MIOS,
TID_NAND = 512,
TID_WFS
};
typedef struct { typedef struct {
s32 revision; s32 revision;
bool isStub; bool isStub;
@ -112,6 +129,7 @@ extern "C"
#endif #endif
// Prototypes // Prototypes
u32 DetectInput(u8 DownOrHeld);
char GetSysMenuRegion(u32 sysVersion); char GetSysMenuRegion(u32 sysVersion);
bool GetCertificates(void); bool GetCertificates(void);
u32 GetSysMenuVersion(void); u32 GetSysMenuVersion(void);

View File

@ -1,12 +1,12 @@
#ifndef __TMDIDENT_H__
#define __TMDIDENT_H__
#define base_number 122 #define base_number 122
typedef struct { typedef struct {
u32 hashes[5]; u32 hashes[5];
u32 base; u32 base;
char info[0x10]; char info[0x10];
} iosHashes; } iosHashes;
typedef struct _iosinfo_t { typedef struct _iosinfo_t {
@ -22,31 +22,31 @@ static iosHashes iosHash[base_number] = {
// {hash, hash, hash, hash, hash}, Base, InfoText}, // {hash, hash, hash, hash, hash}, Base, InfoText},
{{0x20e60607, 0x4e02c484, 0x2bbc5758, 0xee2b40fc, 0x35a68b0a}, 38, "rev 13a" }, // cIOSrev13a {{0x20e60607, 0x4e02c484, 0x2bbc5758, 0xee2b40fc, 0x35a68b0a}, 38, "rev 13a" }, // cIOSrev13a
{{0x620c57c7, 0xd155b67f, 0xa451e2ba, 0xfb5534d7, 0xaa457878}, 38, "rev 13b" }, // cIOSrev13b {{0x620c57c7, 0xd155b67f, 0xa451e2ba, 0xfb5534d7, 0xaa457878}, 38, "rev 13b" }, // cIOSrev13b
{{0x3c968e54, 0x9e915458, 0x9ecc3bda, 0x16d0a0d4, 0x8cac7917}, 37, "rev 18" }, // cIOS37 rev18 {{0x3c968e54, 0x9e915458, 0x9ecc3bda, 0x16d0a0d4, 0x8cac7917}, 37, "rev 18" }, // cIOS37 rev18
{{0xe811bca8, 0xe1df1e93, 0x779c40e6, 0x2006e807, 0xd4403b97}, 38, "rev 18" }, // cIOS38 rev18 {{0xe811bca8, 0xe1df1e93, 0x779c40e6, 0x2006e807, 0xd4403b97}, 38, "rev 18" }, // cIOS38 rev18
{{0x697676f0, 0x7a133b19, 0x881f512f, 0x2017b349, 0x6243c037}, 57, "rev 18" }, // cIOS57 rev18 {{0x697676f0, 0x7a133b19, 0x881f512f, 0x2017b349, 0x6243c037}, 57, "rev 18" }, // cIOS57 rev18
{{0x34ec540b, 0xd1fb5a5e, 0x4ae7f069, 0xd0a39b9a, 0xb1a1445f}, 60, "rev 18" }, // cIOS60 rev18 {{0x34ec540b, 0xd1fb5a5e, 0x4ae7f069, 0xd0a39b9a, 0xb1a1445f}, 60, "rev 18" }, // cIOS60 rev18
{{0xd98a4dd9, 0xff426ddb, 0x1afebc55, 0x30f75489, 0x40b27ade}, 70, "rev 18" }, // cIOS70 rev18 {{0xd98a4dd9, 0xff426ddb, 0x1afebc55, 0x30f75489, 0x40b27ade}, 70, "rev 18" }, // cIOS70 rev18
{{0x0a49cd80, 0x6f8f87ff, 0xac9a10aa, 0xefec9c1d, 0x676965b9}, 37, "rev 19" }, // cIOS37 rev19 {{0x0a49cd80, 0x6f8f87ff, 0xac9a10aa, 0xefec9c1d, 0x676965b9}, 37, "rev 19" }, // cIOS37 rev19
{{0x09179764, 0xeecf7f2e, 0x7631e504, 0x13b4b7aa, 0xca5fc1ab}, 38, "rev 19" }, // cIOS38 rev19 {{0x09179764, 0xeecf7f2e, 0x7631e504, 0x13b4b7aa, 0xca5fc1ab}, 38, "rev 19" }, // cIOS38 rev19
{{0x6010d5cf, 0x396415b7, 0x3c3915e9, 0x83ded6e3, 0x8f418d54}, 57, "rev 19" }, // cIOS57 rev19 {{0x6010d5cf, 0x396415b7, 0x3c3915e9, 0x83ded6e3, 0x8f418d54}, 57, "rev 19" }, // cIOS57 rev19
{{0x589d6c4f, 0x6bcbd80a, 0xe768f258, 0xc53a322c, 0xd143f8cd}, 60, "rev 19" }, // cIOS60 rev19 {{0x589d6c4f, 0x6bcbd80a, 0xe768f258, 0xc53a322c, 0xd143f8cd}, 60, "rev 19" }, // cIOS60 rev19
{{0x8969e0bf, 0x7f9b2391, 0x31ecfd88, 0x1c6f76eb, 0xf9418fe6}, 70, "rev 19" }, // cIOS70 rev19 {{0x8969e0bf, 0x7f9b2391, 0x31ecfd88, 0x1c6f76eb, 0xf9418fe6}, 70, "rev 19" }, // cIOS70 rev19
{{0x30aeadfe, 0x8b6ea668, 0x446578c7, 0x91f0832e, 0xb33c08ac}, 36, "rev 20" }, // cIOS36 rev20 {{0x30aeadfe, 0x8b6ea668, 0x446578c7, 0x91f0832e, 0xb33c08ac}, 36, "rev 20" }, // cIOS36 rev20
{{0xba0461a2, 0xaa26eed0, 0x482c1a7a, 0x59a97d94, 0xa607773e}, 37, "rev 20" }, // cIOS37 rev20 {{0xba0461a2, 0xaa26eed0, 0x482c1a7a, 0x59a97d94, 0xa607773e}, 37, "rev 20" }, // cIOS37 rev20
{{0xb694a33e, 0xf5040583, 0x0d540460, 0x2a450f3c, 0x69a68148}, 38, "rev 20" }, // cIOS38 rev20 {{0xb694a33e, 0xf5040583, 0x0d540460, 0x2a450f3c, 0x69a68148}, 38, "rev 20" }, // cIOS38 rev20
{{0xf6058710, 0xfe78a2d8, 0x44e6397f, 0x14a61501, 0x66c352cf}, 53, "rev 20" }, // cIOS53 rev20 {{0xf6058710, 0xfe78a2d8, 0x44e6397f, 0x14a61501, 0x66c352cf}, 53, "rev 20" }, // cIOS53 rev20
{{0xfa07fb10, 0x52ffb607, 0xcf1fc572, 0xf94ce42e, 0xa2f5b523}, 55, "rev 20" }, // cIOS55 rev20 {{0xfa07fb10, 0x52ffb607, 0xcf1fc572, 0xf94ce42e, 0xa2f5b523}, 55, "rev 20" }, // cIOS55 rev20
{{0xe30acf09, 0xbcc32544, 0x490aec18, 0xc276cee6, 0x5e5f6bab}, 56, "rev 20" }, // cIOS56 rev20 {{0xe30acf09, 0xbcc32544, 0x490aec18, 0xc276cee6, 0x5e5f6bab}, 56, "rev 20" }, // cIOS56 rev20
{{0x595ef1a3, 0x57d0cd99, 0x21b6bf6b, 0x432f6342, 0x605ae60d}, 57, "rev 20" }, // cIOS57 rev20 {{0x595ef1a3, 0x57d0cd99, 0x21b6bf6b, 0x432f6342, 0x605ae60d}, 57, "rev 20" }, // cIOS57 rev20
{{0x687a2698, 0x3efe5a08, 0xc01f6ae3, 0x3d8a1637, 0xadab6d48}, 60, "rev 20" }, // cIOS60 rev20 {{0x687a2698, 0x3efe5a08, 0xc01f6ae3, 0x3d8a1637, 0xadab6d48}, 60, "rev 20" }, // cIOS60 rev20
{{0xea6610e4, 0xa6beae66, 0x887be72d, 0x5da3415b, 0xa470523c}, 61, "rev 20" }, // cIOS61 rev20 {{0xea6610e4, 0xa6beae66, 0x887be72d, 0x5da3415b, 0xa470523c}, 61, "rev 20" }, // cIOS61 rev20
{{0x64e1af0e, 0xf7167fd7, 0x0c696306, 0xa2035b2d, 0x6047c736}, 70, "rev 20" }, // cIOS70 rev20 {{0x64e1af0e, 0xf7167fd7, 0x0c696306, 0xa2035b2d, 0x6047c736}, 70, "rev 20" }, // cIOS70 rev20
{{0x0df93ca9, 0x833cf61f, 0xb3b79277, 0xf4c93cd2, 0xcd8eae17}, 80, "rev 20" }, // cIOS80 rev20 {{0x0df93ca9, 0x833cf61f, 0xb3b79277, 0xf4c93cd2, 0xcd8eae17}, 80, "rev 20" }, // cIOS80 rev20
{{0x06c7a8e2, 0x3485e466, 0xd9ba56b6, 0x27d1cf5f, 0x4d8e451c}, 38, "rev 18" }, // cIOS38 rev18+ {{0x06c7a8e2, 0x3485e466, 0xd9ba56b6, 0x27d1cf5f, 0x4d8e451c}, 38, "rev 18" }, // cIOS38 rev18+
{{0x1ec125a0, 0xa04a6f60, 0xbd6f6faf, 0xbcb13d62, 0xe2a757b7}, 57, "rev 18" }, // cIOS57 rev18+ {{0x1ec125a0, 0xa04a6f60, 0xbd6f6faf, 0xbcb13d62, 0xe2a757b7}, 57, "rev 18" }, // cIOS57 rev18+
{{0xdf89b1b8, 0x340a001c, 0x032bdf54, 0x8679b8cb, 0x1bfb3490}, 57, "rev 18" }, // cIOS57 rev18+ {{0xdf89b1b8, 0x340a001c, 0x032bdf54, 0x8679b8cb, 0x1bfb3490}, 57, "rev 18" }, // cIOS57 rev18+
{{0x2fd88e4b, 0xd47fa8f1, 0x1bd39d7e, 0x79f88f9d, 0xd1ab19d8}, 36, "rev 3351" }, // (c)IOS36 (IOS236) {{0x2fd88e4b, 0xd47fa8f1, 0x1bd39d7e, 0x79f88f9d, 0xd1ab19d8}, 36, "rev 3351" }, // (c)IOS36 (IOS236)
{{0x074dfb39, 0x90a5da61, 0x67488616, 0x68ccb747, 0x3a5b59b3}, 36, "rev 21" }, // IOS249 r21 Base: 36 {{0x074dfb39, 0x90a5da61, 0x67488616, 0x68ccb747, 0x3a5b59b3}, 36, "rev 21" }, // IOS249 r21 Base: 36
{{0x6956a016, 0x59542728, 0x8d2efade, 0xad8ed01e, 0xe7f9a780}, 37, "rev 21" }, // IOS249 r21 Base: 37 {{0x6956a016, 0x59542728, 0x8d2efade, 0xad8ed01e, 0xe7f9a780}, 37, "rev 21" }, // IOS249 r21 Base: 37
{{0xdc8b23e6, 0x9d95fefe, 0xac10668a, 0x6891a729, 0x2bdfbca0}, 38, "rev 21" }, // IOS249 r21 Base: 38 {{0xdc8b23e6, 0x9d95fefe, 0xac10668a, 0x6891a729, 0x2bdfbca0}, 38, "rev 21" }, // IOS249 r21 Base: 38
@ -59,87 +59,89 @@ static iosHashes iosHash[base_number] = {
{{0xaf588570, 0x13955a32, 0x001296aa, 0x5f30e37f, 0x0be91316}, 61, "rev 21" }, // IOS249 r21 Base: 61 {{0xaf588570, 0x13955a32, 0x001296aa, 0x5f30e37f, 0x0be91316}, 61, "rev 21" }, // IOS249 r21 Base: 61
{{0x50deaba2, 0x9328755c, 0x7c2deac8, 0x385ecb49, 0x65ea3b2b}, 70, "rev 21" }, // IOS249 r21 Base: 70 {{0x50deaba2, 0x9328755c, 0x7c2deac8, 0x385ecb49, 0x65ea3b2b}, 70, "rev 21" }, // IOS249 r21 Base: 70
{{0x811b6a0b, 0xe26b9419, 0x7ffd4930, 0xdccd6ed3, 0x6ea2cdd2}, 80, "rev 21" }, // IOS249 r21 Base: 80 {{0x811b6a0b, 0xe26b9419, 0x7ffd4930, 0xdccd6ed3, 0x6ea2cdd2}, 80, "rev 21" }, // IOS249 r21 Base: 80
{{0xe40e13e0, 0xf0444cc0, 0x4fb40daa, 0x6487c3d8, 0x488879a2}, 38, "rev 17" }, // cIOS38 r17 {{0xe40e13e0, 0xf0444cc0, 0x4fb40daa, 0x6487c3d8, 0x488879a2}, 38, "rev 17" }, // cIOS38 r17
{{0xabcdd440, 0x24ed5dc1, 0x7b8c1799, 0xf8904659, 0x998cb370}, 38, "d2x-v2" }, // d2x-v2 r21 Base: 38 {{0xabcdd440, 0x24ed5dc1, 0x7b8c1799, 0xf8904659, 0x998cb370}, 38, "d2x-v2" }, // d2x-v2 r21 Base: 38
{{0x841743a4, 0xf75ce640, 0xb91b2d6a, 0xccae31dd, 0xf5a507d7}, 57, "d2x-v2" }, // d2x-v2 r21 Base: 57 {{0x841743a4, 0xf75ce640, 0xb91b2d6a, 0xccae31dd, 0xf5a507d7}, 57, "d2x-v2" }, // d2x-v2 r21 Base: 57
{{0x80fb2483, 0x5357a521, 0xf9013063, 0xd1a60db6, 0xd8960d6c}, 56, "d2x-v2" }, // d2x-v2 r21 Base: 56 {{0x80fb2483, 0x5357a521, 0xf9013063, 0xd1a60db6, 0xd8960d6c}, 56, "d2x-v2" }, // d2x-v2 r21 Base: 56
{{0xac5e096d, 0x9715752b, 0x1607d4c1, 0x70380e84, 0xc3684eae}, 37, "d2x-v2" }, // d2x-v2 r21 Base: 37 {{0xac5e096d, 0x9715752b, 0x1607d4c1, 0x70380e84, 0xc3684eae}, 37, "d2x-v2" }, // d2x-v2 r21 Base: 37
{{0xc9362096, 0xd39ffadd, 0x3395912d, 0x06f21da5, 0x4aed0679}, 58, "rev 21" }, // cIOS58 r21 {{0xc9362096, 0xd39ffadd, 0x3395912d, 0x06f21da5, 0x4aed0679}, 58, "rev 21" }, // cIOS58 r21
{{0x60345733, 0xdf1bf9a4, 0x20a72585, 0xea86cf66, 0x12b7df6a}, 57, "rev 21" }, // cIOS57 r21 {{0x60345733, 0xdf1bf9a4, 0x20a72585, 0xea86cf66, 0x12b7df6a}, 57, "rev 21" }, // cIOS57 r21
{{0x5f178a98, 0x4c4486ee, 0xcdb51ca7, 0xb0b172a0, 0x91ab0d2b}, 38, "rev 21" }, // cIOS38 r21 {{0x5f178a98, 0x4c4486ee, 0xcdb51ca7, 0xb0b172a0, 0x91ab0d2b}, 38, "rev 21" }, // cIOS38 r21
{{0x115a5bc1, 0x28fd5a1f, 0xc5ca4b76, 0xd54d4016, 0x5f93e406}, 56, "rev 21" }, // cIOS56 r21 {{0x115a5bc1, 0x28fd5a1f, 0xc5ca4b76, 0xd54d4016, 0x5f93e406}, 56, "rev 21" }, // cIOS56 r21
{{0xd3198a49, 0xd4be48b6, 0x74c50488, 0xdf870e48, 0x91ed14a9}, 57, "rev 21" }, // cIOS57 r21 {{0xd3198a49, 0xd4be48b6, 0x74c50488, 0xdf870e48, 0x91ed14a9}, 57, "rev 21" }, // cIOS57 r21
{{0x3f0fa343, 0x68413800, 0xe31729a6, 0x1805e71e, 0x680f9add}, 37, "d2xv3" }, // d2x-v3 r21 Base: 37 {{0x3f0fa343, 0x68413800, 0xe31729a6, 0x1805e71e, 0x680f9add}, 37, "d2xv3" }, // d2x-v3 r21 Base: 37
{{0xec25c714, 0xf63e6696, 0x10d6da7a, 0x4c331c64, 0xc3168ce6}, 38, "d2x-v3" }, // d2x-v3 r21 Base: 38 {{0xec25c714, 0xf63e6696, 0x10d6da7a, 0x4c331c64, 0xc3168ce6}, 38, "d2x-v3" }, // d2x-v3 r21 Base: 38
{{0xce0b9786, 0x6720fa8a, 0x4c09b54e, 0x42982999, 0xd447208b}, 56, "d2x-v3" }, // d2x-v3 r21 Base: 56 {{0xce0b9786, 0x6720fa8a, 0x4c09b54e, 0x42982999, 0xd447208b}, 56, "d2x-v3" }, // d2x-v3 r21 Base: 56
{{0xa24edf73, 0x572c5853, 0xcfe01a7e, 0x050afbf8, 0x6baa0d62}, 57, "d2x-v3" }, // d2x-v3 r21 Base: 57 {{0xa24edf73, 0x572c5853, 0xcfe01a7e, 0x050afbf8, 0x6baa0d62}, 57, "d2x-v3" }, // d2x-v3 r21 Base: 57
{{0x133c7710, 0x26d289de, 0x4622a841, 0xd32975d3, 0x35f87e31}, 58, "d2x-v3" }, // d2x-v3 r21 Base: 58 {{0x133c7710, 0x26d289de, 0x4622a841, 0xd32975d3, 0x35f87e31}, 58, "d2x-v3" }, // d2x-v3 r21 Base: 58
{{0x65944f33, 0x11f578c4, 0x3fdb6015, 0x084a307f, 0xe7040d61}, 37, "d2x-v1" }, // d2x-v1 r21 Base: 37 {{0x65944f33, 0x11f578c4, 0x3fdb6015, 0x084a307f, 0xe7040d61}, 37, "d2x-v1" }, // d2x-v1 r21 Base: 37
{{0x8371e0d3, 0xde2839d3, 0x0a116be3, 0xb8bdc04a, 0x6ed83a4e}, 38, "d2x-v1" }, // d2x-v1 r21 Base: 38 {{0x8371e0d3, 0xde2839d3, 0x0a116be3, 0xb8bdc04a, 0x6ed83a4e}, 38, "d2x-v1" }, // d2x-v1 r21 Base: 38
{{0x38f9a0d4, 0x367e0808, 0xe2fff71b, 0x1263221a, 0x60bc29cb}, 56, "d2x-v1" }, // d2x-v1 r21 Base: 56 {{0x38f9a0d4, 0x367e0808, 0xe2fff71b, 0x1263221a, 0x60bc29cb}, 56, "d2x-v1" }, // d2x-v1 r21 Base: 56
{{0x09d79d2a, 0x73e3c439, 0x1c0b9e3b, 0x7909b59d, 0xfdd77f74}, 57, "d2x-v1" }, // d2x-v1 r21 Base: 57 {{0x09d79d2a, 0x73e3c439, 0x1c0b9e3b, 0x7909b59d, 0xfdd77f74}, 57, "d2x-v1" }, // d2x-v1 r21 Base: 57
{{0x20ee9790, 0x22cf3b0a, 0x402c4620, 0x129ad758, 0x6c94386b}, 37, "d2x-v1" }, // d2x-v1 r65535 Base: 37 {{0x20ee9790, 0x22cf3b0a, 0x402c4620, 0x129ad758, 0x6c94386b}, 37, "d2x-v1" }, // d2x-v1 r65535 Base: 37
{{0xc2b448f4, 0x9537e0d7, 0x5730372a, 0x0eef2790, 0x4096bc2b}, 38, "d2x-v1" }, // d2x-v1 r65535 Base: 38 {{0xc2b448f4, 0x9537e0d7, 0x5730372a, 0x0eef2790, 0x4096bc2b}, 38, "d2x-v1" }, // d2x-v1 r65535 Base: 38
{{0xd6a2a8cd, 0x0b3c65df, 0x34791948, 0x04c6bbb8, 0xbd58fb77}, 56, "d2x-v1" }, // d2x-v1 r65535 Base: 56 {{0xd6a2a8cd, 0x0b3c65df, 0x34791948, 0x04c6bbb8, 0xbd58fb77}, 56, "d2x-v1" }, // d2x-v1 r65535 Base: 56
{{0x9d8c98fc, 0x189b531b, 0xdfff0981, 0xe3f78f60, 0xa004a6fc}, 57, "d2x-v1" }, // d2x-v1 r65535 Base: 57 {{0x9d8c98fc, 0x189b531b, 0xdfff0981, 0xe3f78f60, 0xa004a6fc}, 57, "d2x-v1" }, // d2x-v1 r65535 Base: 57
{{0x9daa8020, 0xf65bf973, 0x0b0ae31e, 0xcfcbc83f, 0x708ba2cc}, 37, "d2x-v2" }, // d2x-v2 r65535 Base: 37 {{0x9daa8020, 0xf65bf973, 0x0b0ae31e, 0xcfcbc83f, 0x708ba2cc}, 37, "d2x-v2" }, // d2x-v2 r65535 Base: 37
{{0x652b4055, 0xa57b8777, 0x217fc97e, 0x1dacd460, 0xd8795f57}, 38, "d2x-v2" }, // d2x-v2 r65535 Base: 38 {{0x652b4055, 0xa57b8777, 0x217fc97e, 0x1dacd460, 0xd8795f57}, 38, "d2x-v2" }, // d2x-v2 r65535 Base: 38
{{0x68fa7d61, 0x30ffd971, 0x83e1a056, 0x7e3c693b, 0xa18465ed}, 56, "d2x-v2" }, // d2x-v2 r65535 Base: 56 {{0x68fa7d61, 0x30ffd971, 0x83e1a056, 0x7e3c693b, 0xa18465ed}, 56, "d2x-v2" }, // d2x-v2 r65535 Base: 56
{{0xb3437bbf, 0x832f21d8, 0x8bdad236, 0x98fdd32e, 0xbaff6e2c}, 57, "d2x-v2" }, // d2x-v2 r21 Base: 57 {{0xb3437bbf, 0x832f21d8, 0x8bdad236, 0x98fdd32e, 0xbaff6e2c}, 57, "d2x-v2" }, // d2x-v2 r21 Base: 57
{{0xc549172f, 0x13cd642a, 0xc09ab7f7, 0xbfa36d8b, 0x56e3c2d7}, 37, "d2x-v3" }, // d2x-v3 r65535 Base: 37 {{0xc549172f, 0x13cd642a, 0xc09ab7f7, 0xbfa36d8b, 0x56e3c2d7}, 37, "d2x-v3" }, // d2x-v3 r65535 Base: 37
{{0x8b64539a, 0x8f253b81, 0x02408620, 0x7377b5f9, 0xdbd70b6b}, 38, "d2x-v3" }, // d2x-v3 r65535 Base: 38 {{0x8b64539a, 0x8f253b81, 0x02408620, 0x7377b5f9, 0xdbd70b6b}, 38, "d2x-v3" }, // d2x-v3 r65535 Base: 38
{{0xa923319c, 0xbb6d25a8, 0xae8eab82, 0xa0376dc6, 0x11302999}, 56, "d2x-v3" }, // d2x-v3 r65535 Base: 56 {{0xa923319c, 0xbb6d25a8, 0xae8eab82, 0xa0376dc6, 0x11302999}, 56, "d2x-v3" }, // d2x-v3 r65535 Base: 56
{{0xda1ff450, 0xe2710584, 0x44411c4d, 0xb7486df5, 0xfbcd67d7}, 57, "d2x-v3" }, // d2x-v3 r65535 Base: 57 {{0xda1ff450, 0xe2710584, 0x44411c4d, 0xb7486df5, 0xfbcd67d7}, 57, "d2x-v3" }, // d2x-v3 r65535 Base: 57
{{0x2d24fbca, 0xb8c075b3, 0x921f3b58, 0x8bcf0cf6, 0x5568cd1e}, 58, "d2x-v3" }, // d2x-v3 r65535 Base: 58 {{0x2d24fbca, 0xb8c075b3, 0x921f3b58, 0x8bcf0cf6, 0x5568cd1e}, 58, "d2x-v3" }, // d2x-v3 r65535 Base: 58
{{0x2bd8749e, 0xa0752f26, 0x480ba81e, 0xe2e90ece, 0x1b515c9d}, 36, "rev 3351" }, // (c)IOS36 (IOS236) {{0x2bd8749e, 0xa0752f26, 0x480ba81e, 0xe2e90ece, 0x1b515c9d}, 36, "rev 3351" }, // (c)IOS36 (IOS236)
{{0xff6154a5, 0xa368f31e, 0x99a685af, 0x9b19b571, 0x28badb20}, 37, "d2x-v3" }, // d2x-v3 r65535 Base: 37 {{0xff6154a5, 0xa368f31e, 0x99a685af, 0x9b19b571, 0x28badb20}, 37, "d2x-v3" }, // d2x-v3 r65535 Base: 37
{{0xa923319c, 0xbb6d25a8, 0xae8eab82, 0xa0376dc6, 0x11302999}, 56, "d2x-v3" }, // d2x-v3 r65535 Base: 56 {{0xa923319c, 0xbb6d25a8, 0xae8eab82, 0xa0376dc6, 0x11302999}, 56, "d2x-v3" }, // d2x-v3 r65535 Base: 56
{{0x5c7be813, 0xd814c8b2, 0x6f8785f4, 0xa964e276, 0x5a0fa6ce}, 38, "d2x-v3" }, // d2x-v3 r65535 Base: 38 {{0x5c7be813, 0xd814c8b2, 0x6f8785f4, 0xa964e276, 0x5a0fa6ce}, 38, "d2x-v3" }, // d2x-v3 r65535 Base: 38
{{0xe32539ce, 0x43acc96c, 0x9b27dd23, 0x53b04172, 0x6f303a5c}, 57, "d2x-v3" }, // d2x-v3 r65535 Base: 57 {{0xe32539ce, 0x43acc96c, 0x9b27dd23, 0x53b04172, 0x6f303a5c}, 57, "d2x-v3" }, // d2x-v3 r65535 Base: 57
{{0xaa0688eb, 0x328e516d, 0x89bef8f7, 0xd1151bd8, 0x81af4db8}, 58, "d2x-v3" }, // d2x-v3 r65535 Base: 58 {{0xaa0688eb, 0x328e516d, 0x89bef8f7, 0xd1151bd8, 0x81af4db8}, 58, "d2x-v3" }, // d2x-v3 r65535 Base: 58
{{0x6a8376ab, 0xa466f9b6, 0x1403dfcf, 0x120fbe9e, 0x48e3acbe}, 80, "rev 21" }, // cIOS80 r21 {{0x6a8376ab, 0xa466f9b6, 0x1403dfcf, 0x120fbe9e, 0x48e3acbe}, 80, "rev 21" }, // cIOS80 r21
{{0x4db1be1e, 0xdb4d0c1c, 0x75900233, 0xeeae3fc6, 0x9bb86d3e}, 37, "d2x-v3" }, // d2x-v3 r65535 Base: 37 {{0x4db1be1e, 0xdb4d0c1c, 0x75900233, 0xeeae3fc6, 0x9bb86d3e}, 37, "d2x-v3" }, // d2x-v3 r65535 Base: 37
{{0x86f60709, 0x2e580cba, 0x922cbed8, 0x28d053bd, 0xff378145}, 56, "d2x-v3" }, // d2x-v3 r65535 Base: 56 {{0x86f60709, 0x2e580cba, 0x922cbed8, 0x28d053bd, 0xff378145}, 56, "d2x-v3" }, // d2x-v3 r65535 Base: 56
{{0x7a7a0094, 0x2991ea1c, 0xaff02047, 0x6d1ffffc, 0x0c9e53a6}, 58, "d2x-v3" }, // d2x-v3 r65535 Base: 58 {{0x7a7a0094, 0x2991ea1c, 0xaff02047, 0x6d1ffffc, 0x0c9e53a6}, 58, "d2x-v3" }, // d2x-v3 r65535 Base: 58
{{0x0facacb9, 0x34c2886c, 0x5b13b098, 0x2ae699e9, 0xec47d8ee}, 57, "d2x-v3" }, // d2x-v3 r65535 Base: 57 {{0x0facacb9, 0x34c2886c, 0x5b13b098, 0x2ae699e9, 0xec47d8ee}, 57, "d2x-v3" }, // d2x-v3 r65535 Base: 57
{{0x90badb7b, 0xeef5196e, 0x5f32f59b, 0x29a98f2d, 0xc0e64260}, 38, "d2x-v3" }, // d2x-v3 r65535 Base: 38 {{0x90badb7b, 0xeef5196e, 0x5f32f59b, 0x29a98f2d, 0xc0e64260}, 38, "d2x-v3" }, // d2x-v3 r65535 Base: 38
{{0x57671632, 0x131c0441, 0x78991fe3, 0x7d8b1baa, 0x99f597bf}, 38, "rev 17b" }, // cIOS38 rev17b {{0x57671632, 0x131c0441, 0x78991fe3, 0x7d8b1baa, 0x99f597bf}, 38, "rev 17b" }, // cIOS38 rev17b
{{0x5db466c0, 0xd04ada02, 0x4348dbca, 0x74729d0c, 0x3cb2c30c}, 80, "rev 6944" }, // IOS80 rev 6944 {{0x5db466c0, 0xd04ada02, 0x4348dbca, 0x74729d0c, 0x3cb2c30c}, 80, "rev 6944" }, // IOS80 rev 6944
{{0x0312f927, 0xabcc84db, 0x319bf5f9, 0xa7b5432c, 0x66b5fa47}, 30, "rev 2576" }, // IOS30 rev 2576 {{0x0312f927, 0xabcc84db, 0x319bf5f9, 0xa7b5432c, 0x66b5fa47}, 30, "rev 2576" }, // IOS30 rev 2576
{{0xac131d4c, 0xfa6e61a0, 0x170cc7c4, 0xa7cbbbc7, 0xa50c7c09}, 50, "rev 4889" }, // IOS50 rev 4889 {{0xac131d4c, 0xfa6e61a0, 0x170cc7c4, 0xa7cbbbc7, 0xa50c7c09}, 50, "rev 4889" }, // IOS50 rev 4889
{{0xd18fed7b, 0x26b5bf56, 0xe59e0077, 0xa7d34fa4, 0xe53e5040}, 51, "rev 4633" }, // IOS51 rev 4633 {{0xd18fed7b, 0x26b5bf56, 0xe59e0077, 0xa7d34fa4, 0xe53e5040}, 51, "rev 4633" }, // IOS51 rev 4633
{{0xbe46b9ef, 0x00bc99f0, 0x8d40dc62, 0x5a1af1d9, 0xa9ad2960}, 60, "rev 6174" }, // IOS60 rev 6174 {{0xbe46b9ef, 0x00bc99f0, 0x8d40dc62, 0x5a1af1d9, 0xa9ad2960}, 60, "rev 6174" }, // IOS60 rev 6174
{{0xc65c0e7b, 0xaa023c9a, 0x08e31648, 0x36d105ff, 0x37c490d4}, 70, "rev 6687" }, // IOS70 rev 6687 {{0xc65c0e7b, 0xaa023c9a, 0x08e31648, 0x36d105ff, 0x37c490d4}, 70, "rev 6687" }, // IOS70 rev 6687
{{0xc2e6bdf7, 0xdddfa3aa, 0x738c0637, 0xfd21ed87, 0xac4487df}, 11, "rev 10" }, // IOS11 rev 10 {{0xc2e6bdf7, 0xdddfa3aa, 0x738c0637, 0xfd21ed87, 0xac4487df}, 11, "rev 10" }, // IOS11 rev 10
{{0xf6ce3ce6, 0xb581c754, 0xa100b63e, 0xe59ea2ca, 0x8d4a53a9}, 20, "rev 12" }, // IOS70 rev 12 {{0xf6ce3ce6, 0xb581c754, 0xa100b63e, 0xe59ea2ca, 0x8d4a53a9}, 20, "rev 12" }, // IOS70 rev 12
{{0x9957b893, 0x158b1c82, 0xc0e2ee3c, 0xf024697b, 0x70349fd2}, 58, "d2x-v5a1" }, // d3x-v5alpha1 r65535 Base: 58 {{0x9957b893, 0x158b1c82, 0xc0e2ee3c, 0xf024697b, 0x70349fd2}, 58, "d2x-v5a1" }, // d3x-v5alpha1 r65535 Base: 58
{{0x666b6be7, 0x7ce68420, 0xe5390361, 0xd7b7fef3, 0xfab6fbb8}, 57, "d2x-v5a1" }, // d2x-v5alpha1 r65535 Base: 57 {{0x666b6be7, 0x7ce68420, 0xe5390361, 0xd7b7fef3, 0xfab6fbb8}, 57, "d2x-v5a1" }, // d2x-v5alpha1 r65535 Base: 57
{{0x0e5e820f, 0x7f7a995f, 0xfeadfb17, 0xa951b3f3, 0xc37df8f3}, 38, "d2x-v5a1" }, // d2x-v5alpha1 r65535 Base: 38 {{0x0e5e820f, 0x7f7a995f, 0xfeadfb17, 0xa951b3f3, 0xc37df8f3}, 38, "d2x-v5a1" }, // d2x-v5alpha1 r65535 Base: 38
{{0x1ffeb8d3, 0x73960032, 0xce2c7e7a, 0xb0edb2af, 0xa2edcaf6}, 56, "d2x-v5a1" }, // d2x-v5alpha1 r65535 Base: 56 {{0x1ffeb8d3, 0x73960032, 0xce2c7e7a, 0xb0edb2af, 0xa2edcaf6}, 56, "d2x-v5a1" }, // d2x-v5alpha1 r65535 Base: 56
{{0xa6d6b431, 0xa17d4300, 0xb0545865, 0x178ba8ad, 0x9db775a8}, 37, "d2x-v5a1" }, // d2x-v5alpha1 r65535 Base: 37 {{0xa6d6b431, 0xa17d4300, 0xb0545865, 0x178ba8ad, 0x9db775a8}, 37, "d2x-v5a1" }, // d2x-v5alpha1 r65535 Base: 37
{{0x285bffe0, 0x423f5a42, 0x1245eb42, 0xbaf6a560, 0x24692cd6}, 38, "rev 20" }, // cIOS38 rev20 {{0x285bffe0, 0x423f5a42, 0x1245eb42, 0xbaf6a560, 0x24692cd6}, 38, "rev 20" }, // cIOS38 rev20
{{0xe9341b4d, 0x9e17a081, 0xae283e2c, 0x32cd9787, 0xe94731d2}, 38, "rev 20" }, // cIOS38 rev20 {{0xe9341b4d, 0x9e17a081, 0xae283e2c, 0x32cd9787, 0xe94731d2}, 38, "rev 20" }, // cIOS38 rev20
{{0x33123c8e, 0xe7c4092c, 0x3b373cd2, 0x5398e557, 0xa5083896}, 56, "rev 20" }, // cIOS56 rev20 {{0x33123c8e, 0xe7c4092c, 0x3b373cd2, 0x5398e557, 0xa5083896}, 56, "rev 20" }, // cIOS56 rev20
{{0x62d422f1, 0x5d5634a2, 0xf558fd66, 0x2e5ade12, 0xea308923}, 56, "rev 20" }, // cIOS56 rev20 {{0x62d422f1, 0x5d5634a2, 0xf558fd66, 0x2e5ade12, 0xea308923}, 56, "rev 20" }, // cIOS56 rev20
{{0xebb81264, 0xc41331bc, 0x7fe76c17, 0xcf400d15, 0x25035bec}, 57, "rev 20" }, // cIOS57 rev20 {{0xebb81264, 0xc41331bc, 0x7fe76c17, 0xcf400d15, 0x25035bec}, 57, "rev 20" }, // cIOS57 rev20
{{0x7dd6a102, 0x91413451, 0xb3b460bc, 0xbf6dff97, 0x79407afa}, 57, "rev 20" }, // cIOS57 rev20 {{0x7dd6a102, 0x91413451, 0xb3b460bc, 0xbf6dff97, 0x79407afa}, 57, "rev 20" }, // cIOS57 rev20
{{0x651a74de, 0x7e624b0c, 0x15e582c5, 0x94ced058, 0x27a9e4b2}, 38, "rev 21" }, // cIOS38 rev21 {{0x651a74de, 0x7e624b0c, 0x15e582c5, 0x94ced058, 0x27a9e4b2}, 38, "rev 21" }, // cIOS38 rev21
{{0x1e8e63dd, 0x897a4e34, 0x79aa9395, 0x6bd8167e, 0x515101ad}, 38, "rev 21" }, // cIOS38 rev21 {{0x1e8e63dd, 0x897a4e34, 0x79aa9395, 0x6bd8167e, 0x515101ad}, 38, "rev 21" }, // cIOS38 rev21
{{0x018699f6, 0x1886ee6c, 0xb4144505, 0x9a5ba565, 0x7f1659be}, 56, "rev 21" }, // cIOS56 rev21 {{0x018699f6, 0x1886ee6c, 0xb4144505, 0x9a5ba565, 0x7f1659be}, 56, "rev 21" }, // cIOS56 rev21
{{0x3876b3c9, 0x4d8db267, 0xcaa0c752, 0x63fb38f8, 0x2a0226a5}, 56, "rev 21" }, // cIOS56 rev21 {{0x3876b3c9, 0x4d8db267, 0xcaa0c752, 0x63fb38f8, 0x2a0226a5}, 56, "rev 21" }, // cIOS56 rev21
{{0x1b4fb650, 0x3aaf1665, 0xebfbc1cf, 0xfe52c3ad, 0x711989f0}, 57, "rev 21" }, // cIOS57 rev21 {{0x1b4fb650, 0x3aaf1665, 0xebfbc1cf, 0xfe52c3ad, 0x711989f0}, 57, "rev 21" }, // cIOS57 rev21
{{0x57efc1dc, 0x02806212, 0x17239dee, 0x31c01423, 0x14340f3f}, 57, "rev 21" }, // cIOS57 rev21 {{0x57efc1dc, 0x02806212, 0x17239dee, 0x31c01423, 0x14340f3f}, 57, "rev 21" }, // cIOS57 rev21
{{0xed1afef3, 0x37a084d7, 0xa7f84e81, 0xcaba017a, 0x7707963d}, 38, "d2x-v4" }, // d2x cIOS38 v4 {{0xed1afef3, 0x37a084d7, 0xa7f84e81, 0xcaba017a, 0x7707963d}, 38, "d2x-v4" }, // d2x cIOS38 v4
{{0xc79f7915, 0x0f3c7848, 0x0fd4dafb, 0x62b61ab8, 0x675d463f}, 38, "d2x-v4" }, // d2x cIOS38 v4 {{0xc79f7915, 0x0f3c7848, 0x0fd4dafb, 0x62b61ab8, 0x675d463f}, 38, "d2x-v4" }, // d2x cIOS38 v4
{{0x5167c1fa, 0xcf54edcd, 0x6d688d62, 0x0387c1a7, 0xbcf109e6}, 56, "d2x-v4" }, // d2x cIOS56 v4 {{0x5167c1fa, 0xcf54edcd, 0x6d688d62, 0x0387c1a7, 0xbcf109e6}, 56, "d2x-v4" }, // d2x cIOS56 v4
{{0x697f935f, 0x25929794, 0x5dd16218, 0xa15dedc9, 0x0fe63ead}, 56, "d2x-v4" }, // d2x cIOS56 v4 {{0x697f935f, 0x25929794, 0x5dd16218, 0xa15dedc9, 0x0fe63ead}, 56, "d2x-v4" }, // d2x cIOS56 v4
{{0x385567e3, 0xeaf6d36a, 0x874b1a03, 0xabc5e3d6, 0xa74da383}, 57, "d2x-v4" }, // d2x cIOS57 v4 {{0x385567e3, 0xeaf6d36a, 0x874b1a03, 0xabc5e3d6, 0xa74da383}, 57, "d2x-v4" }, // d2x cIOS57 v4
{{0x3110d72d, 0x96a9aa14, 0xa5d35afe, 0xb991f1e4, 0xc88a804b}, 57, "d2x-v4" }, // d2x cIOS57 v4 {{0x3110d72d, 0x96a9aa14, 0xa5d35afe, 0xb991f1e4, 0xc88a804b}, 57, "d2x-v4" }, // d2x cIOS57 v4
{{0xfce5cb4d, 0x055ce1ab, 0xaba3a4b1, 0x7b298665, 0x0cafbcc6}, 80, "rev 6944" }, // IOS80 rev 6944 {{0xfce5cb4d, 0x055ce1ab, 0xaba3a4b1, 0x7b298665, 0x0cafbcc6}, 80, "rev 6944" }, // IOS80 rev 6944
{{0x95e2193d, 0x4e80e7ea, 0xb2ed6b5e, 0x8012d483, 0x129dc921}, 70, "rev 6687" }, // IOS70 rev 6687 {{0x95e2193d, 0x4e80e7ea, 0xb2ed6b5e, 0x8012d483, 0x129dc921}, 70, "rev 6687" }, // IOS70 rev 6687
{{0xb7268554, 0x8a7194c4, 0x2a1d6039, 0x2271ace5, 0x62db98b9}, 60, "rev 6174" }, // IOS60 rev 6174 {{0xb7268554, 0x8a7194c4, 0x2a1d6039, 0x2271ace5, 0x62db98b9}, 60, "rev 6174" }, // IOS60 rev 6174
{{0x1a3200ec, 0x7eaa20de, 0x69c02000, 0x496f2d01, 0x506a7824}, 50, "rev 4889" }, // IOS50 rev 4889 {{0x1a3200ec, 0x7eaa20de, 0x69c02000, 0x496f2d01, 0x506a7824}, 50, "rev 4889" }, // IOS50 rev 4889
{{0xea390bf6, 0x4b1f6640, 0xdb46f605, 0xb3c1f6fc, 0x62f173b9}, 30, "rev 2576" }, // IOS30 rev 2576 {{0xea390bf6, 0x4b1f6640, 0xdb46f605, 0xb3c1f6fc, 0x62f173b9}, 30, "rev 2576" }, // IOS30 rev 2576
{{0x97f4ad1a, 0x437842a8, 0x015435c7, 0xa2b25178, 0x3564265d}, 20, "rev 12" }, // IOS20 rev 212 {{0x97f4ad1a, 0x437842a8, 0x015435c7, 0xa2b25178, 0x3564265d}, 20, "rev 12" }, // IOS20 rev 212
{{0xe42a9e18, 0xa967eb9c, 0x94769498, 0x917c9ab9, 0x6169e7ca}, 11, "rev 10" } // IOS11 rev 10 {{0xe42a9e18, 0xa967eb9c, 0x94769498, 0x917c9ab9, 0x6169e7ca}, 11, "rev 10" } // IOS11 rev 10
}; };
#endif

View File

@ -5,24 +5,19 @@
#include "languages.h" #include "languages.h"
// CONF_LANG_JAPANESE
// CONF_LANG_ENGLISH // CONF_LANG_ENGLISH
// CONF_LANG_GERMAN // CONF_LANG_GERMAN
// CONF_LANG_FRENCH // CONF_LANG_FRENCH
// CONF_LANG_SPANISH // CONF_LANG_SPANISH
// CONF_LANG_ITALIAN // CONF_LANG_ITALIAN
// CONF_LANG_DUTCH
// CONF_LANG_SIMP_CHINESE
// CONF_LANG_TRAD_CHINESE
// CONF_LANG_KOREAN
// !!! Doens't support special chars... !!! // !!! Doesn't support special chars... !!!
// !!! Don't change the order of the parameters !!! // !!! Don't change the order of the parameters !!!
int initLanguages(struct tm today) int initLanguages(struct tm today)
{ {
TXT_AppVersion = "v2.2.1 HD Edition"; TXT_AppVersion = "v2.2.1 HacksDen Edition";
switch (CONF_GetLanguage()) switch (CONF_GetLanguage())
{ {
case CONF_LANG_GERMAN: case CONF_LANG_GERMAN:
@ -50,6 +45,7 @@ int initLanguages(struct tm today)
TXT_SysMenu = "Systemmenue %1.1f%c (v%d)"; TXT_SysMenu = "Systemmenue %1.1f%c (v%d)";
TXT_SysMenu2 = "Systemmenue %s%s (v%d)"; TXT_SysMenu2 = "Systemmenue %s%s (v%d)";
TXT_SysMenu3 = "Systemmenue %1.1f%c (v%d, Info: v%d %s)"; TXT_SysMenu3 = "Systemmenue %1.1f%c (v%d, Info: v%d %s)";
TXT_NO_HBC = "Homebrewkanal ist nicht installiert";
TXT_HBF = "HomebrewFilter rev%d benutzt IOS58"; TXT_HBF = "HomebrewFilter rev%d benutzt IOS58";
TXT_HBC = "Homebrewkanal 1.0.%d benutzt IOS%d"; TXT_HBC = "Homebrewkanal 1.0.%d benutzt IOS%d";
TXT_HBC_NEW = "Homebrewkanal 1.1.0 benutzt IOS%d"; TXT_HBC_NEW = "Homebrewkanal 1.1.0 benutzt IOS%d";
@ -127,6 +123,7 @@ int initLanguages(struct tm today)
TXT_SysMenu = "Menu Systeme %1.1f%c (v%d)"; TXT_SysMenu = "Menu Systeme %1.1f%c (v%d)";
TXT_SysMenu2 = "Menu Systeme %s%s (v%d)"; TXT_SysMenu2 = "Menu Systeme %s%s (v%d)";
TXT_SysMenu3 = "Menu Systeme %1.1f%c (v%d, Info: v%d %s)"; TXT_SysMenu3 = "Menu Systeme %1.1f%c (v%d, Info: v%d %s)";
TXT_NO_HBC = "Chaine Homebrew n'est pas installé";
TXT_HBC = "Chaine Homebrew 1.0.%d utilise IOS%d"; TXT_HBC = "Chaine Homebrew 1.0.%d utilise IOS%d";
TXT_HBC_NEW = "Chaine Homebrew 1.1.0 utilise IOS%d"; TXT_HBC_NEW = "Chaine Homebrew 1.1.0 utilise IOS%d";
TXT_HBC_112 = "Chaine Channel 1.1.%d utilise IOS%d"; TXT_HBC_112 = "Chaine Channel 1.1.%d utilise IOS%d";
@ -202,6 +199,7 @@ int initLanguages(struct tm today)
TXT_SysMenu = "Menu di sistema %1.1f%c (v%d)"; TXT_SysMenu = "Menu di sistema %1.1f%c (v%d)";
TXT_SysMenu2 = "Menu di sistema %s%s (v%d)"; TXT_SysMenu2 = "Menu di sistema %s%s (v%d)";
TXT_SysMenu3 = "Menu di sistema %1.1f%c (v%d, Info: v%d %s)"; TXT_SysMenu3 = "Menu di sistema %1.1f%c (v%d, Info: v%d %s)";
TXT_NO_HBC = "Non è installato Canale Homebrew";
TXT_HBC = "Canale Homebrew 1.0.%d appoggiato all'IOS%d"; TXT_HBC = "Canale Homebrew 1.0.%d appoggiato all'IOS%d";
TXT_HBC_NEW = "Canale Homebrew 1.1.0 appoggiato all'IOS%d"; TXT_HBC_NEW = "Canale Homebrew 1.1.0 appoggiato all'IOS%d";
TXT_HBC_112 = "Canale Homebrew 1.1.%d appoggiato all'IOS%d"; TXT_HBC_112 = "Canale Homebrew 1.1.%d appoggiato all'IOS%d";
@ -277,6 +275,7 @@ int initLanguages(struct tm today)
TXT_SysMenu = "Menu de Sistema %1.1f%c (v%d)"; TXT_SysMenu = "Menu de Sistema %1.1f%c (v%d)";
TXT_SysMenu2 = "Menu de Sistema %s%s (v%d)"; TXT_SysMenu2 = "Menu de Sistema %s%s (v%d)";
TXT_SysMenu3 = "Menu de Sistema %1.1f%c (v%d, Info: v%d %s)"; TXT_SysMenu3 = "Menu de Sistema %1.1f%c (v%d, Info: v%d %s)";
TXT_NO_HBC = "No está instalado el Canal Homebrew";
TXT_HBC = "Canal Homebrew 1.0.%d corriendo en IOS%d"; TXT_HBC = "Canal Homebrew 1.0.%d corriendo en IOS%d";
TXT_HBC_NEW = "Canal Homebrew 1.1.0 corriendo en IOS%d"; TXT_HBC_NEW = "Canal Homebrew 1.1.0 corriendo en IOS%d";
TXT_HBC_112 = "Canal Homebrew 1.1.%d corriendo en %d"; TXT_HBC_112 = "Canal Homebrew 1.1.%d corriendo en %d";
@ -352,6 +351,7 @@ int initLanguages(struct tm today)
TXT_SysMenu = "System Menu %1.1f%c (v%d)"; TXT_SysMenu = "System Menu %1.1f%c (v%d)";
TXT_SysMenu2 = "System Menu %s%s (v%d)"; TXT_SysMenu2 = "System Menu %s%s (v%d)";
TXT_SysMenu3 = "System Menu %1.1f%c (v%d, Info: v%d %s)"; TXT_SysMenu3 = "System Menu %1.1f%c (v%d, Info: v%d %s)";
TXT_NO_HBC = "Homebrew Channel is not installed";
TXT_HBC = "Homebrew Channel 1.0.%d running on IOS%d"; TXT_HBC = "Homebrew Channel 1.0.%d running on IOS%d";
TXT_HBC_NEW = "Homebrew Channel 1.1.0 running on IOS%d"; TXT_HBC_NEW = "Homebrew Channel 1.1.0 running on IOS%d";
TXT_HBC_112 = "Homebrew Channel 1.1.%d running on IOS%d"; TXT_HBC_112 = "Homebrew Channel 1.1.%d running on IOS%d";

View File

@ -10,7 +10,6 @@
#include <network.h> #include <network.h>
#include <ogc/machine/processor.h> #include <ogc/machine/processor.h>
#include <ogc/conf.h> #include <ogc/conf.h>
#include <wiiuse/wpad.h>
#include <ctype.h> #include <ctype.h>
#include "sys.h" #include "sys.h"

View File

@ -8,6 +8,7 @@
#include <ogc/conf.h> #include <ogc/conf.h>
#include <ogc/es.h> #include <ogc/es.h>
#include <ogc/ios.h> #include <ogc/ios.h>
#include <ogc/pad.h>
#include <wiiuse/wpad.h> #include <wiiuse/wpad.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
@ -36,9 +37,8 @@
extern bool geckoinit; extern bool geckoinit;
extern void __exception_setreload(int t); extern void __exception_setreload(int t);
static u64 current_time = 0;
int get_title_ios(u64 title) { int get_title_ios(u64 title) {
s32 ret, fd; s32 ret, fd;
@ -101,8 +101,7 @@ bool getInfoFromContent(IOS *ios) {
ret = read_file_from_nand(filepath, &buffer, &filesize); ret = read_file_from_nand(filepath, &buffer, &filesize);
iosinfo = (iosinfo_t *)(buffer); iosinfo = (iosinfo_t *)(buffer);
if (ret >= 0 && ios->titleID == 252 && ios->num_contents == 1) { if (ret >= 0 && ios->titleID == TID_CBOOT2 && ios->num_contents == 1) {
//const char *checkStr = "bootcb2";
int i; int i;
for (i = 0; i < filesize - sizeof("bootcb2")-1; i++) for (i = 0; i < filesize - sizeof("bootcb2")-1; i++)
{ {
@ -224,8 +223,9 @@ int main(int argc, char **argv)
// Get the console region // Get the console region
printLoading(MSG_GetConsoleRegion); printLoading(MSG_GetConsoleRegion);
usleep(200000); current_time = gettick();
SystemInfo.systemRegion = CONF_GetRegion(); SystemInfo.systemRegion = CONF_GetRegion();
CheckTime(current_time, 200000);
SystemInfo.shopcode = 0; SystemInfo.shopcode = 0;
if (!CONF_GetShopCode(&SystemInfo.shopcode)) { if (!CONF_GetShopCode(&SystemInfo.shopcode)) {
@ -236,12 +236,15 @@ int main(int argc, char **argv)
// Get the system menu version // Get the system menu version
printLoading(MSG_GetSysMenuVer); printLoading(MSG_GetSysMenuVer);
usleep(200000); current_time = gettick();
SystemInfo.sysMenuVer = GetSysMenuVersion(); SystemInfo.sysMenuVer = GetSysMenuVersion();
CheckTime(current_time, 200000);
sysMenu systemmenu; sysMenu systemmenu;
printLoading(MSG_GetHBCVer); printLoading(MSG_GetHBCVer);
usleep(200000); current_time = gettick();
homebrew_t homebrew; homebrew_t homebrew;
homebrew.hbcversion = 0; homebrew.hbcversion = 0;
homebrew.hbfversion = 0; homebrew.hbfversion = 0;
@ -313,26 +316,31 @@ int main(int argc, char **argv)
SystemInfo.sysNinVersion = GetSysMenuNintendoVersion(SystemInfo.sysMenuVer); SystemInfo.sysNinVersion = GetSysMenuNintendoVersion(SystemInfo.sysMenuVer);
SystemInfo.sysMenuRegion = GetSysMenuRegion(SystemInfo.sysMenuVer); SystemInfo.sysMenuRegion = GetSysMenuRegion(SystemInfo.sysMenuVer);
CheckTime(current_time, 200000);
// Get the running IOS version and revision // Get the running IOS version and revision
printLoading(MSG_GetRunningIOS);
current_time = gettick();
u32 runningIOS = IOS_GetVersion(); u32 runningIOS = IOS_GetVersion();
u32 runningIOSRevision = IOS_GetRevision(); u32 runningIOSRevision = IOS_GetRevision();
printLoading(MSG_GetRunningIOS);
usleep(200000); CheckTime(current_time, 200000);
// Get the console ID // Get the console ID
printLoading(MSG_GetConsoleID); printLoading(MSG_GetConsoleID);
usleep(200000); current_time = gettick();
SystemInfo.deviceID = GetDeviceID(); SystemInfo.deviceID = GetDeviceID();
CheckTime(current_time, 200000);
// Get the boot2 version // Get the boot2 version
printLoading(MSG_GetBoot2); printLoading(MSG_GetBoot2);
usleep(200000); current_time = gettick();
SystemInfo.boot2version = GetBoot2Version(); SystemInfo.boot2version = GetBoot2Version();
CheckTime(current_time, 200000);
// Get number of titles // Get number of titles
printLoading(MSG_GetNrOfTitles); printLoading(MSG_GetNrOfTitles);
usleep(200000); current_time = gettick();
u32 tempTitles; u32 tempTitles;
if (ES_GetNumTitles(&tempTitles) < 0) { if (ES_GetNumTitles(&tempTitles) < 0) {
@ -354,10 +362,11 @@ int main(int argc, char **argv)
deinitGUI(); deinitGUI();
exit(1); exit(1);
} }
CheckTime(current_time, 200000);
// Get list of titles // Get list of titles
printLoading(MSG_GetTitleList); printLoading(MSG_GetTitleList);
usleep(200000); current_time = gettick();
if (ES_GetTitles(titles, nbTitles) < 0) { if (ES_GetTitles(titles, nbTitles) < 0) {
printError(ERR_GetTitleList); printError(ERR_GetTitleList);
sleep(5); sleep(5);
@ -400,10 +409,11 @@ int main(int argc, char **argv)
} }
SystemInfo.countIOS++; SystemInfo.countIOS++;
} }
CheckTime(current_time, 200000);
// Sort IOS titles // Sort IOS titles
printLoading(MSG_SortTitles); printLoading(MSG_SortTitles);
//usleep(200000); current_time = gettick();
u64 *newTitles = memalign(32, SystemInfo.countIOS*sizeof(u64)); u64 *newTitles = memalign(32, SystemInfo.countIOS*sizeof(u64));
u32 cnt = 0; u32 cnt = 0;
@ -419,7 +429,6 @@ int main(int argc, char **argv)
IOS ios[SystemInfo.countIOS]; IOS ios[SystemInfo.countIOS];
// ios Liste initialisieren // ios Liste initialisieren
//for (i = 0; i < countIOS; i++) {
for (i = SystemInfo.countIOS; i--;) { // Should be slightly faster for (i = SystemInfo.countIOS; i--;) { // Should be slightly faster
ios[i].infoContent = 0; ios[i].infoContent = 0;
ios[i].titleID = 0; ios[i].titleID = 0;
@ -498,44 +507,40 @@ int main(int argc, char **argv)
ios[i].isStub = true; ios[i].isStub = true;
else else
{ {
ios[i].isStub = (ios[i].titleID != 256 && ios[i].titleID != 257 && ios[i].titleID != 512 && ios[i].titleID != 513 && titleSize < 0x100000); ios[i].isStub = (ios[i].titleID != TID_BC && ios[i].titleID != TID_MIOS && ios[i].titleID != TID_NAND && ios[i].titleID != TID_WFS && titleSize < 0x100000);
if (ios[i].isStub) { if (ios[i].isStub) {
gprintf("is stub\n"); gprintf("is stub\n");
logfile("is stub\r\n"); logfile("is stub\r\n");
} }
} }
if (!ios[i].isStub || ios[i].titleID == 252) { if ((!ios[i].isStub || ios[i].titleID == TID_CBOOT2) && (SystemInfo.nandAccess) && (!getInfoFromContent(&ios[i]))) {
if (SystemInfo.nandAccess) // Hash des TMDs abrufen
if (!getInfoFromContent(&ios[i])) { iosTMD->title_id = ((u64)(1) << 32) | 249;
// Hash des TMDs abrufen brute_tmd(iosTMD);
iosTMD->title_id = ((u64)(1) << 32) | 249;
brute_tmd(iosTMD);
sha1 hash; sha1 hash;
SHA1((u8 *)iosTMDBuffer, tmdSize, hash); SHA1((u8 *)iosTMDBuffer, tmdSize, hash);
sprintf(HashLogBuffer[lines], "IOS%d get_ios_base: \n%x %x %x %x, %x %x %x %x, %x %x %x %x, %x %x %x %x, %x %x %x %x\n", ios[i].titleID, (char)hash[0], (char)hash[1], (char)hash[2], (char)hash[3], (char)hash[4], (char)hash[5], (char)hash[6], (char)hash[7], (char)hash[8], (char)hash[9], (char)hash[10], (char)hash[11], (char)hash[12], (char)hash[13], (char)hash[14], (char)hash[15], (char)hash[16], (char)hash[17], (char)hash[18], (char)hash[19]); sprintf(HashLogBuffer[lines], "IOS%d base hash: \r\n%x %x %x %x, %x %x %x %x, %x %x %x %x, %x %x %x %x, %x %x %x %x\r\n", ios[i].titleID, hash[0], hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7], hash[8], hash[9], hash[10], hash[11], hash[12], hash[13], hash[14], hash[15], hash[16], hash[17], hash[18], hash[19]);
lines++; lines++;
for (j = 0;j < base_number;j++) for (j = 0;j < base_number;j++)
{ {
// Hashes berprfen // Check hashes
if (memcmp((void *)hash, (u32 *)&iosHash[j].hashes, sizeof(sha1)) == 0) if (memcmp((void *)hash, (u32 *)&iosHash[j].hashes, sizeof(sha1)) == 0)
{ {
if (ios[i].titleID != iosHash[j].base) if (ios[i].titleID != iosHash[j].base)
ios[i].baseIOS = iosHash[j].base; ios[i].baseIOS = iosHash[j].base;
strcpy(ios[i].info, iosHash[j].info); strcpy(ios[i].info, iosHash[j].info);
gprintf("is %s\n", ios[i].info); gprintf("is %s\n", ios[i].info);
logfile("is %s\r\n", ios[i].info); logfile("is %s\r\n", ios[i].info);
}
}
} }
}
} }
free(iosTMDBuffer); free(iosTMDBuffer);
if (ios[i].titleID == 256 || ios[i].titleID == 257) SystemInfo.countBCMIOS++; if (ios[i].titleID == TID_BC || ios[i].titleID == TID_MIOS) SystemInfo.countBCMIOS++;
if (ios[i].isStub && !(iosTMD->title_version == 31338) && !(iosTMD->title_version == 65281) && !(iosTMD->title_version == 65535)) SystemInfo.countStubs++; if (ios[i].isStub && !(iosTMD->title_version == 31338) && !(iosTMD->title_version == 65281) && !(iosTMD->title_version == 65535)) SystemInfo.countStubs++;
} }
@ -575,7 +580,7 @@ int main(int argc, char **argv)
// Try to identify the cIOS by the info put in by the installer/ModMii // Try to identify the cIOS by the info put in by the installer/ModMii
sysMenuInfoContent = *(u8 *)((u32)iosTMDBuffer+0x1E7); sysMenuInfoContent = *(u8 *)((u32)iosTMDBuffer+0x1E7);
sprintf(filepath, "/title/%08x/%08x/content/%08x.app", 0x00000001, 2, sysMenuInfoContent); sprintf(filepath, "/title/%08x/%08x/content/%08x.app", 0x00000001, 2, sysMenuInfoContent);
gprintf("/title/%08x/%08x/content/%08x.app\n", 0x00000001, 2, sysMenuInfoContent); gprintf(filepath);
ret = read_file_from_nand(filepath, &buffer, &filesize); ret = read_file_from_nand(filepath, &buffer, &filesize);
sysInfo = (iosinfo_t *)(buffer); sysInfo = (iosinfo_t *)(buffer);
@ -583,7 +588,6 @@ int main(int argc, char **argv)
{ {
systemmenu.realRevision = sysInfo->version; systemmenu.realRevision = sysInfo->version;
systemmenu.hasInfo = true; systemmenu.hasInfo = true;
//strcpy(systemmenu.info, sysInfo->name);
sprintf(systemmenu.info, "%s%s", sysInfo->name, sysInfo->versionstring); sprintf(systemmenu.info, "%s%s", sysInfo->name, sysInfo->versionstring);
if (buffer != NULL) free(buffer); if (buffer != NULL) free(buffer);
} else { } else {
@ -597,10 +601,11 @@ int main(int argc, char **argv)
SystemInfo.countTitles = nbTitles; SystemInfo.countTitles = nbTitles;
nbTitles = SystemInfo.countIOS; nbTitles = SystemInfo.countIOS;
CheckTime(current_time, 200000);
// Get the certificates from the NAND // Get the certificates from the NAND
printLoading(MSG_GetCertificates); printLoading(MSG_GetCertificates);
usleep(200000); CheckTime(current_time, 200000);
if (!GetCertificates()) { if (!GetCertificates()) {
printError(ERR_GetCertificates); printError(ERR_GetCertificates);
sleep(5); sleep(5);
@ -610,19 +615,18 @@ int main(int argc, char **argv)
//Select an IOS to test //Select an IOS to test
WPAD_Init(); WPAD_Init();
PAD_Init();
int selectedIOS = -1; int selectedIOS = -1;
u32 wpressed; u32 wpressed;
time_t starttime; time_t starttime;
starttime = time(NULL); starttime = time(NULL);
printSelectIOS(MSG_SelectIOS, MSG_All); printSelectIOS(MSG_SelectIOS, MSG_All);
bool completeReport = true; bool completeReport = true;
while (difftime (time(NULL),starttime) < 15) { while (difftime (time(NULL),starttime) < 15) {
//while(1) { wpressed = DetectInput(DI_BUTTONS_HELD);
WPAD_ScanPads();
wpressed = WPAD_ButtonsHeld(0);
usleep(50000); usleep(50000);
if (wpressed & WPAD_BUTTON_RIGHT && selectedIOS < (nbTitles-1)){ if (wpressed & WPAD_BUTTON_RIGHT && selectedIOS < (nbTitles-1)){
@ -633,10 +637,10 @@ int main(int argc, char **argv)
switch (titleID) switch (titleID)
{ {
case 256: case TID_BC:
sprintf(MSG_Buffer, "BC"); sprintf(MSG_Buffer, "BC");
break; break;
case 257: case TID_MIOS:
sprintf(MSG_Buffer, "MIOS"); sprintf(MSG_Buffer, "MIOS");
break; break;
default: default:
@ -655,10 +659,10 @@ int main(int argc, char **argv)
switch (titleID) switch (titleID)
{ {
case 256: case TID_BC:
sprintf(MSG_Buffer, "BC"); sprintf(MSG_Buffer, "BC");
break; break;
case 257: case TID_MIOS:
sprintf(MSG_Buffer, "MIOS"); sprintf(MSG_Buffer, "MIOS");
break; break;
default: default:
@ -706,14 +710,18 @@ int main(int argc, char **argv)
{ {
if (selectedIOS > -1) i = selectedIOS; //If specific IOS is selected if (selectedIOS > -1) i = selectedIOS; //If specific IOS is selected
if (ios[i].titleID == 256) sprintf(MSG_Buffer2, "BC"); if (ios[i].titleID == TID_BC) sprintf(MSG_Buffer2, "BC");
else if (ios[i].titleID == 257) sprintf(MSG_Buffer2, "MIOS"); else if (ios[i].titleID == TID_MIOS) sprintf(MSG_Buffer2, "MIOS");
else sprintf(MSG_Buffer2, "IOS%d", ios[i].titleID); else sprintf(MSG_Buffer2, "IOS%d", ios[i].titleID);
sprintf(MSG_Buffer, MSG_TestingIOS, MSG_Buffer2); sprintf(MSG_Buffer, MSG_TestingIOS, MSG_Buffer2);
printLoadingBar(MSG_Buffer, (100.0/(nbTitles-1)*(i+1))); printLoadingBar(MSG_Buffer, (100.0/(nbTitles-1)*(i+1)));
if (ios[i].isStub || ios[i].titleID == 256 || ios[i].titleID == 257) if (ios[i].isStub ||
ios[i].titleID == TID_BC ||
ios[i].titleID == TID_MIOS ||
ios[i].titleID == TID_NAND ||
ios[i].titleID == TID_WFS)
{ {
ios[i].infoFakeSignature = false; ios[i].infoFakeSignature = false;
ios[i].infoESIdentify = false; ios[i].infoESIdentify = false;
@ -770,7 +778,7 @@ int main(int argc, char **argv)
NandStartup(); NandStartup();
int k = 0; int k = 0;
for (k = 0; k < nbTitles; k++) { for (k = 0; k < nbTitles; k++) {
if ((ios[i].isStub || ios[i].titleID == 256 || ios[i].titleID == 257) && ios[i].titleID != 252) continue; if ((ios[i].isStub || ios[i].titleID == TID_BC || ios[i].titleID == TID_MIOS) && ios[i].titleID != TID_CBOOT2) continue;
getInfoFromContent(&ios[k]); getInfoFromContent(&ios[k]);
} }
NandShutdown(); NandShutdown();
@ -796,8 +804,9 @@ int main(int argc, char **argv)
usleep(200000); usleep(200000);
//--Generate Report-- //--Generate Report--
current_time=gettick();
printLoading(MSG_GenerateReport); printLoading(MSG_GenerateReport);
usleep(200000);
char ReportBuffer[200][100] = {{0}}; char ReportBuffer[200][100] = {{0}};
@ -975,7 +984,7 @@ int main(int argc, char **argv)
sprintf(ReportBuffer[PRIILOADER], TXT_PreFiix); sprintf(ReportBuffer[PRIILOADER], TXT_PreFiix);
if (homebrew.hbc == HBC_NONE || homebrew.hbcversion == 0) if (homebrew.hbc == HBC_NONE || homebrew.hbcversion == 0)
sprintf(ReportBuffer[HBC], "Homebrew Channel is not installed"); sprintf(ReportBuffer[HBC], TXT_NO_HBC);
else if (homebrew.hbcIOS == 0) else if (homebrew.hbcIOS == 0)
sprintf(ReportBuffer[HBC], TXT_HBC_STUB); sprintf(ReportBuffer[HBC], TXT_HBC_STUB);
else if (homebrew.hbc == HBC_LULZ) else if (homebrew.hbc == HBC_LULZ)
@ -1004,9 +1013,9 @@ int main(int argc, char **argv)
lineOffset = i + LAST; lineOffset = i + LAST;
if (selectedIOS > -1) i = selectedIOS; //If specific IOS is selected if (selectedIOS > -1) i = selectedIOS; //If specific IOS is selected
if (ios[i].titleID == 256) { if (ios[i].titleID == TID_BC) {
sprintf(ReportBuffer[lineOffset], "BC v%d", ios[i].revision); sprintf(ReportBuffer[lineOffset], "BC v%d", ios[i].revision);
} else if (ios[i].titleID == 257) { } else if (ios[i].titleID == TID_MIOS) {
sprintf(ReportBuffer[lineOffset], "MIOS v%d%s", ios[i].revision, SystemInfo.miosInfo); sprintf(ReportBuffer[lineOffset], "MIOS v%d%s", ios[i].revision, SystemInfo.miosInfo);
} else if ((ios[i].titleID==222 || ios[i].titleID==224 || ios[i].titleID==223 || ios[i].titleID==202 || ios[i].titleID==225) && ios[i].baseIOS == 75) { } else if ((ios[i].titleID==222 || ios[i].titleID==224 || ios[i].titleID==223 || ios[i].titleID==202 || ios[i].titleID==225) && ios[i].baseIOS == 75) {
sprintf(ReportBuffer[lineOffset], "IOS%d[38+37] (rev %d, Info: %s):", ios[i].titleID, ios[i].revision, ios[i].info); sprintf(ReportBuffer[lineOffset], "IOS%d[38+37] (rev %d, Info: %s):", ios[i].titleID, ios[i].revision, ios[i].info);
@ -1033,9 +1042,9 @@ int main(int argc, char **argv)
} }
// Check BootMii As IOS (BootMii As IOS is installed on IOS254 rev 31338) // Check BootMii As IOS (BootMii As IOS is installed on IOS254 rev 31338)
if (ios[i].titleID == 254 && (ios[i].revision == 31338 || ios[i].revision == 65281)) if (ios[i].titleID == TID_BOOTMII && (ios[i].revision == 31338 || ios[i].revision == 65281))
strcat (ReportBuffer[lineOffset]," BootMii"); strcat (ReportBuffer[lineOffset]," BootMii");
else if (ios[i].titleID == 253 && ios[i].revision == 65535) else if (ios[i].titleID == TID_NANDEMU && ios[i].revision == 65535)
strcat (ReportBuffer[lineOffset]," NANDEmu"); strcat (ReportBuffer[lineOffset]," NANDEmu");
else else
{ {
@ -1045,7 +1054,7 @@ int main(int argc, char **argv)
} else if (ios[i].isStub && strcmp(ios[i].info, "NULL") != 0) { } else if (ios[i].isStub && strcmp(ios[i].info, "NULL") != 0) {
gprintf("2. titleID: %d %s\n", ios[i].titleID, ios[i].info); gprintf("2. titleID: %d %s\n", ios[i].titleID, ios[i].info);
strcat (ReportBuffer[lineOffset], ios[i].info); strcat (ReportBuffer[lineOffset], ios[i].info);
} else if(ios[i].titleID != 256 && ios[i].titleID != 257) { } else if(ios[i].titleID != TID_BC && ios[i].titleID != TID_MIOS) {
if(ios[i].infoFakeSignature) strcat(ReportBuffer[lineOffset], TXT_Trucha); if(ios[i].infoFakeSignature) strcat(ReportBuffer[lineOffset], TXT_Trucha);
if(ios[i].infoESIdentify) strcat(ReportBuffer[lineOffset], TXT_ES); if(ios[i].infoESIdentify) strcat(ReportBuffer[lineOffset], TXT_ES);
if(ios[i].infoFlashAccess) strcat(ReportBuffer[lineOffset], TXT_Flash); if(ios[i].infoFlashAccess) strcat(ReportBuffer[lineOffset], TXT_Flash);
@ -1062,15 +1071,17 @@ int main(int argc, char **argv)
int NumLines = lineOffset+1; int NumLines = lineOffset+1;
sprintf(ReportBuffer[NumLines], TXT_ReportDate); sprintf(ReportBuffer[NumLines], TXT_ReportDate);
CheckTime(current_time, 200000);
// Mount the SD Card // Mount the SD Card
current_time=gettick();
printLoading(MSG_MountSD); printLoading(MSG_MountSD);
usleep(200000);
MountSD(); MountSD();
CheckTime(current_time, 200000);
// Initialise the FAT file system // Initialise the FAT file system
current_time=gettick();
printLoading(MSG_InitFAT); printLoading(MSG_InitFAT);
usleep(200000);
if (!fatInitDefault()) if (!fatInitDefault())
{ {
sprintf(MSG_Buffer, ERR_InitFAT); sprintf(MSG_Buffer, ERR_InitFAT);
@ -1080,6 +1091,7 @@ int main(int argc, char **argv)
} else { } else {
//chdir("/"); //chdir("/");
// Create the report // Create the report
CheckTime(current_time, 200000);
FILE *file = fopen(REPORT, "w"); FILE *file = fopen(REPORT, "w");
if(!file) if(!file)
@ -1097,6 +1109,7 @@ int main(int argc, char **argv)
fclose(file); fclose(file);
printEndSuccess(MSG_ReportSuccess); printEndSuccess(MSG_ReportSuccess);
CheckTime(current_time, 200000);
} }
// Create hash log // Create hash log
@ -1115,8 +1128,9 @@ int main(int argc, char **argv)
} }
// Close the report // Close the report
fclose(file); fclose(file);
current_time=gettick();
printEndSuccess(MSG_ReportSuccess); printEndSuccess(MSG_ReportSuccess);
CheckTime(current_time, 200000);
} }
} }
@ -1125,8 +1139,7 @@ int main(int argc, char **argv)
WPAD_Init(); WPAD_Init();
bool reportIsDisplayed = false; bool reportIsDisplayed = false;
while (1) { while (1) {
WPAD_ScanPads(); wpressed = DetectInput(DI_BUTTONS_HELD);
wpressed = WPAD_ButtonsHeld(0);
// Return to the loader // Return to the loader
if (wpressed & WPAD_BUTTON_HOME) { if (wpressed & WPAD_BUTTON_HOME) {

View File

@ -85,4 +85,67 @@ void NandShutdown(void)
ISFS_Deinitialize(); ISFS_Deinitialize();
NandInitialized = false; NandInitialized = false;
} }
u32 DetectInput(u8 DownOrHeld) {
u32 pressed = 0;
u16 gcpressed = 0;
VIDEO_WaitVSync();
// Wii Remote (and Classic Controller) take precedence over GC to save time
if (WPAD_ScanPads() > WPAD_ERR_NONE) // Scan the Wii remotes. If there any problems, skip checking buttons
{
if (DownOrHeld == DI_BUTTONS_DOWN) {
pressed = WPAD_ButtonsDown(0) | WPAD_ButtonsDown(1) | WPAD_ButtonsDown(2) | WPAD_ButtonsDown(3); //Store pressed buttons
} else {
pressed = WPAD_ButtonsHeld(0) | WPAD_ButtonsHeld(1) | WPAD_ButtonsHeld(2) | WPAD_ButtonsHeld(3); //Store pressed buttons
}
// Convert to wiimote values
if (pressed & WPAD_CLASSIC_BUTTON_ZR) pressed |= WPAD_BUTTON_PLUS;
if (pressed & WPAD_CLASSIC_BUTTON_ZL) pressed |= WPAD_BUTTON_MINUS;
if (pressed & WPAD_CLASSIC_BUTTON_PLUS) pressed |= WPAD_BUTTON_PLUS;
if (pressed & WPAD_CLASSIC_BUTTON_MINUS) pressed |= WPAD_BUTTON_MINUS;
if (pressed & WPAD_CLASSIC_BUTTON_A) pressed |= WPAD_BUTTON_A;
if (pressed & WPAD_CLASSIC_BUTTON_B) pressed |= WPAD_BUTTON_B;
if (pressed & WPAD_CLASSIC_BUTTON_X) pressed |= WPAD_BUTTON_2;
if (pressed & WPAD_CLASSIC_BUTTON_Y) pressed |= WPAD_BUTTON_1;
if (pressed & WPAD_CLASSIC_BUTTON_HOME) pressed |= WPAD_BUTTON_HOME;
if (pressed & WPAD_CLASSIC_BUTTON_UP) pressed |= WPAD_BUTTON_UP;
if (pressed & WPAD_CLASSIC_BUTTON_DOWN) pressed |= WPAD_BUTTON_DOWN;
if (pressed & WPAD_CLASSIC_BUTTON_LEFT) pressed |= WPAD_BUTTON_LEFT;
if (pressed & WPAD_CLASSIC_BUTTON_RIGHT) pressed |= WPAD_BUTTON_RIGHT;
}
// Return Classic Controller and Wii Remote values
if (pressed) return pressed;
// No buttons on the Wii remote or Classic Controller were pressed
if (PAD_ScanPads() > PAD_ERR_NONE)
{
if (DownOrHeld == DI_BUTTONS_HELD) {
gcpressed = PAD_ButtonsHeld(0) | PAD_ButtonsHeld(1) | PAD_ButtonsHeld(2) | PAD_ButtonsHeld(3); //Store pressed buttons
} else {
gcpressed = PAD_ButtonsDown(0) | PAD_ButtonsDown(1) | PAD_ButtonsDown(2) | PAD_ButtonsDown(3); //Store pressed buttons
}
if (gcpressed) {
// Button on GC controller was pressed
if (gcpressed & PAD_TRIGGER_Z) pressed |= WPAD_NUNCHUK_BUTTON_Z;
if (gcpressed & PAD_TRIGGER_R) pressed |= WPAD_BUTTON_PLUS;
if (gcpressed & PAD_TRIGGER_L) pressed |= WPAD_BUTTON_MINUS;
if (gcpressed & PAD_BUTTON_A) pressed |= WPAD_BUTTON_A;
if (gcpressed & PAD_BUTTON_B) pressed |= WPAD_BUTTON_B;
if (gcpressed & PAD_BUTTON_X) pressed |= WPAD_BUTTON_1;
if (gcpressed & PAD_BUTTON_Y) pressed |= WPAD_BUTTON_2;
if (gcpressed & PAD_BUTTON_MENU) pressed |= WPAD_BUTTON_HOME;
if (gcpressed & PAD_BUTTON_UP) pressed |= WPAD_BUTTON_UP;
if (gcpressed & PAD_BUTTON_LEFT) pressed |= WPAD_BUTTON_LEFT;
if (gcpressed & PAD_BUTTON_DOWN) pressed |= WPAD_BUTTON_DOWN;
if (gcpressed & PAD_BUTTON_RIGHT) pressed |= WPAD_BUTTON_RIGHT;
}
}
return pressed;
}

View File

@ -5,7 +5,6 @@
#include <malloc.h> #include <malloc.h>
#include <network.h> #include <network.h>
#include "update.h" #include "update.h"
#include "gecko.h" #include "gecko.h"
#include "http.h" #include "http.h"
@ -18,7 +17,7 @@ s32 downloadSyscheckFile(const char* fileName) {
u32 length; u32 length;
snprintf(buf, sizeof(buf), "http://syscheck-hd.googlecode.com/svn/trunk/SysCheckHDE/%s", fileName); snprintf(buf, sizeof(buf), "http://syscheck-hd.googlecode.com/svn/trunk/SysCheckHDE/%s", fileName);
ret = http_request(buf, 1 << 31); ret = http_request(buf, 1 << 31);
if (!ret) if (!ret)
{ {
@ -32,16 +31,16 @@ s32 downloadSyscheckFile(const char* fileName) {
} }
} }
} }
ret = http_get_result(&http_status, &outbuf, &length); ret = http_get_result(&http_status, &outbuf, &length);
if (((int)*outbuf & 0xF0000000) == 0xF0000000) if (((int)*outbuf & 0xF0000000) == 0xF0000000)
{ {
return -2; return -2;
} }
sprintf(buf, "%s%s", PATH, fileName); sprintf(buf, "%s%s", PATH, fileName);
FILE *file = fopen(buf, "w"); FILE *file = fopen(buf, "w");
if(!file) if(!file)
@ -100,7 +99,7 @@ s32 updateApp(void) {
ret = 2; ret = 2;
goto out; goto out;
} }
} else { } else {
ret = -3; ret = -3;
goto out; goto out;

View File

@ -53,7 +53,7 @@ char *url_encode(char *str) {
void transmitSyscheck(char ReportBuffer[200][100], int *lines) { void transmitSyscheck(char ReportBuffer[200][100], int *lines) {
printLoadingBar(TXT_Upload, 0); printLoadingBar(TXT_Upload, 0);
gprintf("TempReport bauen\n"); gprintf("TempReport built\n");
int i = 0; int i = 0;
int strl = 0; int strl = 0;
@ -62,7 +62,7 @@ void transmitSyscheck(char ReportBuffer[200][100], int *lines) {
strl += strlen(ReportBuffer[i]); strl += strlen(ReportBuffer[i]);
strl += strlen("\n"); strl += strlen("\n");
} }
printLoadingBar(TXT_Upload, 5); printLoadingBar(TXT_Upload, 20);
char tempReport[strl]; char tempReport[strl];
memset(tempReport, 0, strl); memset(tempReport, 0, strl);
for (i = 0; i <= *lines; i++) { for (i = 0; i <= *lines; i++) {
@ -70,25 +70,24 @@ void transmitSyscheck(char ReportBuffer[200][100], int *lines) {
strcat(tempReport, ReportBuffer[i]); strcat(tempReport, ReportBuffer[i]);
strcat(tempReport, "\n"); strcat(tempReport, "\n");
} }
printLoadingBar(TXT_Upload, 30); printLoadingBar(TXT_Upload, 40);
net_init(); net_init();
printLoadingBar(TXT_Upload, 60); printLoadingBar(TXT_Upload, 60);
gprintf("OK\n"); gprintf("OK\n");
char *encodedReport = url_encode(tempReport); char *encodedReport = url_encode(tempReport);
char bufTransmit[18+strlen(encodedReport)]; char bufTransmit[18+strlen(encodedReport)];
char password[12] = {0}; //char password[12] = {0};
gprintf("OK2\n"); gprintf("OK2\n");
sprintf(bufTransmit, "password=%s&syscheck=%s", password, encodedReport); //sprintf(bufTransmit, "password=%s&syscheck=%s", password, encodedReport);
sprintf(bufTransmit, "password=B277eNGp789a&syscheck=%s", encodedReport);
gprintf("bufTransmit: %s ENDE len:%u\n", bufTransmit, strlen(bufTransmit)); gprintf("bufTransmit: %s ENDE len:%u\n", bufTransmit, strlen(bufTransmit));
gprintf("OK3\n"); gprintf("OK3\n");
char host[48] = {"\0"}; char host[48];
sprintf(host, "http://syscheck.softwii.de/syscheck_receiver.php"); sprintf(host, "http://syscheck.softwii.de/syscheck_receiver.php");
http_post(host, 1024, bufTransmit); http_post(host, 1024, bufTransmit);
printLoadingBar(TXT_Upload, 80); printLoadingBar(TXT_Upload, 80);
gprintf("OK4\n"); gprintf("OK4\n\n");
gprintf("\n");
u32 http_status; u32 http_status;
u8* outbuf; u8* outbuf;
@ -106,35 +105,21 @@ void transmitSyscheck(char ReportBuffer[200][100], int *lines) {
free(outbuf); free(outbuf);
gprintf("len: %d, String: %s\n", lenght, ReportBuffer[*lines]); gprintf("len: %d, String: %s\n", lenght, ReportBuffer[*lines]);
u32 wpressed; //u32 wpressed;
if (!strncmp(ReportBuffer[*lines], "ERROR: ", 7)) { if (!strncmp(ReportBuffer[*lines], "ERROR: ", 7)) {
char temp[100]; char temp[100] = {0};
strncpy(temp, ReportBuffer[*lines]+7, 100); strncpy(temp, ReportBuffer[*lines]+7, sizeof(temp));
printUploadError(temp); printUploadError(temp);
memset(ReportBuffer[*lines], 0, 100); memset(ReportBuffer[*lines], 0, 100);
(*lines)--; (*lines)--;
(*lines)--; (*lines)--;
while (1) {
WPAD_ScanPads();
wpressed = WPAD_ButtonsHeld(0);
if (wpressed & WPAD_BUTTON_A) {
break;
}
}
} else { } else {
printUploadSuccess(ReportBuffer[*lines]); printUploadSuccess(ReportBuffer[*lines]);
while (1) {
WPAD_ScanPads();
wpressed = WPAD_ButtonsHeld(0);
if (wpressed & WPAD_BUTTON_A) {
break;
}
}
} }
while (1) {
if (DetectInput(DI_BUTTONS_HELD) & WPAD_BUTTON_A) break;
}
free(encodedReport); free(encodedReport);
net_deinit(); net_deinit();
} }