diff options
author | bunnei <bunneidev@gmail.com> | 2015-07-20 00:34:41 -0400 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2015-07-20 00:34:41 -0400 |
commit | cd2bb2dc698d5ce142394a22c5abff0cb89d431a (patch) | |
tree | 41175f58f896e2a911d9e2ab1143411c881f7698 /src/core/hle/svc.cpp | |
parent | 863a963911160f7d336379ed661fe8be5bebdd20 (diff) | |
parent | 83fa3f977dc270f638af5325c0f998a94ccdd883 (diff) |
Merge pull request #939 from Subv/queryprocmem
Kernel/SVC: Implemented svcQueryProcessMemory
Diffstat (limited to 'src/core/hle/svc.cpp')
-rw-r--r-- | src/core/hle/svc.cpp | 22 |
1 files changed, 16 insertions, 6 deletions
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; + + auto vma = process->address_space->FindVMA(addr); - if (vma == Kernel::g_current_process->address_space->vma_map.end()) + 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"); |