static int es_launchtitle(u64 titleID) { static u64 xtitleID __attribute__((aligned(32))); static u32 cntviews __attribute__((aligned(32))); static u8 tikviews[0xd8*4] __attribute__((aligned(32))); int ret; xtitleID = titleID; vecs[0].data = &xtitleID; vecs[0].len = 8; vecs[1].data = &cntviews; vecs[1].len = 4; ret = ios_ioctlv(es_fd, IOCTL_ES_GETVIEWCNT, 1, 1, vecs); if(ret<0) return ret; if(cntviews>4) return -1; vecs[2].data = tikviews; vecs[2].len = 0xd8*cntviews; ret = ios_ioctlv(es_fd, IOCTL_ES_GETVIEWS, 2, 1, vecs); if(ret<0) return ret; vecs[1].data = tikviews; vecs[1].len = 0xd8; ret = ios_ioctlvreboot(es_fd, IOCTL_ES_LAUNCH, 2, 0, vecs); return ret; }
static int sd_data_command(u32 cmd, u32 cmd_type, u32 resp_type, u32 arg, u32 block_count, u32 block_size, void *data, u32 unk1, u32 unk2, u32 *outreply, u32 reply_size) { u32 param[9]; u32 reply[4]; struct ioctlv vec[3]; int err; param[0] = cmd; param[1] = cmd_type; param[2] = resp_type; param[3] = arg; param[4] = block_count; param[5] = block_size; param[6] = (u32)data; param[7] = unk1; // ??? param[8] = unk2; // ??? vec[0].data = param; vec[0].len = sizeof param; vec[1].data = data; vec[1].len = block_count * block_size; vec[2].data = reply; vec[2].len = sizeof reply; err = ios_ioctlv(fd, 7, 2, 1, vec); if (reply_size) // ??? memcpy(outreply, reply, reply_size); return err; }
int di_openpartition(u32 offset, u8 *tmd) { static struct ioctlv vectors[16] ALIGNED(64); //memset(inbuf, 0, 0x20 ); inbuf[0x00] = 0x8B000000; inbuf[0x01] = offset; vectors[0].data = inbuf; vectors[0].len = 0x20; vectors[1].data = NULL; vectors[1].len = 0x2a4; vectors[2].data = NULL; vectors[2].len = 0; vectors[3].data = tmd; vectors[3].len = 0x49e4; vectors[4].data = outbuf; vectors[4].len = 0x20; return ios_ioctlv(di_fd, 0x8B, 3, 2, vectors); }