mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-27 00:00:07 -06:00
actually patch TSC shit
This commit is contained in:
119
src/DSi_NAND.cpp
119
src/DSi_NAND.cpp
@ -96,10 +96,6 @@ u32 ReadFATBlock(u64 addr, u32 len, u8* buf)
|
|||||||
|
|
||||||
for (u32 i = 0; i < len; i += 16)
|
for (u32 i = 0; i < len; i += 16)
|
||||||
{
|
{
|
||||||
//printf("BLOCK %d: IV=", i);
|
|
||||||
//for (int k = 0; k < 16; k++) printf("%02X:", ctx.Iv[k]);
|
|
||||||
//printf("\n");
|
|
||||||
|
|
||||||
u8 tmp[16];
|
u8 tmp[16];
|
||||||
DSi_AES::Swap16(tmp, &buf[i]);
|
DSi_AES::Swap16(tmp, &buf[i]);
|
||||||
AES_CTR_xcrypt_buffer(&ctx, tmp, 16);
|
AES_CTR_xcrypt_buffer(&ctx, tmp, 16);
|
||||||
@ -109,11 +105,37 @@ u32 ReadFATBlock(u64 addr, u32 len, u8* buf)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 WriteFATBlock(u64 addr, u32 len, u8* buf)
|
||||||
|
{
|
||||||
|
u32 ctr = (u32)(addr >> 4);
|
||||||
|
|
||||||
|
AES_ctx ctx;
|
||||||
|
SetupFATCrypto(&ctx, ctr);
|
||||||
|
|
||||||
|
fseek(DSi::SDMMCFile, addr, SEEK_SET);
|
||||||
|
|
||||||
|
for (u32 s = 0; s < len; s += 0x200)
|
||||||
|
{
|
||||||
|
u8 tempbuf[0x200];
|
||||||
|
|
||||||
|
for (u32 i = 0; i < 0x200; i += 16)
|
||||||
|
{
|
||||||
|
u8 tmp[16];
|
||||||
|
DSi_AES::Swap16(tmp, &buf[s+i]);
|
||||||
|
AES_CTR_xcrypt_buffer(&ctx, tmp, 16);
|
||||||
|
DSi_AES::Swap16(&tempbuf[i], tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 res = fwrite(tempbuf, len, 1, DSi::SDMMCFile);
|
||||||
|
if (!res) return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
UINT FF_ReadNAND(BYTE* buf, LBA_t sector, UINT num)
|
UINT FF_ReadNAND(BYTE* buf, LBA_t sector, UINT num)
|
||||||
{
|
{
|
||||||
printf("READ %08X %08X\n", sector, num);
|
|
||||||
|
|
||||||
// TODO: allow selecting other partitions?
|
// TODO: allow selecting other partitions?
|
||||||
u64 baseaddr = 0x10EE00;
|
u64 baseaddr = 0x10EE00;
|
||||||
|
|
||||||
@ -125,49 +147,72 @@ UINT FF_ReadNAND(BYTE* buf, LBA_t sector, UINT num)
|
|||||||
|
|
||||||
UINT FF_WriteNAND(BYTE* buf, LBA_t sector, UINT num)
|
UINT FF_WriteNAND(BYTE* buf, LBA_t sector, UINT num)
|
||||||
{
|
{
|
||||||
// TODO!
|
// TODO: allow selecting other partitions?
|
||||||
printf("!! WRITE %08X %08X\n", sector, num);
|
u64 baseaddr = 0x10EE00;
|
||||||
return 0;
|
|
||||||
|
u64 blockaddr = baseaddr + (sector * 0x200ULL);
|
||||||
|
|
||||||
|
u32 res = WriteFATBlock(blockaddr, num*0x200, buf);
|
||||||
|
return res >> 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PatchTSC()
|
void PatchTSC()
|
||||||
{
|
{
|
||||||
// TEST ZONE
|
|
||||||
|
|
||||||
u8 dorp[0x200];
|
|
||||||
ReadFATBlock(0, 0x200, dorp);
|
|
||||||
|
|
||||||
for (int i = 0; i < 0x200; i+=16)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < 16; j++)
|
|
||||||
{
|
|
||||||
printf("%02X ", dorp[i+j]);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
ReadFATBlock(0x0010EE00, 0x200, dorp);
|
|
||||||
printf("FUKA\n");
|
|
||||||
for (int i = 0; i < 0x200; i+=16)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < 16; j++)
|
|
||||||
{
|
|
||||||
printf("%02X ", dorp[i+j]);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
ff_disk_open(FF_ReadNAND, FF_WriteNAND);
|
ff_disk_open(FF_ReadNAND, FF_WriteNAND);
|
||||||
|
|
||||||
FRESULT res;
|
FRESULT res;
|
||||||
FATFS fs;
|
FATFS fs;
|
||||||
res = f_mount(&fs, "0:", 0);
|
res = f_mount(&fs, "0:", 0);
|
||||||
printf("mount=%d\n", res);
|
if (res != FR_OK)
|
||||||
|
{
|
||||||
|
printf("NAND mounting failed: %d\n", res);
|
||||||
|
goto mount_fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
char filename[64];
|
||||||
|
sprintf(filename, "0:/shared1/TWLCFG%d.dat", i);
|
||||||
|
|
||||||
FIL file;
|
FIL file;
|
||||||
res = f_open(&file, "0:/shared1/TWLCFG0.dat", FA_READ);
|
res = f_open(&file, filename, FA_OPEN_EXISTING | FA_READ | FA_WRITE);
|
||||||
printf("blarg=%d\n", res);
|
if (res != FR_OK)
|
||||||
|
{
|
||||||
|
printf("NAND: editing file %s failed: %d\n", filename, res);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 contents[0x1B0];
|
||||||
|
u32 nres;
|
||||||
|
f_lseek(&file, 0);
|
||||||
|
f_read(&file, contents, 0x1B0, &nres);
|
||||||
|
|
||||||
|
// fix touchscreen coords
|
||||||
|
*(u16*)&contents[0xB8] = 0;
|
||||||
|
*(u16*)&contents[0xBA] = 0;
|
||||||
|
contents[0xBC] = 0;
|
||||||
|
contents[0xBD] = 0;
|
||||||
|
*(u16*)&contents[0xBE] = 255<<4;
|
||||||
|
*(u16*)&contents[0xC0] = 191<<4;
|
||||||
|
contents[0xC2] = 255;
|
||||||
|
contents[0xC3] = 191;
|
||||||
|
|
||||||
|
SHA1_CTX sha;
|
||||||
|
u8 datahash[20];
|
||||||
|
SHA1Init(&sha);
|
||||||
|
SHA1Update(&sha, &contents[0x88], 0x128);
|
||||||
|
SHA1Final(&contents[0], &sha);
|
||||||
|
|
||||||
|
f_lseek(&file, 0);
|
||||||
|
f_write(&file, contents, 0x1B0, &nres);
|
||||||
|
|
||||||
|
f_close(&file);
|
||||||
|
}
|
||||||
|
|
||||||
|
mount_fail:
|
||||||
|
f_unmount("0:");
|
||||||
|
ff_disk_close();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user