mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-11-06 04:01:44 +00:00
dmnt-cheat: continue fleshing out cheat manager code
This commit is contained in:
parent
964a698875
commit
c80eb26135
2 changed files with 79 additions and 11 deletions
|
@ -21,10 +21,57 @@
|
||||||
static HosMutex g_cheat_lock;
|
static HosMutex g_cheat_lock;
|
||||||
static HosThread g_detect_thread, g_vm_thread;
|
static HosThread g_detect_thread, g_vm_thread;
|
||||||
|
|
||||||
static bool g_has_cheat_process;
|
|
||||||
static CheatProcessMetadata g_cheat_process_metadata = {0};
|
static CheatProcessMetadata g_cheat_process_metadata = {0};
|
||||||
static Handle g_cheat_process_debug_hnd = 0;
|
static Handle g_cheat_process_debug_hnd = 0;
|
||||||
|
|
||||||
|
void DmntCheatManager::CloseActiveCheatProcess() {
|
||||||
|
if (g_cheat_process_debug_hnd != 0) {
|
||||||
|
svcCloseHandle(g_cheat_process_debug_hnd);
|
||||||
|
g_cheat_process_debug_hnd = 0;
|
||||||
|
g_cheat_process_metadata = (CheatProcessMetadata){0};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DmntCheatManager::HasActiveCheatProcess() {
|
||||||
|
u64 tmp;
|
||||||
|
bool has_cheat_process = g_cheat_process_debug_hnd != 0;
|
||||||
|
|
||||||
|
if (has_cheat_process) {
|
||||||
|
has_cheat_process &= R_SUCCEEDED(svcGetProcessId(&tmp, g_cheat_process_debug_hnd));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (has_cheat_process) {
|
||||||
|
has_cheat_process &= R_SUCCEEDED(pmdmntGetApplicationPid(&tmp));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (has_cheat_process) {
|
||||||
|
has_cheat_process &= tmp == g_cheat_process_metadata.process_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!has_cheat_process) {
|
||||||
|
CloseActiveCheatProcess();
|
||||||
|
}
|
||||||
|
|
||||||
|
return has_cheat_process;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DmntCheatManager::ContinueCheatProcess() {
|
||||||
|
if (HasActiveCheatProcess()) {
|
||||||
|
/* Loop getting debug events. */
|
||||||
|
u8 tmp;
|
||||||
|
while (R_SUCCEEDED(svcGetDebugEvent(&tmp, g_cheat_process_debug_hnd))) {
|
||||||
|
/* ... */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Continue the process. */
|
||||||
|
if (kernelAbove300()) {
|
||||||
|
svcContinueDebugEvent(g_cheat_process_debug_hnd, 5, nullptr, 0);
|
||||||
|
} else {
|
||||||
|
svcLegacyContinueDebugEvent(g_cheat_process_debug_hnd, 5, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Handle DmntCheatManager::PrepareDebugNextApplication() {
|
Handle DmntCheatManager::PrepareDebugNextApplication() {
|
||||||
Result rc;
|
Result rc;
|
||||||
Handle event_h;
|
Handle event_h;
|
||||||
|
@ -53,11 +100,7 @@ void DmntCheatManager::OnNewApplicationLaunch() {
|
||||||
Result rc;
|
Result rc;
|
||||||
|
|
||||||
/* Close the current application, if it's open. */
|
/* Close the current application, if it's open. */
|
||||||
if (g_cheat_process_debug_hnd != 0) {
|
CloseActiveCheatProcess();
|
||||||
svcCloseHandle(g_cheat_process_debug_hnd);
|
|
||||||
g_cheat_process_debug_hnd = 0;
|
|
||||||
g_cheat_process_metadata = (CheatProcessMetadata){0};
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the new application's process ID. */
|
/* Get the new application's process ID. */
|
||||||
if (R_FAILED((rc = pmdmntGetApplicationPid(&g_cheat_process_metadata.process_id)))) {
|
if (R_FAILED((rc = pmdmntGetApplicationPid(&g_cheat_process_metadata.process_id)))) {
|
||||||
|
@ -88,7 +131,7 @@ void DmntCheatManager::OnNewApplicationLaunch() {
|
||||||
{
|
{
|
||||||
LoaderModuleInfo proc_modules[2];
|
LoaderModuleInfo proc_modules[2];
|
||||||
u32 num_modules;
|
u32 num_modules;
|
||||||
if (R_FAILED((rc = ldrDmntGetModuleInfos(g_cheat_process_metadata.process_id, &proc_modules, 2, &num_modules)))) {
|
if (R_FAILED((rc = ldrDmntGetModuleInfos(g_cheat_process_metadata.process_id, proc_modules, 2, &num_modules)))) {
|
||||||
fatalSimple(rc);
|
fatalSimple(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,15 +145,18 @@ void DmntCheatManager::OnNewApplicationLaunch() {
|
||||||
|
|
||||||
g_cheat_process_metadata.main_nso_extents.base = proc_modules[1].base_address;
|
g_cheat_process_metadata.main_nso_extents.base = proc_modules[1].base_address;
|
||||||
g_cheat_process_metadata.main_nso_extents.size = proc_modules[1].size;
|
g_cheat_process_metadata.main_nso_extents.size = proc_modules[1].size;
|
||||||
g_cheat_process_metadata.main_nso_build_id = proc_modules[1].build_id;
|
memcpy(g_cheat_process_metadata.main_nso_build_id, proc_modules[1].build_id, sizeof(g_cheat_process_metadata.main_nso_build_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: Read cheats off the SD. */
|
||||||
|
|
||||||
/* Open a debug handle. */
|
/* Open a debug handle. */
|
||||||
if (R_FAILED((rc = svcDebugActiveProcess(&g_cheat_process_debug_hnd, g_cheat_process_metadata.process_id)))) {
|
if (R_FAILED((rc = svcDebugActiveProcess(&g_cheat_process_debug_hnd, g_cheat_process_metadata.process_id)))) {
|
||||||
fatalSimple(rc);
|
fatalSimple(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Continue debug events, etc. */
|
/* Continue debug events, etc. */
|
||||||
|
ContinueCheatProcess();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DmntCheatManager::DetectThread(void *arg) {
|
void DmntCheatManager::DetectThread(void *arg) {
|
||||||
|
@ -131,11 +177,27 @@ void DmntCheatManager::DetectThread(void *arg) {
|
||||||
|
|
||||||
void DmntCheatManager::VmThread(void *arg) {
|
void DmntCheatManager::VmThread(void *arg) {
|
||||||
while (true) {
|
while (true) {
|
||||||
/* TODO */
|
/* Execute Cheat VM. */
|
||||||
|
{
|
||||||
|
/* Acquire lock. */
|
||||||
|
std::scoped_lock<HosMutex> lk(g_cheat_lock);
|
||||||
|
|
||||||
|
if (HasActiveCheatProcess()) {
|
||||||
|
ContinueCheatProcess();
|
||||||
|
|
||||||
|
/* TODO: Execute VM. */
|
||||||
|
}
|
||||||
|
}
|
||||||
svcSleepThread(0x5000000ul);
|
svcSleepThread(0x5000000ul);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DmntCheatManager::GetHasActiveCheatProcess() {
|
||||||
|
std::scoped_lock<HosMutex> lk(g_cheat_lock);
|
||||||
|
|
||||||
|
return HasActiveCheatProcess();
|
||||||
|
}
|
||||||
|
|
||||||
void DmntCheatManager::InitializeCheatManager() {
|
void DmntCheatManager::InitializeCheatManager() {
|
||||||
/* Spawn application detection thread, spawn cheat vm thread. */
|
/* Spawn application detection thread, spawn cheat vm thread. */
|
||||||
if (R_FAILED(g_detect_thread.Initialize(&DmntCheatManager::DetectThread, nullptr, 0x4000, 28))) {
|
if (R_FAILED(g_detect_thread.Initialize(&DmntCheatManager::DetectThread, nullptr, 0x4000, 28))) {
|
||||||
|
|
|
@ -26,6 +26,12 @@ class DmntCheatManager {
|
||||||
static void OnNewApplicationLaunch();
|
static void OnNewApplicationLaunch();
|
||||||
static void DetectThread(void *arg);
|
static void DetectThread(void *arg);
|
||||||
static void VmThread(void *arg);
|
static void VmThread(void *arg);
|
||||||
public:
|
|
||||||
|
static bool HasActiveCheatProcess();
|
||||||
|
static void CloseActiveCheatProcess();
|
||||||
|
static void ContinueCheatProcess();
|
||||||
|
public:;
|
||||||
|
static bool GetHasActiveCheatProcess();
|
||||||
|
|
||||||
static void InitializeCheatManager();
|
static void InitializeCheatManager();
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue