From 83fa3f977dc270f638af5325c0f998a94ccdd883 Mon Sep 17 00:00:00 2001
From: Subv <subv2112@gmail.com>
Date: Fri, 17 Jul 2015 14:45:12 -0500
Subject: [PATCH] Kernel/SVC: Implemented svcQueryProcessMemory

---
 src/core/hle/function_wrappers.h | 12 ++++++++++++
 src/core/hle/svc.cpp             | 22 ++++++++++++++++------
 2 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/core/hle/function_wrappers.h b/src/core/hle/function_wrappers.h
index 1ac6032a6..9294789ec 100644
--- a/src/core/hle/function_wrappers.h
+++ b/src/core/hle/function_wrappers.h
@@ -99,6 +99,18 @@ template<ResultCode func(MemoryInfo*, PageInfo*, u32)> void Wrap() {
     FuncReturn(retval);
 }
 
+template<ResultCode func(MemoryInfo*, PageInfo*, Handle, u32)> void Wrap() {
+    MemoryInfo memory_info = {};
+    PageInfo page_info = {};
+    u32 retval = func(&memory_info, &page_info, PARAM(2), PARAM(3)).raw;
+    Core::g_app_core->SetReg(1, memory_info.base_address);
+    Core::g_app_core->SetReg(2, memory_info.size);
+    Core::g_app_core->SetReg(3, memory_info.permission);
+    Core::g_app_core->SetReg(4, memory_info.state);
+    Core::g_app_core->SetReg(5, page_info.flags);
+    FuncReturn(retval);
+}
+
 template<ResultCode func(s32*, u32)> void Wrap(){
     s32 param_1 = 0;
     u32 retval = func(&param_1, PARAM(1)).raw;
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp
index 9d441ccfc..802ecc52a 100644
--- a/src/core/hle/svc.cpp
+++ b/src/core/hle/svc.cpp
@@ -530,11 +530,16 @@ static ResultCode ReleaseSemaphore(s32* count, Handle handle, s32 release_count)
     return RESULT_SUCCESS;
 }
 
-/// Query memory
-static ResultCode QueryMemory(MemoryInfo* memory_info, PageInfo* page_info, u32 addr) {
-    auto vma = Kernel::g_current_process->address_space->FindVMA(addr);
+/// Query process memory
+static ResultCode QueryProcessMemory(MemoryInfo* memory_info, PageInfo* page_info, Handle process_handle, u32 addr) {
+    using Kernel::Process;
+    Kernel::SharedPtr<Process> process = Kernel::g_handle_table.Get<Process>(process_handle);
+    if (process == nullptr)
+        return ERR_INVALID_HANDLE;
 
-    if (vma == Kernel::g_current_process->address_space->vma_map.end())
+    auto vma = process->address_space->FindVMA(addr);
+
+    if (vma == process->address_space->vma_map.end())
         return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::OS, ErrorSummary::InvalidArgument, ErrorLevel::Usage);
 
     memory_info->base_address = vma->second.base;
@@ -543,10 +548,15 @@ static ResultCode QueryMemory(MemoryInfo* memory_info, PageInfo* page_info, u32
     memory_info->state = static_cast<u32>(vma->second.meminfo_state);
 
     page_info->flags = 0;
-    LOG_TRACE(Kernel_SVC, "called addr=0x%08X", addr);
+    LOG_TRACE(Kernel_SVC, "called process=0x%08X addr=0x%08X", process_handle, addr);
     return RESULT_SUCCESS;
 }
 
+/// Query memory
+static ResultCode QueryMemory(MemoryInfo* memory_info, PageInfo* page_info, u32 addr) {
+    return QueryProcessMemory(memory_info, page_info, Kernel::CurrentProcess, addr);
+}
+
 /// Create an event
 static ResultCode CreateEvent(Handle* out_handle, u32 reset_type) {
     using Kernel::Event;
@@ -818,7 +828,7 @@ static const FunctionDef SVC_Table[] = {
     {0x7A, nullptr,                         "AddCodeSegment"},
     {0x7B, nullptr,                         "Backdoor"},
     {0x7C, nullptr,                         "KernelSetState"},
-    {0x7D, nullptr,                         "QueryProcessMemory"},
+    {0x7D, HLE::Wrap<QueryProcessMemory>,   "QueryProcessMemory"},
 };
 
 Common::Profiling::TimingCategory profiler_svc("SVC Calls");