From 2c7cbadc142af534f69cc52408e6b8d8ac32bfe0 Mon Sep 17 00:00:00 2001 From: wheremyfoodat Date: Sat, 18 Mar 2023 20:35:35 +0200 Subject: [PATCH] [CFG] Implement GetRegionCanadaUSA --- include/services/cfg.hpp | 3 + include/services/region_codes.hpp | 136 ++++++++++++++++++++++++++++++ src/core/services/cfg.cpp | 17 +++- 3 files changed, 153 insertions(+), 3 deletions(-) diff --git a/include/services/cfg.hpp b/include/services/cfg.hpp index a00e9afb..acaf50f1 100644 --- a/include/services/cfg.hpp +++ b/include/services/cfg.hpp @@ -3,16 +3,19 @@ #include "helpers.hpp" #include "logger.hpp" #include "memory.hpp" +#include "region_codes.hpp" class CFGService { Handle handle = KernelHandles::CFG; Memory& mem; + CountryCodes country = CountryCodes::US; // Default to USA MAKE_LOG_FUNCTION(log, cfgLogger) void writeStringU16(u32 pointer, const std::u16string& string); // Service functions void getConfigInfoBlk2(u32 messagePointer); + void getRegionCanadaUSA(u32 messagePointer); void genUniqueConsoleHash(u32 messagePointer); void secureInfoGetRegion(u32 messagePointer); diff --git a/include/services/region_codes.hpp b/include/services/region_codes.hpp index fff9b165..e06894cd 100644 --- a/include/services/region_codes.hpp +++ b/include/services/region_codes.hpp @@ -39,4 +39,140 @@ enum class LanguageCodes : u32 { Portuguese = PT, Russian = RU, Taiwanese = TW +}; + +enum class CountryCodes : u32 { + JP = 1, + AI = 8, + AG = 9, + AR = 10, + AW = 11, + BS = 12, + BB = 13, + BZ = 14, + BO = 15, + BR = 16, + VG = 17, + CA = 18, + KY = 19, + CL = 20, + CO = 21, + CR = 22, + DM = 23, + DO = 24, + EC = 25, + SV = 26, + GF = 27, + GD = 28, + GP = 29, + GT = 30, + GY = 31, + HT = 32, + HN = 33, + JM = 34, + MQ = 35, + MX = 36, + MS = 37, + AN = 38, + NI = 39, + PA = 40, + PY = 41, + PE = 42, + KN = 43, + LC = 44, + VC = 45, + SR = 46, + TT = 47, + TC = 48, + US = 49, + UY = 50, + VI = 51, + VE = 52, + AL = 64, + AU = 65, + AT = 66, + BE = 67, + BA = 68, + BW = 69, + BG = 70, + HR = 71, + CY = 72, + CZ = 73, + DK = 74, + EE = 75, + FI = 76, + FR = 77, + DE = 78, + GR = 79, + HU = 80, + IS = 81, + IE = 82, + IT = 83, + LV = 84, + LS = 85, + LI = 86, + LT = 87, + LU = 88, + MK = 89, + MT = 90, + ME = 91, + MZ = 92, + NA = 93, + NL = 94, + NZ = 95, + NO = 96, + PL = 97, + PT = 98, + RO = 99, + RU = 100, + RS = 101, + SK = 102, + SI = 103, + ZA = 104, + ES = 105, + SZ = 106, + SE = 107, + CH = 108, + TR = 109, + GB = 110, + ZM = 111, + ZW = 112, + AZ = 113, + MR = 114, + ML = 115, + NE = 116, + TD = 117, + SD = 118, + ER = 119, + DJ = 120, + SO = 121, + AD = 122, + GI = 123, + GG = 124, + IM = 125, + JE = 126, + MC = 127, + TW = 128, + KR = 136, + HK = 144, + MO = 145, + ID = 152, + SG = 153, + TH = 154, + PH = 155, + MY = 156, + CN = 160, + AE = 168, + IND = 169, // We can't use the 2-letter country code for India because the Windows SDK does #define IN... + EG = 170, + OM = 171, + QA = 172, + KW = 173, + SA = 174, + SY = 175, + BH = 176, + JO = 177, + SM = 184, + VA = 185, + BM = 186, }; \ No newline at end of file diff --git a/src/core/services/cfg.cpp b/src/core/services/cfg.cpp index b1cc8175..497e946d 100644 --- a/src/core/services/cfg.cpp +++ b/src/core/services/cfg.cpp @@ -1,12 +1,12 @@ #include "services/cfg.hpp" #include "services/dsp.hpp" -#include "services/region_codes.hpp" namespace CFGCommands { enum : u32 { GetConfigInfoBlk2 = 0x00010082, SecureInfoGetRegion = 0x00020000, - GenHashConsoleUnique = 0x00030040 + GenHashConsoleUnique = 0x00030040, + GetRegionCanadaUSA = 0x00040000 }; } @@ -22,6 +22,7 @@ void CFGService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); switch (command) { case CFGCommands::GetConfigInfoBlk2: getConfigInfoBlk2(messagePointer); break; + case CFGCommands::GetRegionCanadaUSA: getRegionCanadaUSA(messagePointer); break; case CFGCommands::GenHashConsoleUnique: genUniqueConsoleHash(messagePointer); break; case CFGCommands::SecureInfoGetRegion: secureInfoGetRegion(messagePointer); break; default: Helpers::panic("CFG service requested. Command: %08X\n", command); @@ -53,7 +54,7 @@ void CFGService::getConfigInfoBlk2(u32 messagePointer) { mem.write8(output, 0); // Unknown mem.write8(output + 1, 0); // Unknown mem.write8(output + 2, 2); // Province (Temporarily stubbed to Washington DC like Citra) - mem.write8(output + 3, 49); // Country code (Temporarily stubbed to USA like Citra) + mem.write8(output + 3, static_cast(country)); // Country code } else if (size == 0x20 && blockID == 0x50005) { printf("[Unimplemented] Read stereo display settings from NAND\n"); } else if (size == 0x1C && blockID == 0xA0000) { // Username @@ -112,4 +113,14 @@ void CFGService::genUniqueConsoleHash(u32 messagePointer) { // Let's stub it for now mem.write32(messagePointer + 8, 0x33646D6F ^ salt); // Lower word of hash mem.write32(messagePointer + 12, 0xA3534841 ^ salt); // Upper word of hash +} + +// Returns 1 if the console region is either Canada or USA, otherwise returns 0 +// Used for market restriction-related stuff +void CFGService::getRegionCanadaUSA(u32 messagePointer) { + log("CFG::GetRegionCanadaUSA\n"); + const u8 ret = (country == CountryCodes::US || country == CountryCodes::CA) ? 1 : 0; + + mem.write32(messagePointer + 4, Result::Success); + mem.write8(messagePointer + 8, ret); } \ No newline at end of file