libctru/libctru/source/services/cfgu.c

153 lines
2.8 KiB
C
Raw Normal View History

#include <stdlib.h>
#include <3ds/types.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/services/cfgu.h>
2014-11-22 04:12:34 +01:00
static Handle CFGU_handle = 0;
2014-11-22 04:12:34 +01:00
Result initCfgu()
{
Result ret;
// cfg:i has the most commands, then cfg:s, then cfg:u
ret = srvGetServiceHandle(&CFGU_handle, "cfg:i");
if(ret) ret = srvGetServiceHandle(&CFGU_handle, "cfg:s");
if(ret) ret = srvGetServiceHandle(&CFGU_handle, "cfg:u");
return ret;
}
2014-11-22 04:12:34 +01:00
Result exitCfgu()
{
2014-12-26 02:46:38 +01:00
Result ret = svcCloseHandle(CFGU_handle);
CFGU_handle = 0;
2014-12-26 02:46:38 +01:00
return ret;
}
2014-12-29 23:31:15 +01:00
Result CFGU_SecureInfoGetRegion(u8* region)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00020000;
if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
*region = (u8)cmdbuf[2];
return (Result)cmdbuf[1];
}
Result CFGU_GenHashConsoleUnique(u32 appIDSalt, u64* hash)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00030040;
2014-12-29 23:31:15 +01:00
cmdbuf[1] = appIDSalt;
if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
*hash = (u64)cmdbuf[2];
*hash |= ((u64)cmdbuf[3])<<32;
return (Result)cmdbuf[1];
}
Result CFGU_GetRegionCanadaUSA(u8* value)
{
2014-12-26 02:46:38 +01:00
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
2014-12-26 02:46:38 +01:00
cmdbuf[0] = 0x00040000;
2014-12-26 02:46:38 +01:00
if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
2014-12-26 02:46:38 +01:00
*value = (u8)cmdbuf[2];
2014-12-26 02:46:38 +01:00
return (Result)cmdbuf[1];
}
Result CFGU_GetSystemModel(u8* model)
{
2014-12-26 02:46:38 +01:00
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
2014-12-26 02:46:38 +01:00
cmdbuf[0] = 0x00050000;
2014-12-26 02:46:38 +01:00
if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
2014-12-26 02:46:38 +01:00
*model = (u8)cmdbuf[2];
2014-12-26 02:46:38 +01:00
return (Result)cmdbuf[1];
2014-11-22 04:12:34 +01:00
}
Result CFGU_GetModelNintendo2DS(u8* value)
{
2014-12-26 02:46:38 +01:00
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
2014-12-26 02:46:38 +01:00
cmdbuf[0] = 0x00060000;
2014-12-26 02:46:38 +01:00
if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
2014-12-26 02:46:38 +01:00
*value = (u8)cmdbuf[2];
2014-12-26 02:46:38 +01:00
return (Result)cmdbuf[1];
}
Result CFGU_GetCountryCodeString(u16 code, u16* string)
{
2014-12-26 02:46:38 +01:00
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
2014-12-26 02:46:38 +01:00
cmdbuf[0] = 0x00090040;
cmdbuf[1] = (u32)code;
2014-12-26 02:46:38 +01:00
if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
2014-12-26 02:46:38 +01:00
*string = (u16)cmdbuf[2];
2014-12-26 02:46:38 +01:00
return (Result)cmdbuf[1];
}
Result CFGU_GetCountryCodeID(u16 string, u16* code)
{
2014-12-26 02:46:38 +01:00
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
2014-12-26 02:46:38 +01:00
cmdbuf[0] = 0x000A0040;
cmdbuf[1] = (u32)string;
2014-12-26 02:46:38 +01:00
if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
2014-12-26 02:46:38 +01:00
*code = (u16)cmdbuf[2];
2014-12-26 02:46:38 +01:00
return (Result)cmdbuf[1];
}
// See here for block IDs:
// http://3dbrew.org/wiki/Config_Savegame#Configuration_blocks
Result CFGU_GetConfigInfoBlk2(u32 size, u32 blkID, u8* outData)
{
2014-12-26 02:46:38 +01:00
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
2014-12-26 02:46:38 +01:00
cmdbuf[0] = 0x00010082;
cmdbuf[1] = size;
cmdbuf[2] = blkID;
cmdbuf[3] = (size<<4)|12;
cmdbuf[4] = (u32)outData;
2014-12-26 02:46:38 +01:00
if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
2014-12-26 02:46:38 +01:00
return (Result)cmdbuf[1];
}
Result CFGU_GetSystemLanguage(u8* language)
{
return CFGU_GetConfigInfoBlk2(1, 0xA0002, language);
}