2020-10-14 13:54:25 +02:00
# include <coreinit/debug.h>
# include <whb/log.h>
# include <whb/log_udp.h>
2022-07-24 17:07:42 +02:00
# include <whb/proc.h>
2020-10-14 13:54:25 +02:00
2022-07-24 17:07:42 +02:00
# include "InstallerService.h"
# include "utils/WiiUScreen.h"
# include <input/CombinedInput.h>
# include <input/VPADInput.h>
# include <input/WPADInput.h>
2020-10-14 13:54:25 +02:00
# include <iosuhax.h>
# include <iosuhax_devoptab.h>
# include <string_view>
# include "../build/safe_payload.h"
2022-07-24 17:07:42 +02:00
# include "ApplicationState.h"
2020-10-14 13:54:25 +02:00
constexpr bool strings_equal ( char const * a , char const * b ) {
return std : : string_view ( a ) = = b ;
}
2021-10-17 15:26:25 +02:00
static_assert ( strings_equal ( RPX_HASH , " 1736574cf6c949557aed0c817eb1927e35a9b820 " ) , " Built with an untested root.rpx! Remove this check if you really know what you're doing. " ) ;
2020-10-14 13:54:25 +02:00
void initIOSUHax ( ) ;
void deInitIOSUHax ( ) ;
2022-07-24 17:07:42 +02:00
int sFSAFd = - 1 ;
2020-10-14 13:54:25 +02:00
bool sIosuhaxMount = false ;
int main_loop ( ) {
DEBUG_FUNCTION_LINE ( " Creating state " ) ;
ApplicationState state ;
2021-10-17 15:26:25 +02:00
CombinedInput baseInput ;
2020-12-02 23:37:31 +01:00
VPadInput vpadInput ;
WPADInput wpadInputs [ 4 ] = {
2021-10-17 15:26:25 +02:00
WPAD_CHAN_0 ,
WPAD_CHAN_1 ,
WPAD_CHAN_2 ,
2022-07-24 17:07:42 +02:00
WPAD_CHAN_3 } ;
2020-10-14 13:54:25 +02:00
if ( sFSAFd < 0 | | ! sIosuhaxMount ) {
state . setError ( ApplicationState : : eErrorState : : ERROR_IOSUHAX_FAILED ) ;
}
DEBUG_FUNCTION_LINE ( " Entering main loop " ) ;
while ( WHBProcIsRunning ( ) ) {
2021-10-17 15:26:25 +02:00
baseInput . reset ( ) ;
if ( vpadInput . update ( 1280 , 720 ) ) {
baseInput . combine ( vpadInput ) ;
2020-12-02 23:37:31 +01:00
}
2022-07-24 17:07:42 +02:00
for ( auto & wpadInput : wpadInputs ) {
2021-10-17 15:26:25 +02:00
if ( wpadInput . update ( 1280 , 720 ) ) {
baseInput . combine ( wpadInput ) ;
}
}
baseInput . process ( ) ;
state . update ( & baseInput ) ;
2020-10-14 13:54:25 +02:00
state . render ( ) ;
}
return 0 ;
}
int main ( int argc , char * * argv ) {
WHBLogUdpInit ( ) ;
2021-12-26 15:03:22 +01:00
DEBUG_FUNCTION_LINE ( " Hello from PayloadLoader Installer! " ) ;
2020-10-14 13:54:25 +02:00
WHBProcInit ( ) ;
WiiUScreen : : Init ( ) ;
initIOSUHax ( ) ;
2020-12-02 23:37:31 +01:00
WPADInput : : init ( ) ;
2020-10-14 13:54:25 +02:00
main_loop ( ) ;
2020-12-02 23:37:31 +01:00
WPADInput : : close ( ) ;
2020-10-14 13:54:25 +02:00
deInitIOSUHax ( ) ;
WiiUScreen : : DeInit ( ) ;
WHBProcShutdown ( ) ;
return 0 ;
}
void initIOSUHax ( ) {
sIosuhaxMount = false ;
2022-07-24 17:07:42 +02:00
int res = IOSUHAX_Open ( nullptr ) ;
2020-10-14 13:54:25 +02:00
if ( res < 0 ) {
DEBUG_FUNCTION_LINE ( " IOSUHAX_open failed " ) ;
OSFatal ( " IOSUHAX_open failed, please start this installer with an CFW " ) ;
} else {
sIosuhaxMount = true ;
2022-07-24 17:07:42 +02:00
sFSAFd = IOSUHAX_FSA_Open ( ) ;
2020-10-14 13:54:25 +02:00
if ( sFSAFd < 0 ) {
DEBUG_FUNCTION_LINE ( " IOSUHAX_FSA_Open failed " ) ;
} else {
mount_fs ( " storage_slc_installer " , sFSAFd , nullptr , " /vol/system " ) ;
mount_fs ( " storage_mlc_installer " , sFSAFd , nullptr , " /vol/storage_mlc01 " ) ;
}
DEBUG_FUNCTION_LINE ( " IOSUHAX done " ) ;
}
}
void deInitIOSUHax ( ) {
if ( sIosuhaxMount ) {
unmount_fs ( " storage_slc_installer " ) ;
unmount_fs ( " storage_mlc_installer " ) ;
if ( sFSAFd > = 0 ) {
IOSUHAX_FSA_Close ( sFSAFd ) ;
}
IOSUHAX_Close ( ) ;
}
}