diff --git a/src/main.cpp b/src/main.cpp index 73f75b1..d221426 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,9 +3,16 @@ #include #include #include +#include +#include #include #include #include +#include +#include +#include +#include +#include #include #include #include @@ -18,6 +25,8 @@ #define TARGET_HEIGHT (480) +WUPS_ALLOW_KERNEL() + void printVPADButtons(VPADStatus * buffer); WUPS_PLUGIN_NAME("Vpad input logger"); @@ -28,330 +37,60 @@ WUPS_PLUGIN_LICENSE("GPL"); IOSHandle handles[100]; -struct WUT_PACKED _ACPMetaData{ - char bootmovie[80696]; - char bootlogo[28604]; - void * test; +struct WUT_PACKED ACPMetaData { + char bootmovie[80696]; + char bootlogo[28604]; }; -struct WUT_PACKED _ACPMetaXml{ - uint64_t title_id; // 0x0C - uint64_t boss_id; // 0x0E - uint64_t os_version; // 0x0F - uint64_t app_size; // 0x10 - uint64_t common_save_size; // 0x11 - uint64_t account_save_size; // 0x12 - uint64_t common_boss_size; // 0x13 - uint64_t account_boss_size; // 0x14 - uint64_t join_game_mode_mask; // 0x17 - uint32_t version; // 0x01 - char product_code[32]; // AAAAA - char content_platform[32]; // BBBBB - char company_code[8]; // CCCCC - char mastering_date[32]; // DDDDD - uint32_t logo_type; // 0x02 - uint32_t app_launch_type; // 0x03 - uint32_t invisible_flag; // 0x04 - uint32_t no_managed_flag; // 0x05 - uint32_t no_event_log; // 0x06 - uint32_t no_icon_database; // 0x07 - uint32_t launching_flag; // 0x08 - uint32_t install_flag; // 0x09 - uint32_t closing_msg; // 0x0A - uint32_t title_version; // 0x0B - uint32_t group_id; // 0x0D - uint32_t save_no_rollback; // 0x15 - uint32_t bg_daemon_enable; //0x18 - uint32_t join_game_id; // 0x16 - uint32_t olv_accesskey; // 0x19 - uint32_t wood_tin; // 0x1A - uint32_t e_manual; // 0x1B - uint32_t e_manual_version; // 0x1C - uint32_t region; // 0x1D - uint32_t pc_cero; // 0x1E - uint32_t pc_esrb; // 0x1F - uint32_t pc_bbfc; // 0x20 - uint32_t pc_usk; // 0x21 - uint32_t pc_pegi_gen; // 0x22 - uint32_t pc_pegi_fin; // 0x23 - uint32_t pc_pegi_prt; // 0x24 - uint32_t pc_pegi_bbfc; // 0x25 - uint32_t pc_cob; // 0x26 - uint32_t pc_grb; // 0x27 - uint32_t pc_cgsrr; // 0x28 - uint32_t pc_oflc; // 0x29 - uint32_t pc_reserved0; // 0x2A - uint32_t pc_reserved1; // 0x2B - uint32_t pc_reserved2; // 0x2C - uint32_t pc_reserved3; // 0x2D - uint32_t ext_dev_nunchaku; // 0x2E - uint32_t ext_dev_classic; // 0x2F - uint32_t ext_dev_urcc; // 0x30 - uint32_t ext_dev_board; // 0x31 - uint32_t ext_dev_usb_keyboard; // 0x32 - uint32_t ext_dev_etc; // 0x33 - char ext_dev_etc_name[512]; // EEEE - uint32_t eula_version; // 0x34 - uint32_t drc_use; // 0x35 - uint32_t network_use; // 0x36 - uint32_t online_account_use; // 0x37 - uint32_t direct_boot; // 0x38 - uint32_t reserved_flag0; // 0x39 - uint32_t reserved_flag1; // 0x3A - uint32_t reserved_flag2; // 0x3B - uint32_t reserved_flag3; // 0x3C - uint32_t reserved_flag4; // 0x3D - uint32_t reserved_flag5; // 0x3E - uint32_t reserved_flag6; // 0x3F - uint32_t reserved_flag7; // 0x40 - char longname_ja[512]; // FF - char longname_en[512]; // HH - char longname_fr[512]; // II - char longname_de[512]; // JJ - char longname_it[512]; // KK - char longname_es[512]; // L - char longname_zhs[512]; // M - char longname_ko[512]; // N - char longname_nl[512]; // O - char longname_pt[512]; // P - char longname_ru[512]; // Q - char longname_zht[512]; // R - char shortname_ja[256]; // S - char shortname_en[256]; // T - char shortname_fr[256]; // U - char shortname_de[256]; // V - char shortname_it[256]; // W - char shortname_es[256]; // X - char shortname_zhs[256]; // Y - char shortname_ko[256]; // Z - char shortname_nl[256]; // 11 - char shortname_pt[256]; // 22 - char shortname_ru[256]; // 33 - char shortname_zht[256]; // 44 - char publisher_ja[256]; // 55 - char publisher_en[256]; // 66 - char publisher_fr[256]; // 77 - char publisher_de[256]; // 88 - char publisher_it[256]; // 99 - char publisher_es[256]; // 1010 - char publisher_zhs[256]; // 1212 - char publisher_ko[256]; // 1313 - char publisher_nl[256]; // 1414 - char publisher_pt[256]; // 1515 - char publisher_ru[256]; // 1616 - char publisher_zht[256]; // 1717 - uint32_t add_on_unique_id0; // 0x41 - uint32_t add_on_unique_id1; // 0x42 - uint32_t add_on_unique_id2; // 0x43 - uint32_t add_on_unique_id3; // 0x44 - uint32_t add_on_unique_id4; // 0x45 - uint32_t add_on_unique_id5; // 0x46 - uint32_t add_on_unique_id6; // 0x47 - uint32_t add_on_unique_id7; // 0x48 - uint32_t add_on_unique_id8; // 0x49 - uint32_t add_on_unique_id9; // 0x4A - uint32_t add_on_unique_id10; // 0x4B - uint32_t add_on_unique_id11; // 0x4C - uint32_t add_on_unique_id12; // 0x4D - uint32_t add_on_unique_id13; // 0x4E - uint32_t add_on_unique_id14; // 0x4F - uint32_t add_on_unique_id15; // 0x50 - uint32_t add_on_unique_id16; // 0x51 - uint32_t add_on_unique_id17; // 0x52 - uint32_t add_on_unique_id18; // 0x53 - uint32_t add_on_unique_id19; // 0x54 - uint32_t add_on_unique_id20; // 0x55 - uint32_t add_on_unique_id21; // 0x56 - uint32_t add_on_unique_id22; // 0x57 - uint32_t add_on_unique_id23; // 0x58 - uint32_t add_on_unique_id24; // 0x59 - uint32_t add_on_unique_id25; // 0x5A - uint32_t add_on_unique_id26; // 0x5B - uint32_t add_on_unique_id27; // 0x5C - uint32_t add_on_unique_id28; // 0x5D - uint32_t add_on_unique_id29; // 0x5E - uint32_t add_on_unique_id30; // 0x5F - uint32_t add_on_unique_id31; // 0x60 -}; -WUT_CHECK_OFFSET(_ACPMetaXml, 0x00, title_id); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x08, boss_id); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x10, os_version); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x18, app_size); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x20, common_save_size); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x28, account_save_size); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x30, common_boss_size); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x38, account_boss_size); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x40, join_game_mode_mask); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x48, version); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x4C, product_code); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x6C, content_platform); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x8C, company_code); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x94, mastering_date); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xB4, logo_type); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xB8, app_launch_type); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xBC, invisible_flag); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xC0, no_managed_flag); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xC4, no_event_log); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xC8, no_icon_database); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xCC, launching_flag); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xD0, install_flag); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xD4, closing_msg); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xD8, title_version); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xDC, group_id); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xE0, save_no_rollback); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xE4, bg_daemon_enable); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xE8, join_game_id); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xEC, olv_accesskey); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xF0, wood_tin); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xF4, e_manual); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xF8, e_manual_version); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xFC, region); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x100, pc_cero); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x104, pc_esrb); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x108, pc_bbfc); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x10C, pc_usk); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x110, pc_pegi_gen); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x114, pc_pegi_fin); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x118, pc_pegi_prt); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x11C, pc_pegi_bbfc); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x120, pc_cob); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x124, pc_grb); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x128, pc_cgsrr); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x12C, pc_oflc); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x130, pc_reserved0); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x134, pc_reserved1); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x138, pc_reserved2); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x13C, pc_reserved3); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x140, ext_dev_nunchaku); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x144, ext_dev_classic); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x148, ext_dev_urcc); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x14C, ext_dev_board); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x150, ext_dev_usb_keyboard); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x154, ext_dev_etc); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x158, ext_dev_etc_name); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x358, eula_version); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x35C, drc_use); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x360, network_use); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x364, online_account_use); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x368, direct_boot); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x36C, reserved_flag0); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x370, reserved_flag1); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x374, reserved_flag2); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x378, reserved_flag3); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x37C, reserved_flag4); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x380, reserved_flag5); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x384, reserved_flag6); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x388, reserved_flag7); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x38C, longname_ja); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x58C, longname_en); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x78C, longname_fr); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x98C, longname_de); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xB8C, longname_it); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xD8C, longname_es); -WUT_CHECK_OFFSET(_ACPMetaXml, 0xF8C, longname_zhs); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x118C, longname_ko); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x138C, longname_nl); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x158C, longname_pt); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x178C, longname_ru); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x198C, longname_zht); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x1B8C, shortname_ja); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x1C8C, shortname_en); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x1D8C, shortname_fr); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x1E8C, shortname_de); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x1F8C, shortname_it); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x208C, shortname_es); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x218C, shortname_zhs); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x228C, shortname_ko); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x238C, shortname_nl); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x248C, shortname_pt); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x258C, shortname_ru); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x268C, shortname_zht); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x278C, publisher_ja); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x288C, publisher_en); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x298C, publisher_fr); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x2A8C, publisher_de); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x2B8C, publisher_it); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x2C8C, publisher_es); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x2D8C, publisher_zhs); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x2E8C, publisher_ko); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x2F8C, publisher_nl); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x308C, publisher_pt); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x318C, publisher_ru); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x328C, publisher_zht); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x338C, add_on_unique_id0); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x3394, add_on_unique_id2); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x3398, add_on_unique_id3); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x339C, add_on_unique_id4); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33A0, add_on_unique_id5); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33A4, add_on_unique_id6); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33A8, add_on_unique_id7); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33AC, add_on_unique_id8); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33B0, add_on_unique_id9); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33B4, add_on_unique_id10); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33B8, add_on_unique_id11); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33BC, add_on_unique_id12); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33C0, add_on_unique_id13); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33C4, add_on_unique_id14); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33C8, add_on_unique_id15); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33CC, add_on_unique_id16); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33D0, add_on_unique_id17); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33D4, add_on_unique_id18); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33D8, add_on_unique_id19); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33DC, add_on_unique_id20); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33E0, add_on_unique_id21); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33E4, add_on_unique_id22); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33E8, add_on_unique_id23); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33EC, add_on_unique_id24); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33F0, add_on_unique_id25); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33F4, add_on_unique_id26); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33F8, add_on_unique_id27); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x33FC, add_on_unique_id28); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x3400, add_on_unique_id29); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x3404, add_on_unique_id30); -WUT_CHECK_OFFSET(_ACPMetaXml, 0x3408, add_on_unique_id31); -WUT_CHECK_SIZE(_ACPMetaXml,0x340C); extern "C" { - extern void __init_wut_malloc(); - extern void __fini_wut_malloc(); + extern void __init_wut_malloc(); + extern void __fini_wut_malloc(); } WUPS_FS_ACCESS() -MCPTitleListType my[25] __attribute__((section(".data"))); -MCPTitleListType template_title; +ACPMetaXml gLaunchXML __attribute__((section(".data"))); +MCPTitleListType template_title __attribute__((section(".data"))); +BOOL gHomebrewLaunched __attribute__((section(".data"))); + +INITIALIZE_PLUGIN() { + memset((void*) &template_title,0,sizeof(template_title)); + memset((void*) &gLaunchXML,0,sizeof(gLaunchXML)); + gHomebrewLaunched = FALSE; +} ON_APPLICATION_START(args) { __init_wut_malloc(); socket_lib_init(); log_init(); - DEBUG_FUNCTION_LINE("###############\n"); + + if(_SYSGetSystemApplicationTitleId(APP_ID_Updater) == OSGetTitleID()) { + gHomebrewLaunched = FALSE; + } } -ON_APPLICATION_ENDING(){ +ON_APPLICATION_ENDING() { __fini_wut_malloc(); - DEBUG_FUNCTION_LINE("###############\n"); } - +void fillXmlForTitleID(uint32_t titleid_upper, uint32_t titleid_lower, ACPMetaXml* out_buf) { + out_buf->title_id = ((uint64_t)titleid_upper * 0x100000000) + titleid_lower; + // TODO + char buffer [25]; + snprintf(buffer,25,"/custom/%08X%08X", titleid_upper,titleid_lower); + DEBUG_FUNCTION_LINE("%s\n",buffer); + strncpy(out_buf->longname_en,buffer,strlen(buffer)); + strncpy(out_buf->shortname_en,buffer,strlen(buffer)); +} + DECL_FUNCTION(int32_t, MCP_TitleList, uint32_t handle, uint32_t* outTitleCount, MCPTitleListType* titleList, uint32_t size) { int32_t result = real_MCP_TitleList(handle, outTitleCount, titleList, size); - //DEBUG_FUNCTION_LINE("%08X %08X %08X %08X = %08X\n",handle,*outTitleCount,titleList,size,result); - uint32_t titlecount = *outTitleCount; - - for(uint32_t i = 0;i