2018-02-06 13:30:13 -08:00

44 lines
1.3 KiB
C

#include <3ds.h>
#include "cia.h"
#include "smdh.h"
#include "tmd.h"
#include "../error.h"
u64 cia_get_title_id(u8* cia) {
u32 headerSize = ((*(u32*) &cia[0x00]) + 0x3F) & ~0x3F;
u32 certSize = ((*(u32*) &cia[0x08]) + 0x3F) & ~0x3F;
u32 ticketSize = ((*(u32*) &cia[0x0C]) + 0x3F) & ~0x3F;
u8* tmd = &cia[headerSize + certSize + ticketSize];
return tmd_get_title_id(tmd);
}
Result cia_file_get_smdh(SMDH* smdh, Handle handle) {
Result res = 0;
if(smdh != NULL) {
u32 bytesRead = 0;
u32 header[8];
if(R_SUCCEEDED(res = FSFILE_Read(handle, &bytesRead, 0, header, sizeof(header))) && bytesRead == sizeof(header)) {
u32 headerSize = (header[0] + 0x3F) & ~0x3F;
u32 certSize = (header[2] + 0x3F) & ~0x3F;
u32 ticketSize = (header[3] + 0x3F) & ~0x3F;
u32 tmdSize = (header[4] + 0x3F) & ~0x3F;
u32 metaSize = (header[5] + 0x3F) & ~0x3F;
u64 contentSize = ((header[6] | ((u64) header[7] << 32)) + 0x3F) & ~0x3F;
if(metaSize >= 0x3AC0) {
res = FSFILE_Read(handle, &bytesRead, headerSize + certSize + ticketSize + tmdSize + contentSize + 0x400, smdh, sizeof(SMDH));
} else {
res = R_APP_BAD_DATA;
}
}
} else {
res = R_APP_INVALID_ARGUMENT;
}
return res;
}