Hopefully fix initExternalStorage

This commit is contained in:
Maschell 2021-12-27 22:36:23 +01:00
parent 2daa9d437f
commit f05f1a2420

View File

@ -12,6 +12,8 @@
#include <nn/sl/LaunchInfoDatabase.h> #include <nn/sl/LaunchInfoDatabase.h>
#include <nn/ccr/sys_caffeine.h> #include <nn/ccr/sys_caffeine.h>
#include <coreinit/dynload.h>
#include <nn/act/client_cpp.h> #include <nn/act/client_cpp.h>
#include "hbl_install.h" #include "hbl_install.h"
#include "utils.h" #include "utils.h"
@ -21,11 +23,6 @@
#include <whb/log_udp.h> #include <whb/log_udp.h>
#include <whb/log_cafe.h> #include <whb/log_cafe.h>
extern "C" void Initialize__Q2_2nn3spmFv();
extern "C" void SetAutoFatal__Q2_2nn3spmFb(bool);
extern "C" void SetExtendedStorage__Q2_2nn3spmFQ3_2nn3spm12StorageIndex(int*);
extern "C" void SetDefaultExtendedStorageVolumeId__Q2_2nn3spmFRCQ3_2nn3spm8VolumeId(int*);
bool getQuickBoot() { bool getQuickBoot() {
auto bootCheck = CCRSysCaffeineBootCheck(); auto bootCheck = CCRSysCaffeineBootCheck();
if (bootCheck == 0) { if (bootCheck == 0) {
@ -72,7 +69,7 @@ bool getQuickBoot() {
return false; return false;
} }
if(!SYSCheckTitleExists(info.titleId)) { if(!SYSCheckTitleExists(info.titleId)) {
DEBUG_FUNCTION_LINE("Title %016lLX doesn't exist", info.titleId); DEBUG_FUNCTION_LINE("Title %016llX doesn't exist", info.titleId);
return false; return false;
} }
@ -107,17 +104,70 @@ bool getQuickBoot() {
return false; return false;
} }
struct WUT_PACKED VolumeInfo
{
WUT_UNKNOWN_BYTES(0xAC);
char volumeId[16];
WUT_UNKNOWN_BYTES(0x100);
};
WUT_CHECK_OFFSET(VolumeInfo, 0xAC, volumeId);
WUT_CHECK_SIZE(VolumeInfo, 444);
extern "C" uint32_t FSGetVolumeInfo(FSClient*, FSCmdBlock*, const char* path, VolumeInfo* data, FSErrorFlag errorMask);
extern "C" void Initialize__Q2_2nn3spmFv();
extern "C" void SetAutoFatal__Q2_2nn3spmFb(bool);
extern "C" void SetExtendedStorage__Q2_2nn3spmFQ3_2nn3spm12StorageIndex(uint64_t*);
extern "C" void SetDefaultExtendedStorageVolumeId__Q2_2nn3spmFRCQ3_2nn3spm8VolumeId(char *);
extern "C" uint32_t FindStorageByVolumeId__Q2_2nn3spmFPQ3_2nn3spm12StorageIndexRCQ3_2nn3spm8VolumeId(uint64_t *, char *);
static void initExternalStorage(void) { static void initExternalStorage(void) {
Initialize__Q2_2nn3spmFv(); Initialize__Q2_2nn3spmFv();
SetAutoFatal__Q2_2nn3spmFb(false);
int storageIndex[2]{}; FSCmdBlock cmdBlock;
SetExtendedStorage__Q2_2nn3spmFQ3_2nn3spm12StorageIndex(storageIndex); FSInitCmdBlock(&cmdBlock);
int volumeId[4]{}; VolumeInfo volumeInfo;
SetDefaultExtendedStorageVolumeId__Q2_2nn3spmFRCQ3_2nn3spm8VolumeId(volumeId);
auto *fsClient = (FSClient *) memalign(0x40, sizeof(FSClient));
memset(fsClient, 0, sizeof(*fsClient));
FSAddClient(fsClient, FS_ERROR_FLAG_NONE);
char volumePaths[][19] =
{ "/vol/storage_usb01",
"/vol/storage_usb02",
"/vol/storage_usb03",
};
bool found = false;
for(auto path : volumePaths) {
DEBUG_FUNCTION_LINE("Check if %s is connected", path);
if(FSGetVolumeInfo(fsClient, &cmdBlock, path, &volumeInfo, FS_ERROR_FLAG_ALL) == 0){
DEBUG_FUNCTION_LINE("Set DefaultExtendedStorage to %s", volumeInfo.volumeId);
SetDefaultExtendedStorageVolumeId__Q2_2nn3spmFRCQ3_2nn3spm8VolumeId(volumeInfo.volumeId);
uint64_t storageIndex = 0;
FindStorageByVolumeId__Q2_2nn3spmFPQ3_2nn3spm12StorageIndexRCQ3_2nn3spm8VolumeId(&storageIndex, volumeInfo.volumeId);
SetExtendedStorage__Q2_2nn3spmFQ3_2nn3spm12StorageIndex(&storageIndex);
found = true;
break;
}
}
if (!found) {
DEBUG_FUNCTION_LINE("Fallback to empty ExtendedStorage");
char empty[16];
empty[0] = '\0';
SetDefaultExtendedStorageVolumeId__Q2_2nn3spmFRCQ3_2nn3spm8VolumeId(empty);
uint64_t storageIndex = 0;
SetExtendedStorage__Q2_2nn3spmFQ3_2nn3spm12StorageIndex(&storageIndex);
}
FSDelClient(fsClient, FS_ERROR_FLAG_ALL);
} }
void bootHomebrewLauncher(void) { void bootHomebrewLauncher(void) {
uint64_t titleId = _SYSGetSystemApplicationTitleId(SYSTEM_APP_ID_MII_MAKER); uint64_t titleId = _SYSGetSystemApplicationTitleId(SYSTEM_APP_ID_MII_MAKER);
_SYSLaunchTitleWithStdArgsInNoSplash(titleId, nullptr); _SYSLaunchTitleWithStdArgsInNoSplash(titleId, nullptr);
@ -131,6 +181,7 @@ int main(int argc, char **argv) {
WHBLogCafeInit(); WHBLogCafeInit();
WHBLogUdpInit(); WHBLogUdpInit();
} }
initExternalStorage(); initExternalStorage();
InstallHBL(); InstallHBL();