/* * Copyright (c) 2018-2019 Atmosphère-NX * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "dmnt_cheat_service.hpp" #include "impl/dmnt_cheat_api.hpp" namespace sts::dmnt::cheat { /* ========================================================================================= */ /* ==================================== Meta Commands ==================================== */ /* ========================================================================================= */ void CheatService::HasCheatProcess(sf::Out out) { out.SetValue(dmnt::cheat::impl::GetHasActiveCheatProcess()); } void CheatService::GetCheatProcessEvent(sf::OutCopyHandle out_event) { out_event.SetValue(dmnt::cheat::impl::GetCheatProcessEventHandle()); } Result CheatService::GetCheatProcessMetadata(sf::Out out_metadata) { return dmnt::cheat::impl::GetCheatProcessMetadata(out_metadata.GetPointer()); } Result CheatService::ForceOpenCheatProcess() { if (R_FAILED(dmnt::cheat::impl::ForceOpenCheatProcess())) { return ResultDmntCheatNotAttached; } return ResultSuccess; } /* ========================================================================================= */ /* =================================== Memory Commands =================================== */ /* ========================================================================================= */ Result CheatService::GetCheatProcessMappingCount(sf::Out out_count) { return dmnt::cheat::impl::GetCheatProcessMappingCount(out_count.GetPointer()); } Result CheatService::GetCheatProcessMappings(const sf::OutArray &mappings, sf::Out out_count, u64 offset) { if (mappings.GetPointer() == nullptr) { return ResultDmntCheatNullBuffer; } return dmnt::cheat::impl::GetCheatProcessMappings(mappings.GetPointer(), mappings.GetSize(), out_count.GetPointer(), offset); } Result CheatService::ReadCheatProcessMemory(const sf::OutBuffer &buffer, u64 address, u64 out_size) { if (buffer.GetPointer() == nullptr) { return ResultDmntCheatNullBuffer; } return dmnt::cheat::impl::ReadCheatProcessMemory(address, buffer.GetPointer(), std::min(out_size, buffer.GetSize())); } Result CheatService::WriteCheatProcessMemory(const sf::InBuffer &buffer, u64 address, u64 in_size) { if (buffer.GetPointer() == nullptr) { return ResultDmntCheatNullBuffer; } return dmnt::cheat::impl::WriteCheatProcessMemory(address, buffer.GetPointer(), std::min(in_size, buffer.GetSize())); } Result CheatService::QueryCheatProcessMemory(sf::Out mapping, u64 address) { return dmnt::cheat::impl::QueryCheatProcessMemory(mapping.GetPointer(), address); } /* ========================================================================================= */ /* =================================== Cheat Commands ==================================== */ /* ========================================================================================= */ Result CheatService::GetCheatCount(sf::Out out_count) { return dmnt::cheat::impl::GetCheatCount(out_count.GetPointer()); } Result CheatService::GetCheats(const sf::OutArray &cheats, sf::Out out_count, u64 offset) { if (cheats.GetPointer() == nullptr) { return ResultDmntCheatNullBuffer; } return dmnt::cheat::impl::GetCheats(cheats.GetPointer(), cheats.GetSize(), out_count.GetPointer(), offset); } Result CheatService::GetCheatById(sf::Out cheat, u32 cheat_id) { return dmnt::cheat::impl::GetCheatById(cheat.GetPointer(), cheat_id); } Result CheatService::ToggleCheat(u32 cheat_id) { return dmnt::cheat::impl::ToggleCheat(cheat_id); } Result CheatService::AddCheat(const CheatDefinition &cheat, sf::Out out_cheat_id, bool enabled) { return dmnt::cheat::impl::AddCheat(out_cheat_id.GetPointer(), cheat, enabled); } Result CheatService::RemoveCheat(u32 cheat_id) { return dmnt::cheat::impl::RemoveCheat(cheat_id); } /* ========================================================================================= */ /* =================================== Address Commands ================================== */ /* ========================================================================================= */ Result CheatService::GetFrozenAddressCount(sf::Out out_count) { return dmnt::cheat::impl::GetFrozenAddressCount(out_count.GetPointer()); } Result CheatService::GetFrozenAddresses(const sf::OutArray &addresses, sf::Out out_count, u64 offset) { if (addresses.GetPointer() == nullptr) { return ResultDmntCheatNullBuffer; } return dmnt::cheat::impl::GetFrozenAddresses(addresses.GetPointer(), addresses.GetSize(), out_count.GetPointer(), offset); } Result CheatService::GetFrozenAddress(sf::Out entry, u64 address) { return dmnt::cheat::impl::GetFrozenAddress(entry.GetPointer(), address); } Result CheatService::EnableFrozenAddress(sf::Out out_value, u64 address, u64 width) { switch (width) { case 1: case 2: case 4: case 8: break; default: return ResultDmntCheatInvalidFreezeWidth; } return dmnt::cheat::impl::EnableFrozenAddress(out_value.GetPointer(), address, width); } Result CheatService::DisableFrozenAddress(u64 address) { return dmnt::cheat::impl::DisableFrozenAddress(address); } }