mirror of
https://github.com/DarkStore-3DS/Project_CTR.git
synced 2026-07-03 00:39:14 +00:00
Merge branch 'master' of https://github.com/profi200/Project_CTR.git
This commit is contained in:
+6
-6
@@ -46,7 +46,7 @@ void cia_save(cia_context* ctx, u32 type, u32 flags)
|
||||
filepath* path = 0;
|
||||
ctr_tmd_body *body;
|
||||
ctr_tmd_contentchunk *chunk;
|
||||
int i;
|
||||
unsigned int i;
|
||||
char tmpname[255];
|
||||
|
||||
switch(type)
|
||||
@@ -151,7 +151,7 @@ void cia_save_blob(cia_context *ctx, char *out_path, u64 offset, u64 size, int d
|
||||
{
|
||||
u32 max = sizeof(buffer);
|
||||
if (max > size)
|
||||
max = size;
|
||||
max = (u32) size;
|
||||
|
||||
if (max != fread(buffer, 1, max, ctx->file))
|
||||
{
|
||||
@@ -195,9 +195,9 @@ void cia_process(cia_context* ctx, u32 actions)
|
||||
ctx->sizemeta = getle32(ctx->header.metasize);
|
||||
|
||||
ctx->offsetcerts = align(ctx->sizeheader, 64);
|
||||
ctx->offsettik = align(ctx->offsetcerts + ctx->sizecert, 64);
|
||||
ctx->offsettmd = align(ctx->offsettik + ctx->sizetik, 64);
|
||||
ctx->offsetcontent = align(ctx->offsettmd + ctx->sizetmd, 64);
|
||||
ctx->offsettik = align((u32) (ctx->offsetcerts + ctx->sizecert), 64);
|
||||
ctx->offsettmd = align((u32) (ctx->offsettik + ctx->sizetik), 64);
|
||||
ctx->offsetcontent = align((u32) (ctx->offsettmd + ctx->sizetmd), 64);
|
||||
ctx->offsetmeta = align64(ctx->offsetcontent + ctx->sizecontent, 64);
|
||||
|
||||
if (actions & InfoFlag)
|
||||
@@ -253,7 +253,7 @@ void cia_verify_contents(cia_context *ctx, u32 actions)
|
||||
ctr_tmd_contentchunk *chunk;
|
||||
u8 *verify_buf;
|
||||
u32 content_size=0;
|
||||
int i;
|
||||
unsigned i;
|
||||
|
||||
// verify TMD content hashes, requires decryption ..
|
||||
body = tmd_get_body(&ctx->tmd);
|
||||
|
||||
+1
-1
@@ -244,7 +244,7 @@ int ctr_rsa_verify_hash(const u8 signature[0x100], const u8 hash[0x20], rsakey20
|
||||
{
|
||||
ctr_rsa_context ctx;
|
||||
u32 result;
|
||||
u8 output[0x100];
|
||||
// u8 output[0x100];
|
||||
|
||||
if (key->keytype == RSAKEY_INVALID)
|
||||
return Fail;
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>windows;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
@@ -75,15 +75,14 @@
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>windows;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<PrecompiledHeader />
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>c:\dev\tools\bin\ctrtool.exe</OutputFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
@@ -100,6 +99,7 @@
|
||||
<ClCompile Include="filepath.c" />
|
||||
<ClCompile Include="firm.c" />
|
||||
<ClCompile Include="oschar.c" />
|
||||
<ClCompile Include="syscalls.c" />
|
||||
<ClCompile Include="windows\getopt.c" />
|
||||
<ClCompile Include="windows\getopt1.c" />
|
||||
<ClCompile Include="ivfc.c" />
|
||||
@@ -132,6 +132,7 @@
|
||||
<ClInclude Include="filepath.h" />
|
||||
<ClInclude Include="firm.h" />
|
||||
<ClInclude Include="oschar.h" />
|
||||
<ClInclude Include="syscalls.h" />
|
||||
<ClInclude Include="windows\getopt.h" />
|
||||
<ClInclude Include="info.h" />
|
||||
<ClInclude Include="ivfc.h" />
|
||||
|
||||
@@ -117,6 +117,9 @@
|
||||
<ClCompile Include="oschar.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="syscalls.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="cia.h">
|
||||
@@ -209,5 +212,8 @@
|
||||
<ClInclude Include="oschar.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="syscalls.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
+5
-5
@@ -429,7 +429,7 @@ int cwav_dspadpcm_setup(cwav_dspadpcmstate* state, cwav_context* ctx, int isloop
|
||||
}
|
||||
|
||||
state->channelstate[i].samplebuffer = state->samplebuffer + SAMPLECOUNT * i;
|
||||
state->channelstate[i].sampleoffset = ctx->offset + getle32(adpcmchannel->info.sampleref.offset) + getle32(ctx->header.datablockref.offset) + 8 + startoffset;
|
||||
state->channelstate[i].sampleoffset = (u32) (ctx->offset + getle32(adpcmchannel->info.sampleref.offset) + getle32(ctx->header.datablockref.offset) + 8 + startoffset);
|
||||
if (isloop)
|
||||
{
|
||||
state->channelstate[i].yn1 = getle16(adpcminfo->loopyn1);
|
||||
@@ -627,7 +627,7 @@ int cwav_imaadpcm_setup(cwav_imaadpcmstate* state, cwav_context* ctx, int isloop
|
||||
}
|
||||
|
||||
state->channelstate[i].samplebuffer = state->samplebuffer + SAMPLECOUNT * i;
|
||||
state->channelstate[i].sampleoffset = ctx->offset + getle32(adpcmchannel->info.sampleref.offset) + getle32(ctx->header.datablockref.offset) + 8 + startoffset;
|
||||
state->channelstate[i].sampleoffset = (u32) (ctx->offset + getle32(adpcmchannel->info.sampleref.offset) + getle32(ctx->header.datablockref.offset) + 8 + startoffset);
|
||||
if (isloop)
|
||||
{
|
||||
state->channelstate[i].data = getle16(adpcminfo->loopdata);
|
||||
@@ -826,7 +826,7 @@ int cwav_pcm_setup(cwav_pcmstate* state, cwav_context* ctx, int isloop)
|
||||
cwav_channel* pcmchannel = &ctx->channel[i];
|
||||
|
||||
state->channelstate[i].samplebuffer = state->samplebuffer + SAMPLECOUNT * i;
|
||||
state->channelstate[i].sampleoffset = ctx->offset + getle32(pcmchannel->info.sampleref.offset) + getle32(ctx->header.datablockref.offset) + 8 + startoffset;
|
||||
state->channelstate[i].sampleoffset = (u32) (ctx->offset + getle32(pcmchannel->info.sampleref.offset) + getle32(ctx->header.datablockref.offset) + 8 + startoffset);
|
||||
stream_in_allocate(&state->channelstate[i].instreamctx, BUFFERSIZE, ctx->file);
|
||||
stream_in_seek(&state->channelstate[i].instreamctx, state->channelstate[i].sampleoffset);
|
||||
}
|
||||
@@ -932,7 +932,7 @@ void cwav_print(cwav_context* ctx)
|
||||
cwav_header* header = &ctx->header;
|
||||
cwav_infoheader* infoheader = &ctx->infoheader;
|
||||
u32 i;
|
||||
u32 infoheaderoffset = ctx->offset + getle32(ctx->header.infoblockref.offset);
|
||||
u32 infoheaderoffset = (u32) (ctx->offset + getle32(ctx->header.infoblockref.offset));
|
||||
u32 channelcount = getle32(infoheader->channelcount);
|
||||
|
||||
fprintf(stdout, "Header: %c%c%c%c\n", header->magic[0], header->magic[1], header->magic[2], header->magic[3]);
|
||||
@@ -962,7 +962,7 @@ void cwav_print(cwav_context* ctx)
|
||||
{
|
||||
u32 channeloffset = infoheaderoffset + 0x1C + getle32(ctx->channel[i].inforef.offset);
|
||||
u32 codecoffset = channeloffset + getle32(ctx->channel[i].info.codecref.offset);
|
||||
u32 sampleoffset = ctx->offset + getle32(ctx->channel[i].info.sampleref.offset) + getle32(ctx->header.datablockref.offset) + 8;
|
||||
u32 sampleoffset = (u32) (ctx->offset + getle32(ctx->channel[i].info.sampleref.offset) + getle32(ctx->header.datablockref.offset) + 8);
|
||||
|
||||
fprintf(stdout, "Channel %d:\n", i);
|
||||
fprintf(stdout, " > Channel ref idtype: 0x%04X\n", getle16(ctx->channel[i].inforef.idtype));
|
||||
|
||||
+57
-31
@@ -1,3 +1,4 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
@@ -5,6 +6,7 @@
|
||||
#include "exheader.h"
|
||||
#include "utils.h"
|
||||
#include "ncch.h"
|
||||
#include "syscalls.h"
|
||||
#include <inttypes.h>
|
||||
|
||||
void exheader_init(exheader_context* ctx)
|
||||
@@ -193,7 +195,7 @@ int exheader_process(exheader_context* ctx, u32 actions)
|
||||
exheader_verify(ctx);
|
||||
|
||||
if (actions & InfoFlag)
|
||||
exheader_print(ctx);
|
||||
exheader_print(ctx, actions);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -231,7 +233,7 @@ void exheader_print_arm9accesscontrol(exheader_context* ctx)
|
||||
}
|
||||
}
|
||||
|
||||
void exheader_print_arm11kernelcapabilities(exheader_context* ctx)
|
||||
void exheader_print_arm11kernelcapabilities(exheader_context* ctx, u32 actions)
|
||||
{
|
||||
unsigned int i, j;
|
||||
unsigned int systemcallmask[8];
|
||||
@@ -294,42 +296,66 @@ void exheader_print_arm11kernelcapabilities(exheader_context* ctx)
|
||||
}
|
||||
|
||||
fprintf(stdout, "Allowed systemcalls: ");
|
||||
for(i=0; i<8; i++)
|
||||
if(!(actions & ShowSyscallsFlag))
|
||||
{
|
||||
for(j=0; j<24; j++)
|
||||
for(i=0; i<8; i++)
|
||||
{
|
||||
svcmask = systemcallmask[i];
|
||||
|
||||
if (svcmask & (1<<j))
|
||||
for(j=0; j<24; j++)
|
||||
{
|
||||
unsigned int svcid = i*24+j;
|
||||
if (svccount == 0)
|
||||
{
|
||||
fprintf(stdout, "0x%02X", svcid);
|
||||
}
|
||||
else if ( (svccount & 7) == 0)
|
||||
{
|
||||
fprintf(stdout, " ");
|
||||
fprintf(stdout, "0x%02X", svcid);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stdout, ", 0x%02X", svcid);
|
||||
}
|
||||
svcmask = systemcallmask[i];
|
||||
|
||||
svccount++;
|
||||
if ( (svccount & 7) == 0)
|
||||
if (svcmask & (1<<j))
|
||||
{
|
||||
fprintf(stdout, "\n");
|
||||
unsigned int svcid = i*24+j;
|
||||
if (svccount == 0)
|
||||
{
|
||||
fprintf(stdout, "0x%02X", svcid);
|
||||
}
|
||||
else if ( (svccount & 7) == 0)
|
||||
{
|
||||
fprintf(stdout, " ");
|
||||
fprintf(stdout, "0x%02X", svcid);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stdout, ", 0x%02X", svcid);
|
||||
}
|
||||
|
||||
svccount++;
|
||||
if ( (svccount & 7) == 0)
|
||||
{
|
||||
fprintf(stdout, "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (svccount & 7)
|
||||
fprintf(stdout, "\n");
|
||||
if (svccount == 0)
|
||||
fprintf(stdout, "none\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stdout, "\n");
|
||||
|
||||
for(i=0; i<8; i++)
|
||||
{
|
||||
for(j=0; j<24; j++)
|
||||
{
|
||||
svcmask = systemcallmask[i];
|
||||
|
||||
if (svcmask & (1 << j))
|
||||
{
|
||||
unsigned int svcid = i * 24 + j;
|
||||
char svcname[128];
|
||||
|
||||
syscall_get_name(svcname, sizeof(svcname), svcid);
|
||||
|
||||
fprintf(stdout, " > 0x%02X %s\n", svcid, svcname);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (svccount & 7)
|
||||
fprintf(stdout, "\n");
|
||||
if (svccount == 0)
|
||||
fprintf(stdout, "none\n");
|
||||
|
||||
|
||||
fprintf(stdout, "Allowed interrupts: ");
|
||||
for(i=0; i<0x7F; i++)
|
||||
@@ -618,7 +644,7 @@ const char* exheader_getsystemmodeextstring(u8 systemmodeext, u8 systemmode)
|
||||
}
|
||||
|
||||
|
||||
void exheader_print(exheader_context* ctx)
|
||||
void exheader_print(exheader_context* ctx, u32 actions)
|
||||
{
|
||||
u32 i;
|
||||
u64 savedatasize = getle64(ctx->header.systeminfo.savedatasize);
|
||||
@@ -679,7 +705,7 @@ void exheader_print(exheader_context* ctx)
|
||||
fprintf(stdout, "Main thread priority: %d %s\n", ctx->system_local_caps.priority, exheader_getvalidstring(ctx->validpriority));
|
||||
// print resource limit descriptor too? currently mostly zeroes...
|
||||
exheader_print_arm11storageinfo(ctx);
|
||||
exheader_print_arm11kernelcapabilities(ctx);
|
||||
exheader_print_arm11kernelcapabilities(ctx, actions);
|
||||
exheader_print_arm9accesscontrol(ctx);
|
||||
|
||||
fprintf(stdout, "Service access: %s\n", exheader_getvalidstring(ctx->validservicecontrol));
|
||||
|
||||
+1
-1
@@ -194,7 +194,7 @@ int exheader_get_compressedflag(exheader_context* ctx);
|
||||
void exheader_read(exheader_context* ctx, u32 actions);
|
||||
int exheader_process(exheader_context* ctx, u32 actions);
|
||||
const char* exheader_getvalidstring(int valid);
|
||||
void exheader_print(exheader_context* ctx);
|
||||
void exheader_print(exheader_context* ctx, u32 actions);
|
||||
void exheader_verify(exheader_context* ctx);
|
||||
int exheader_hash_valid(exheader_context* ctx);
|
||||
int exheader_programid_valid(exheader_context* ctx);
|
||||
|
||||
+1
-1
@@ -47,7 +47,7 @@ void filepath_append_utf16(filepath* fpath, const u8* name)
|
||||
if (code > 0x7F)
|
||||
code = '#';
|
||||
|
||||
fpath->pathname[size++] = code;
|
||||
fpath->pathname[size++] = (char) code;
|
||||
}
|
||||
|
||||
fpath->pathname[size] = 0;
|
||||
|
||||
+4
-4
@@ -51,7 +51,7 @@ void ivfc_fseek(ivfc_context* ctx, u64 offset)
|
||||
u64 data_pos = offset - ctx->offset;
|
||||
fseeko64(ctx->file, offset, SEEK_SET);
|
||||
ctr_init_counter(&ctx->aes, ctx->key, ctx->counter);
|
||||
ctr_add_counter(&ctx->aes, data_pos / 0x10);
|
||||
ctr_add_counter(&ctx->aes, (u32) (data_pos / 0x10));
|
||||
}
|
||||
|
||||
size_t ivfc_fread(ivfc_context* ctx, void* buffer, size_t size, size_t count)
|
||||
@@ -128,7 +128,7 @@ void ivfc_verify(ivfc_context* ctx, u32 flags)
|
||||
{
|
||||
ivfc_level* level = ctx->level + i;
|
||||
|
||||
blockcount = level->datasize / level->hashblocksize;
|
||||
blockcount = (u32) (level->datasize / level->hashblocksize);
|
||||
if (level->datasize % level->hashblocksize != 0)
|
||||
{
|
||||
fprintf(stderr, "Error, IVFC block size mismatch\n");
|
||||
@@ -160,7 +160,7 @@ void ivfc_read(ivfc_context* ctx, u64 offset, u64 size, u8* buffer)
|
||||
}
|
||||
|
||||
ivfc_fseek(ctx, ctx->offset + offset);
|
||||
if (size != ivfc_fread(ctx, buffer, 1, size))
|
||||
if (size != ivfc_fread(ctx, buffer, 1, (size_t) size))
|
||||
{
|
||||
fprintf(stderr, "Error, IVFC could not read file\n");
|
||||
return;
|
||||
@@ -177,7 +177,7 @@ void ivfc_hash(ivfc_context* ctx, u64 offset, u64 size, u8* hash)
|
||||
|
||||
ivfc_read(ctx, offset, size, ctx->buffer);
|
||||
|
||||
ctr_sha_256(ctx->buffer, size, hash);
|
||||
ctr_sha_256(ctx->buffer, (u32) size, hash);
|
||||
}
|
||||
|
||||
void ivfc_print(ivfc_context* ctx)
|
||||
|
||||
+7
-4
@@ -58,6 +58,7 @@ static void usage(const char *argv0)
|
||||
" --ncchkey=key Set ncch key.\n"
|
||||
" --ncchsyskey=key Set ncch fixed system key.\n"
|
||||
" --showkeys Show the keys being used.\n"
|
||||
" --showsyscalls Show system call names instead of numbers.\n"
|
||||
" -t, --intype=type Specify input file type [ncsd, ncch, exheader, cia, tmd, lzss,\n"
|
||||
" firm, cwav, exefs, romfs]\n"
|
||||
"LZSS options:\n"
|
||||
@@ -66,7 +67,7 @@ static void usage(const char *argv0)
|
||||
" -n, --ncch=index Specify NCCH partition index.\n"
|
||||
" --exheader=file Specify Extended Header file path.\n"
|
||||
" --logo=file Specify Logo file path.\n"
|
||||
" --plainrgn=file Specify Plain region file path"
|
||||
" --plainrgn=file Specify Plain region file path\n"
|
||||
" --exefs=file Specify ExeFS file path.\n"
|
||||
" --exefsdir=dir Specify ExeFS directory path.\n"
|
||||
" --romfs=file Specify RomFS file path.\n"
|
||||
@@ -150,6 +151,7 @@ int main(int argc, char* argv[])
|
||||
{"decompresscode", 0, NULL, 21},
|
||||
{"titlekey", 1, NULL, 22},
|
||||
{"plainrgn", 1, NULL, 23},
|
||||
{"showsyscalls", 0, NULL, 24},
|
||||
{NULL},
|
||||
};
|
||||
|
||||
@@ -239,6 +241,7 @@ int main(int argc, char* argv[])
|
||||
case 21: ctx.actions |= DecompressCodeFlag; break;
|
||||
case 22: keyset_parse_titlekey(&tmpkeys, optarg, strlen(optarg)); break;
|
||||
case 23: settings_set_plainrgn_path(&ctx.usersettings, optarg); break;
|
||||
case 24: ctx.actions |= ShowSyscallsFlag; break;
|
||||
|
||||
default:
|
||||
usage(argv[0]);
|
||||
@@ -344,7 +347,7 @@ int main(int argc, char* argv[])
|
||||
|
||||
firm_init(&firmctx);
|
||||
firm_set_file(&firmctx, ctx.infile);
|
||||
firm_set_size(&firmctx, ctx.infilesize);
|
||||
firm_set_size(&firmctx, (u32) ctx.infilesize);
|
||||
firm_set_usersettings(&firmctx, &ctx.usersettings);
|
||||
firm_process(&firmctx, ctx.actions);
|
||||
|
||||
@@ -399,7 +402,7 @@ int main(int argc, char* argv[])
|
||||
|
||||
tmd_init(&tmdctx);
|
||||
tmd_set_file(&tmdctx, ctx.infile);
|
||||
tmd_set_size(&tmdctx, ctx.infilesize);
|
||||
tmd_set_size(&tmdctx, (u32) ctx.infilesize);
|
||||
tmd_set_usersettings(&tmdctx, &ctx.usersettings);
|
||||
tmd_process(&tmdctx, ctx.actions);
|
||||
|
||||
@@ -412,7 +415,7 @@ int main(int argc, char* argv[])
|
||||
|
||||
lzss_init(&lzssctx);
|
||||
lzss_set_file(&lzssctx, ctx.infile);
|
||||
lzss_set_size(&lzssctx, ctx.infilesize);
|
||||
lzss_set_size(&lzssctx, (u32) ctx.infilesize);
|
||||
lzss_set_usersettings(&lzssctx, &ctx.usersettings);
|
||||
lzss_process(&lzssctx, ctx.actions);
|
||||
|
||||
|
||||
+4
-4
@@ -48,7 +48,7 @@ void ncch_set_file(ncch_context* ctx, FILE* file)
|
||||
void ncch_get_counter(ncch_context* ctx, u8 counter[16], u8 type)
|
||||
{
|
||||
u32 version = getle16(ctx->header.version);
|
||||
u32 mediaunitsize = ncch_get_mediaunit_size(ctx);
|
||||
u32 mediaunitsize = (u32) ncch_get_mediaunit_size(ctx);
|
||||
u8* partitionid = ctx->header.partitionid;
|
||||
u32 i;
|
||||
u64 x = 0;
|
||||
@@ -73,7 +73,7 @@ void ncch_get_counter(ncch_context* ctx, u8 counter[16], u8 type)
|
||||
for(i=0; i<8; i++)
|
||||
counter[i] = partitionid[i];
|
||||
for(i=0; i<4; i++)
|
||||
counter[12+i] = x>>((3-i)*8);
|
||||
counter[12+i] = (u8) (x>>((3-i)*8));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ int ncch_extract_buffer(ncch_context* ctx, u8* buffer, u32 buffersize, u32* outs
|
||||
u32 read_len = buffersize;
|
||||
|
||||
if (read_len > ctx->extractsize)
|
||||
read_len = ctx->extractsize;
|
||||
read_len = (u32) ctx->extractsize;
|
||||
|
||||
*outsize = read_len;
|
||||
|
||||
@@ -234,7 +234,7 @@ clean:
|
||||
|
||||
void ncch_verify(ncch_context* ctx, u32 flags)
|
||||
{
|
||||
u32 mediaunitsize = ncch_get_mediaunit_size(ctx);
|
||||
u32 mediaunitsize = (u32) ncch_get_mediaunit_size(ctx);
|
||||
u32 exefshashregionsize = getle32(ctx->header.exefshashregionsize) * mediaunitsize;
|
||||
u32 romfshashregionsize = getle32(ctx->header.romfshashregionsize) * mediaunitsize;
|
||||
u32 exheaderhashregionsize = getle32(ctx->header.extendedheadersize);
|
||||
|
||||
+1
-1
@@ -120,7 +120,7 @@ void ncsd_print(ncsd_context* ctx)
|
||||
char magic[5];
|
||||
ctr_ncsdheader* header = &ctx->header;
|
||||
unsigned int i;
|
||||
unsigned int mediaunitsize = ncsd_get_mediaunit_size(ctx);
|
||||
unsigned int mediaunitsize = (unsigned int) ncsd_get_mediaunit_size(ctx);
|
||||
|
||||
|
||||
memcpy(magic, header->magic, 4);
|
||||
|
||||
+3
-3
@@ -50,7 +50,7 @@ void romfs_fseek(romfs_context* ctx, u64 offset)
|
||||
u64 data_pos = offset - ctx->offset;
|
||||
fseeko64(ctx->file, offset, SEEK_SET);
|
||||
ctr_init_counter(&ctx->aes, ctx->key, ctx->counter);
|
||||
ctr_add_counter(&ctx->aes, data_pos / 0x10);
|
||||
ctr_add_counter(&ctx->aes, (u32) (data_pos / 0x10));
|
||||
}
|
||||
|
||||
size_t romfs_fread(romfs_context* ctx, void* buffer, size_t size, size_t count)
|
||||
@@ -91,7 +91,7 @@ void romfs_process(romfs_context* ctx, u32 actions)
|
||||
return;
|
||||
}
|
||||
|
||||
ctx->infoblockoffset = ctx->offset + 0x1000;
|
||||
ctx->infoblockoffset = (u32) (ctx->offset + 0x1000);
|
||||
|
||||
romfs_fseek(ctx, ctx->infoblockoffset);
|
||||
romfs_fread(ctx, &ctx->infoheader, 1, sizeof(romfs_infoheader));
|
||||
@@ -363,7 +363,7 @@ void romfs_extract_datafile(romfs_context* ctx, u64 offset, u64 size, const osch
|
||||
{
|
||||
max = sizeof(buffer);
|
||||
if (max > size)
|
||||
max = size;
|
||||
max = (u32) size;
|
||||
|
||||
if (max != romfs_fread(ctx, buffer, 1, max))
|
||||
{
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "syscalls.h"
|
||||
|
||||
// List of 3DS system calls. NULL indicates unknown.
|
||||
static const char *const syscall_list[NUM_SYSCALLS] =
|
||||
{
|
||||
NULL, // 00
|
||||
"ControlMemory", // 01
|
||||
"QueryMemory", // 02
|
||||
"ExitProcess", // 03
|
||||
"GetProcessAffinityMask", // 04
|
||||
"SetProcessAffinityMask", // 05
|
||||
"GetProcessIdealProcessor", // 06
|
||||
"SetProcessIdealProcessor", // 07
|
||||
"CreateThread", // 08
|
||||
"ExitThread", // 09
|
||||
"SleepThread", // 0A
|
||||
"GetThreadPriority", // 0B
|
||||
"SetThreadPriority", // 0C
|
||||
"GetThreadAffinityMask", // 0D
|
||||
"SetThreadAffinityMask", // 0E
|
||||
"GetThreadIdealProcessor", // 0F
|
||||
"SetThreadIdealProcessor", // 10
|
||||
"GetCurrentProcessorNumber", // 11
|
||||
"Run", // 12
|
||||
"CreateMutex", // 13
|
||||
"ReleaseMutex", // 14
|
||||
"CreateSemaphore", // 15
|
||||
"ReleaseSemaphore", // 16
|
||||
"CreateEvent", // 17
|
||||
"SignalEvent", // 18
|
||||
"ClearEvent", // 19
|
||||
"CreateTimer", // 1A
|
||||
"SetTimer", // 1B
|
||||
"CancelTimer", // 1C
|
||||
"ClearTimer", // 1D
|
||||
"CreateMemoryBlock", // 1E
|
||||
"MapMemoryBlock", // 1F
|
||||
"UnmapMemoryBlock", // 20
|
||||
"CreateAddressArbiter", // 21
|
||||
"ArbitrateAddress", // 22
|
||||
"CloseHandle", // 23
|
||||
"WaitSynchronization1", // 24
|
||||
"WaitSynchronizationN", // 25
|
||||
"SignalAndWait", // 26
|
||||
"DuplicateHandle", // 27
|
||||
"GetSystemTick", // 28
|
||||
"GetHandleInfo", // 29
|
||||
"GetSystemInfo", // 2A
|
||||
"GetProcessInfo", // 2B
|
||||
"GetThreadInfo", // 2C
|
||||
"ConnectToPort", // 2D
|
||||
"SendSyncRequest1", // 2E
|
||||
"SendSyncRequest2", // 2F
|
||||
"SendSyncRequest3", // 30
|
||||
"SendSyncRequest4", // 31
|
||||
"SendSyncRequest", // 32
|
||||
"OpenProcess", // 33
|
||||
"OpenThread", // 34
|
||||
"GetProcessId", // 35
|
||||
"GetProcessIdOfThread", // 36
|
||||
"GetThreadId", // 37
|
||||
"GetResourceLimit", // 38
|
||||
"GetResourceLimitLimitValues", // 39
|
||||
"GetResourceLimitCurrentValues", // 3A
|
||||
"GetThreadContext", // 3B
|
||||
"Break", // 3C
|
||||
"OutputDebugString", // 3D
|
||||
"ControlPerformanceCounter", // 3E
|
||||
NULL, // 3F
|
||||
NULL, // 40
|
||||
NULL, // 41
|
||||
NULL, // 42
|
||||
NULL, // 43
|
||||
NULL, // 44
|
||||
NULL, // 45
|
||||
NULL, // 46
|
||||
"CreatePort", // 47
|
||||
"CreateSessionToPort", // 48
|
||||
"CreateSession", // 49
|
||||
"AcceptSession", // 4A
|
||||
"ReplyAndReceive1", // 4B
|
||||
"ReplyAndReceive2", // 4C
|
||||
"ReplyAndReceive3", // 4D
|
||||
"ReplyAndReceive4", // 4E
|
||||
"ReplyAndReceive", // 4F
|
||||
"BindInterrupt", // 50
|
||||
"UnbindInterrupt", // 51
|
||||
"InvalidateProcessDataCache", // 52
|
||||
"StoreProcessDataCache", // 53
|
||||
"FlushProcessDataCache", // 54
|
||||
"StartInterProcessDma", // 55
|
||||
"StopDma", // 56
|
||||
"GetDmaState", // 57
|
||||
"RestartDma", // 58
|
||||
NULL, // 59
|
||||
NULL, // 5A
|
||||
NULL, // 5B
|
||||
NULL, // 5C
|
||||
NULL, // 5D
|
||||
NULL, // 5E
|
||||
NULL, // 5F
|
||||
"DebugActiveProcess", // 60
|
||||
"BreakDebugProcess", // 61
|
||||
"TerminateDebugProcess", // 62
|
||||
"GetProcessDebugEvent", // 63
|
||||
"ContinueDebugEvent", // 64
|
||||
"GetProcessList", // 65
|
||||
"GetThreadList", // 66
|
||||
"GetDebugThreadContext", // 67
|
||||
"SetDebugThreadContext", // 68
|
||||
"QueryDebugProcessMemory", // 69
|
||||
"ReadProcessMemory", // 6A
|
||||
"WriteProcessMemory", // 6B
|
||||
"SetHardwareBreakPoint", // 6C
|
||||
"GetDebugThreadParam", // 6D
|
||||
NULL, // 6E
|
||||
NULL, // 6F
|
||||
"ControlProcessMemory", // 70
|
||||
"MapProcessMemory", // 71
|
||||
"UnmapProcessMemory", // 72
|
||||
"CreateCodeSet", // 73
|
||||
NULL, // 74
|
||||
"CreateProcess", // 75
|
||||
"TerminateProcess", // 76
|
||||
"SetProcessResourceLimits", // 77
|
||||
"CreateResourceLimit", // 78
|
||||
"SetResourceLimitValues", // 79
|
||||
"AddCodeSegment", // 7A
|
||||
"Backdoor", // 7B
|
||||
"KernelSetState", // 7C
|
||||
"QueryProcessMemory", // 7D
|
||||
NULL, // 7E
|
||||
NULL, // 7F
|
||||
};
|
||||
|
||||
|
||||
void syscall_get_name(char *output, size_t size, unsigned int call_num)
|
||||
{
|
||||
typedef char StaticAssert[sizeof(syscall_list) / sizeof(syscall_list[0]) == NUM_SYSCALLS ? 1 : -1];
|
||||
|
||||
if (size == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const char *name = NULL;
|
||||
if (call_num < (unsigned int) NUM_SYSCALLS)
|
||||
{
|
||||
name = syscall_list[call_num];
|
||||
}
|
||||
|
||||
char name_buf[] = "UnknownXX";
|
||||
sprintf(&name_buf[sizeof(name_buf) - 3], "%02X", call_num & 0xFFu);
|
||||
|
||||
name = name ? name : name_buf;
|
||||
|
||||
size_t length = strlen(name);
|
||||
length = (length > (size - 1)) ? (size - 1) : length;
|
||||
|
||||
memcpy(output, name, length);
|
||||
output[length] = '\0';
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
#ifndef _SYSCALLS_H_
|
||||
#define _SYSCALLS_H_
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
enum { NUM_SYSCALLS = 0x80 };
|
||||
|
||||
void syscall_get_name(char *output, size_t size, unsigned int call_num);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+2
-1
@@ -23,7 +23,8 @@ enum flags
|
||||
VerifyFlag = (1<<4),
|
||||
RawFlag = (1<<5),
|
||||
ShowKeysFlag = (1<<6),
|
||||
DecompressCodeFlag = (1<<7)
|
||||
DecompressCodeFlag = (1<<7),
|
||||
ShowSyscallsFlag = (1<<8),
|
||||
};
|
||||
|
||||
enum validstate
|
||||
|
||||
+30
-30
@@ -73,59 +73,59 @@ u32 getbe16(const u8* p)
|
||||
|
||||
void putle16(u8* p, u16 n)
|
||||
{
|
||||
p[0] = n;
|
||||
p[1] = n>>8;
|
||||
p[0] = (u8) n;
|
||||
p[1] = (u8) (n>>8);
|
||||
}
|
||||
|
||||
void putle32(u8* p, u32 n)
|
||||
{
|
||||
p[0] = n;
|
||||
p[1] = n>>8;
|
||||
p[2] = n>>16;
|
||||
p[3] = n>>24;
|
||||
p[0] = (u8) n;
|
||||
p[1] = (u8) (n>>8);
|
||||
p[2] = (u8) (n>>16);
|
||||
p[3] = (u8) (n>>24);
|
||||
}
|
||||
|
||||
void putle64(u8* p, u64 n)
|
||||
{
|
||||
p[0] = n;
|
||||
p[1] = n >> 8;
|
||||
p[2] = n >> 16;
|
||||
p[3] = n >> 24;
|
||||
p[4] = n >> 32;
|
||||
p[5] = n >> 40;
|
||||
p[6] = n >> 48;
|
||||
p[7] = n >> 56;
|
||||
p[0] = (u8) n;
|
||||
p[1] = (u8) (n >> 8);
|
||||
p[2] = (u8) (n >> 16);
|
||||
p[3] = (u8) (n >> 24);
|
||||
p[4] = (u8) (n >> 32);
|
||||
p[5] = (u8) (n >> 40);
|
||||
p[6] = (u8) (n >> 48);
|
||||
p[7] = (u8) (n >> 56);
|
||||
}
|
||||
|
||||
void putbe16(u8* p, u16 n)
|
||||
{
|
||||
p[1] = n;
|
||||
p[0] = n >> 8;
|
||||
p[1] = (u8) n;
|
||||
p[0] = (u8) (n >> 8);
|
||||
}
|
||||
|
||||
void putbe32(u8* p, u32 n)
|
||||
{
|
||||
p[3] = n;
|
||||
p[2] = n >> 8;
|
||||
p[1] = n >> 16;
|
||||
p[0] = n >> 24;
|
||||
p[3] = (u8) n;
|
||||
p[2] = (u8) (n >> 8);
|
||||
p[1] = (u8) (n >> 16);
|
||||
p[0] = (u8) (n >> 24);
|
||||
}
|
||||
|
||||
void putbe64(u8* p, u64 n)
|
||||
{
|
||||
p[7] = n;
|
||||
p[6] = n >> 8;
|
||||
p[5] = n >> 16;
|
||||
p[4] = n >> 24;
|
||||
p[3] = n >> 32;
|
||||
p[2] = n >> 40;
|
||||
p[1] = n >> 48;
|
||||
p[0] = n >> 56;
|
||||
p[7] = (u8) n;
|
||||
p[6] = (u8) (n >> 8);
|
||||
p[5] = (u8) (n >> 16);
|
||||
p[4] = (u8) (n >> 24);
|
||||
p[3] = (u8) (n >> 32);
|
||||
p[2] = (u8) (n >> 40);
|
||||
p[1] = (u8) (n >> 48);
|
||||
p[0] = (u8) (n >> 56);
|
||||
}
|
||||
|
||||
void readkeyfile(u8* key, const char* keyfname)
|
||||
{
|
||||
u32 keysize = _fsize(keyfname);
|
||||
u64 keysize = _fsize(keyfname);
|
||||
FILE* f = fopen(keyfname, "rb");
|
||||
|
||||
if (0 == f)
|
||||
@@ -136,7 +136,7 @@ void readkeyfile(u8* key, const char* keyfname)
|
||||
|
||||
if (keysize != 16)
|
||||
{
|
||||
fprintf(stdout, "Error key size mismatch, got %d, expected %d\n", keysize, 16);
|
||||
fprintf(stdout, "Error key size mismatch, got %"PRIu64", expected %d\n", keysize, 16);
|
||||
goto clean;
|
||||
}
|
||||
|
||||
|
||||
+6
-1
@@ -41,7 +41,12 @@ int makedir(const char* dir);
|
||||
|
||||
u64 _fsize(const char *filename);
|
||||
|
||||
#ifndef _WIN32
|
||||
#ifdef _MSC_VER
|
||||
inline int fseeko64(FILE *__stream, long long __off, int __whence)
|
||||
{
|
||||
return _fseeki64(__stream, __off, __whence);
|
||||
}
|
||||
#else
|
||||
extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence);
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user