mirror of
https://github.com/CTCaer/hekate
synced 2024-09-07 16:49:00 +00:00
nyx: Use mbr context for emuMMC partition
This commit is contained in:
parent
ae656a0f81
commit
6236b0ab00
|
@ -35,8 +35,15 @@ extern bool sd_mount();
|
||||||
extern void sd_unmount(bool deinit);
|
extern void sd_unmount(bool deinit);
|
||||||
extern void emmcsn_path_impl(char *path, char *sub_dir, char *filename, sdmmc_storage_t *storage);
|
extern void emmcsn_path_impl(char *path, char *sub_dir, char *filename, sdmmc_storage_t *storage);
|
||||||
|
|
||||||
static int part_idx;
|
typedef struct _mbr_ctxt_t
|
||||||
static u32 sector_start;
|
{
|
||||||
|
u32 available;
|
||||||
|
u32 sector[3];
|
||||||
|
int part_idx;
|
||||||
|
u32 sector_start;
|
||||||
|
} mbr_ctxt_t;
|
||||||
|
|
||||||
|
static mbr_ctxt_t mbr_ctx;
|
||||||
|
|
||||||
static void _create_window_emummc()
|
static void _create_window_emummc()
|
||||||
{
|
{
|
||||||
|
@ -118,10 +125,10 @@ static void _create_window_emummc()
|
||||||
lv_obj_align(label_finish, bar, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI * 9 / 20);
|
lv_obj_align(label_finish, bar, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI * 9 / 20);
|
||||||
emmc_tool_gui_ctxt.label_finish = label_finish;
|
emmc_tool_gui_ctxt.label_finish = label_finish;
|
||||||
|
|
||||||
if (!part_idx)
|
if (!mbr_ctx.part_idx)
|
||||||
dump_emummc_file(&emmc_tool_gui_ctxt);
|
dump_emummc_file(&emmc_tool_gui_ctxt);
|
||||||
else
|
else
|
||||||
dump_emummc_raw(&emmc_tool_gui_ctxt, part_idx, sector_start);
|
dump_emummc_raw(&emmc_tool_gui_ctxt, mbr_ctx.part_idx, mbr_ctx.sector_start);
|
||||||
|
|
||||||
nyx_window_toggle_buttons(win, false);
|
nyx_window_toggle_buttons(win, false);
|
||||||
}
|
}
|
||||||
|
@ -138,8 +145,8 @@ static lv_res_t _create_emummc_raw_action(lv_obj_t * btns, const char * txt)
|
||||||
_create_window_emummc();
|
_create_window_emummc();
|
||||||
}
|
}
|
||||||
|
|
||||||
part_idx = 0;
|
mbr_ctx.part_idx = 0;
|
||||||
sector_start = 0;
|
mbr_ctx.sector_start = 0;
|
||||||
|
|
||||||
mbox_action(btns, txt);
|
mbox_action(btns, txt);
|
||||||
|
|
||||||
|
@ -161,6 +168,8 @@ static void _create_mbox_emummc_raw()
|
||||||
char *txt_buf = (char *)malloc(0x500);
|
char *txt_buf = (char *)malloc(0x500);
|
||||||
mbr_t *mbr = (mbr_t *)malloc(sizeof(mbr_t));
|
mbr_t *mbr = (mbr_t *)malloc(sizeof(mbr_t));
|
||||||
|
|
||||||
|
memset(&mbr_ctx, 0, sizeof(mbr_ctxt_t));
|
||||||
|
|
||||||
sd_mount();
|
sd_mount();
|
||||||
sdmmc_storage_read(&sd_storage, 0, 1, mbr);
|
sdmmc_storage_read(&sd_storage, 0, 1, mbr);
|
||||||
sd_unmount(false);
|
sd_unmount(false);
|
||||||
|
@ -176,15 +185,15 @@ static void _create_mbox_emummc_raw()
|
||||||
u8 type = mbr->partitions[i].type;
|
u8 type = mbr->partitions[i].type;
|
||||||
if ((curr_part_size >= (storage.sec_cnt + 0xC000)) && sector_start && type != 0x83) //! TODO: For now it skips linux partitions.
|
if ((curr_part_size >= (storage.sec_cnt + 0xC000)) && sector_start && type != 0x83) //! TODO: For now it skips linux partitions.
|
||||||
{
|
{
|
||||||
part_idx = i;
|
mbr_ctx.part_idx = i;
|
||||||
sector_start += 0x8000;
|
mbr_ctx.sector_start += 0x8000;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sdmmc_storage_end(&storage);
|
sdmmc_storage_end(&storage);
|
||||||
|
|
||||||
if (part_idx)
|
if (mbr_ctx.part_idx)
|
||||||
{
|
{
|
||||||
s_printf(txt_buf,
|
s_printf(txt_buf,
|
||||||
"#C7EA46 Found applicable partition: [Part %d]!#\n"
|
"#C7EA46 Found applicable partition: [Part %d]!#\n"
|
||||||
|
@ -209,7 +218,7 @@ static void _create_mbox_emummc_raw()
|
||||||
free(txt_buf);
|
free(txt_buf);
|
||||||
free(mbr);
|
free(mbr);
|
||||||
|
|
||||||
if (part_idx)
|
if (mbr_ctx.part_idx)
|
||||||
lv_mbox_add_btns(mbox, mbox_btn_map, _create_emummc_raw_action);
|
lv_mbox_add_btns(mbox, mbox_btn_map, _create_emummc_raw_action);
|
||||||
else
|
else
|
||||||
lv_mbox_add_btns(mbox, mbox_btn_map2, mbox_action);
|
lv_mbox_add_btns(mbox, mbox_btn_map2, mbox_action);
|
||||||
|
@ -223,8 +232,8 @@ static lv_res_t _create_emummc_action(lv_obj_t * btns, const char * txt)
|
||||||
int btn_idx = lv_btnm_get_pressed(btns);
|
int btn_idx = lv_btnm_get_pressed(btns);
|
||||||
lv_obj_t *bg = lv_obj_get_parent(lv_obj_get_parent(btns));
|
lv_obj_t *bg = lv_obj_get_parent(lv_obj_get_parent(btns));
|
||||||
|
|
||||||
part_idx = 0;
|
mbr_ctx.part_idx = 0;
|
||||||
sector_start = 0;
|
mbr_ctx.sector_start = 0;
|
||||||
|
|
||||||
switch (btn_idx)
|
switch (btn_idx)
|
||||||
{
|
{
|
||||||
|
@ -279,7 +288,7 @@ static void _change_raw_emummc_part_type()
|
||||||
|
|
||||||
static void _migrate_sd_raw_based()
|
static void _migrate_sd_raw_based()
|
||||||
{
|
{
|
||||||
sector_start = 2;
|
mbr_ctx.sector_start = 2;
|
||||||
|
|
||||||
sd_mount();
|
sd_mount();
|
||||||
f_mkdir("emuMMC");
|
f_mkdir("emuMMC");
|
||||||
|
@ -288,17 +297,17 @@ static void _migrate_sd_raw_based()
|
||||||
f_rename("Emutendo", "emuMMC/ER00/Nintendo");
|
f_rename("Emutendo", "emuMMC/ER00/Nintendo");
|
||||||
FIL fp;
|
FIL fp;
|
||||||
f_open(&fp, "emuMMC/ER00/raw_based", FA_CREATE_ALWAYS | FA_WRITE);
|
f_open(&fp, "emuMMC/ER00/raw_based", FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
f_write(&fp, §or_start, 4, NULL);
|
f_write(&fp, &mbr_ctx.sector_start, 4, NULL);
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
|
|
||||||
save_emummc_cfg(1, sector_start, "emuMMC/ER00");
|
save_emummc_cfg(1, mbr_ctx.sector_start, "emuMMC/ER00");
|
||||||
sd_unmount(false);
|
sd_unmount(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _migrate_sd_raw_emummc_based()
|
static void _migrate_sd_raw_emummc_based()
|
||||||
{
|
{
|
||||||
char *tmp = (char *)malloc(0x80);
|
char *tmp = (char *)malloc(0x80);
|
||||||
s_printf(tmp, "emuMMC/RAW%d", part_idx);
|
s_printf(tmp, "emuMMC/RAW%d", mbr_ctx.part_idx);
|
||||||
|
|
||||||
sd_mount();
|
sd_mount();
|
||||||
f_mkdir("emuMMC");
|
f_mkdir("emuMMC");
|
||||||
|
@ -308,15 +317,15 @@ static void _migrate_sd_raw_emummc_based()
|
||||||
FIL fp;
|
FIL fp;
|
||||||
if (!f_open(&fp, tmp, FA_CREATE_ALWAYS | FA_WRITE))
|
if (!f_open(&fp, tmp, FA_CREATE_ALWAYS | FA_WRITE))
|
||||||
{
|
{
|
||||||
f_write(&fp, §or_start, 4, NULL);
|
f_write(&fp, &mbr_ctx.sector_start, 4, NULL);
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
s_printf(tmp, "emuMMC/RAW%d", part_idx);
|
s_printf(tmp, "emuMMC/RAW%d", mbr_ctx.part_idx);
|
||||||
|
|
||||||
_change_raw_emummc_part_type();
|
_change_raw_emummc_part_type();
|
||||||
|
|
||||||
save_emummc_cfg(part_idx, sector_start, tmp);
|
save_emummc_cfg(mbr_ctx.part_idx, mbr_ctx.sector_start, tmp);
|
||||||
|
|
||||||
free(tmp);
|
free(tmp);
|
||||||
|
|
||||||
|
@ -421,8 +430,8 @@ static lv_res_t _create_emummc_mig1_action(lv_obj_t * btns, const char * txt)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
part_idx = 0;
|
mbr_ctx.part_idx = 0;
|
||||||
sector_start = 0;
|
mbr_ctx.sector_start = 0;
|
||||||
|
|
||||||
mbox_action(btns, txt);
|
mbox_action(btns, txt);
|
||||||
|
|
||||||
|
@ -438,8 +447,8 @@ static lv_res_t _create_emummc_mig0_action(lv_obj_t * btns, const char * txt)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
part_idx = 0;
|
mbr_ctx.part_idx = 0;
|
||||||
sector_start = 0;
|
mbr_ctx.sector_start = 0;
|
||||||
|
|
||||||
mbox_action(btns, txt);
|
mbox_action(btns, txt);
|
||||||
|
|
||||||
|
@ -455,8 +464,8 @@ static lv_res_t _create_emummc_mig2_action(lv_obj_t * btns, const char * txt)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
part_idx = 0;
|
mbr_ctx.part_idx = 0;
|
||||||
sector_start = 0;
|
mbr_ctx.sector_start = 0;
|
||||||
|
|
||||||
mbox_action(btns, txt);
|
mbox_action(btns, txt);
|
||||||
|
|
||||||
|
@ -472,8 +481,8 @@ static lv_res_t _create_emummc_mig3_action(lv_obj_t * btns, const char * txt)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
part_idx = 0;
|
mbr_ctx.part_idx = 0;
|
||||||
sector_start = 0;
|
mbr_ctx.sector_start = 0;
|
||||||
|
|
||||||
mbox_action(btns, txt);
|
mbox_action(btns, txt);
|
||||||
|
|
||||||
|
@ -489,8 +498,8 @@ static lv_res_t _create_emummc_mig4_action(lv_obj_t * btns, const char * txt)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
part_idx = 0;
|
mbr_ctx.part_idx = 0;
|
||||||
sector_start = 0;
|
mbr_ctx.sector_start = 0;
|
||||||
|
|
||||||
mbox_action(btns, txt);
|
mbox_action(btns, txt);
|
||||||
|
|
||||||
|
@ -527,29 +536,29 @@ static lv_res_t _create_mbox_emummc_migrate(lv_obj_t *btn)
|
||||||
bool emummc = false;
|
bool emummc = false;
|
||||||
bool file_based = false;
|
bool file_based = false;
|
||||||
bool em = false;
|
bool em = false;
|
||||||
sector_start = 0;
|
mbr_ctx.sector_start = 0;
|
||||||
part_idx = 0;
|
mbr_ctx.part_idx = 0;
|
||||||
|
|
||||||
for (int i = 1; i < 4; i++)
|
for (int i = 1; i < 4; i++)
|
||||||
{
|
{
|
||||||
sector_start = mbr->partitions[i].start_sct;
|
mbr_ctx.sector_start = mbr->partitions[i].start_sct;
|
||||||
if (sector_start)
|
if (mbr_ctx.sector_start)
|
||||||
{
|
{
|
||||||
sdmmc_storage_read(&sd_storage, sector_start + 0xC001, 1, efi_part);
|
sdmmc_storage_read(&sd_storage, mbr_ctx.sector_start + 0xC001, 1, efi_part);
|
||||||
if (!memcmp(efi_part, "EFI PART", 8))
|
if (!memcmp(efi_part, "EFI PART", 8))
|
||||||
{
|
{
|
||||||
sector_start += 0x8000;
|
mbr_ctx.sector_start += 0x8000;
|
||||||
emummc = true;
|
emummc = true;
|
||||||
part_idx = i;
|
mbr_ctx.part_idx = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sdmmc_storage_read(&sd_storage, sector_start + 0x4001, 1, efi_part);
|
sdmmc_storage_read(&sd_storage, mbr_ctx.sector_start + 0x4001, 1, efi_part);
|
||||||
if (!memcmp(efi_part, "EFI PART", 8))
|
if (!memcmp(efi_part, "EFI PART", 8))
|
||||||
{
|
{
|
||||||
emummc = true;
|
emummc = true;
|
||||||
part_idx = i;
|
mbr_ctx.part_idx = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -558,7 +567,7 @@ static lv_res_t _create_mbox_emummc_migrate(lv_obj_t *btn)
|
||||||
|
|
||||||
//! TODO: What about unallocated
|
//! TODO: What about unallocated
|
||||||
|
|
||||||
if (!part_idx)
|
if (!mbr_ctx.part_idx)
|
||||||
{
|
{
|
||||||
sdmmc_storage_read(&sd_storage, 0x4003, 1, efi_part);
|
sdmmc_storage_read(&sd_storage, 0x4003, 1, efi_part);
|
||||||
if (!memcmp(efi_part, "EFI PART", 8))
|
if (!memcmp(efi_part, "EFI PART", 8))
|
||||||
|
|
Loading…
Reference in a new issue