Example #1
0
static Result action_install_cdn_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
    install_cdn_data* installData = (install_cdn_data*) data;

    if(index == 0) {
        static u32 dataOffsets[6] = {0x240, 0x140, 0x80, 0x240, 0x140, 0x80};

        u8* tmd = (u8*) initialReadBlock;
        u8 sigType = tmd[0x03];

        installData->contentCount = __builtin_bswap16(*(u16*) &tmd[dataOffsets[sigType] + 0x9E]);
        if(installData->contentCount > CONTENTS_MAX) {
            return MAKERESULT(RL_PERMANENT, RS_INVALIDARG, RM_APPLICATION, RD_OUT_OF_RANGE);
        }

        for(u32 i = 0; i < installData->contentCount; i++) {
            u8* contentChunk = &tmd[dataOffsets[sigType] + 0x9C4 + (i * 0x30)];

            installData->contentIds[i] = __builtin_bswap32(*(u32*) &contentChunk[0x00]);
            installData->contentIndices[i] = __builtin_bswap16(*(u16*) &contentChunk[0x04]);
        }

        installData->installInfo.total += installData->contentCount;

        return AM_InstallTmdBegin(handle);
    } else {
        return AM_InstallContentBegin(handle, installData->contentIndices[index - 1]);
    }
}
Example #2
0
static Result action_install_cdn_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) {
    install_cdn_data* installData = (install_cdn_data*) data;

    if(index == 0) {
        installData->contentCount = util_get_tmd_content_count((u8*) initialReadBlock);
        if(installData->contentCount > CONTENTS_MAX) {
            return R_FBI_OUT_OF_RANGE;
        }

        for(u32 i = 0; i < installData->contentCount; i++) {
            u8* contentChunk = util_get_tmd_content_chunk((u8*) initialReadBlock, i);

            installData->contentIds[i] = __builtin_bswap32(*(u32*) &contentChunk[0x00]);
            installData->contentIndices[i] = __builtin_bswap16(*(u16*) &contentChunk[0x04]);
        }

        installData->installInfo.total += installData->contentCount;

        return AM_InstallTmdBegin(handle);
    } else {
        return AM_InstallContentBegin(handle, installData->contentIndices[index - 1]);
    }
}