diff options
author | Zachary Turner <zturner@google.com> | 2015-01-21 23:26:40 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2015-01-21 23:26:40 +0000 |
commit | 5a7e8d09a814e707ada607f7a6656e33c24641cd (patch) | |
tree | ce2389da36928024fd3f2aa739b7d7c7b7966afd | |
parent | 0a9f607f7b63abf001c4fb119cb1f06a54951aeb (diff) | |
download | bcm5719-llvm-5a7e8d09a814e707ada607f7a6656e33c24641cd.tar.gz bcm5719-llvm-5a7e8d09a814e707ada607f7a6656e33c24641cd.zip |
Implement ProcessWindows::GetMemoryRegionInfo.
llvm-svn: 226742
-rw-r--r-- | lldb/source/Plugins/Process/Windows/ProcessWindows.cpp | 38 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/Windows/ProcessWindows.h | 1 |
2 files changed, 39 insertions, 0 deletions
diff --git a/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp index b02fa6c8ade..0e0701ab3ac 100644 --- a/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp +++ b/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp @@ -434,6 +434,44 @@ ProcessWindows::DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size return bytes_written; } +Error +ProcessWindows::GetMemoryRegionInfo(lldb::addr_t vm_addr, MemoryRegionInfo &info) +{ + Error error; + llvm::sys::ScopedLock lock(m_mutex); + + if (!m_session_data) + { + error.SetErrorString("ProcessWindows::GetMemoryRegionInfo called with no debugging session."); + return error; + } + + HostProcess process = m_session_data->m_debugger->GetProcess(); + lldb::process_t handle = process.GetNativeProcess().GetSystemHandle(); + if (handle == nullptr || handle == LLDB_INVALID_PROCESS) + { + error.SetErrorString("ProcessWindows::GetMemoryRegionInfo called with an invalid target process."); + return error; + } + + void *addr = reinterpret_cast<void *>(vm_addr); + MEMORY_BASIC_INFORMATION mem_info = {0}; + SIZE_T result = ::VirtualQueryEx(handle, addr, &mem_info, sizeof(mem_info)); + if (result == 0) + { + error.SetError(::GetLastError(), eErrorTypeWin32); + return error; + } + + bool readable = !(mem_info.Protect & PAGE_NOACCESS); + bool executable = mem_info.Protect & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY); + bool writable = mem_info.Protect & (PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY | PAGE_READWRITE | PAGE_WRITECOPY); + info.SetReadable(readable ? MemoryRegionInfo::eYes : MemoryRegionInfo::eNo); + info.SetExecutable(executable ? MemoryRegionInfo::eYes : MemoryRegionInfo::eNo); + info.SetWritable(writable ? MemoryRegionInfo::eYes : MemoryRegionInfo::eNo); + return error; +} + lldb::addr_t ProcessWindows::GetImageInfoAddress() { diff --git a/lldb/source/Plugins/Process/Windows/ProcessWindows.h b/lldb/source/Plugins/Process/Windows/ProcessWindows.h index dee8b78cc88..180ecaec9cb 100644 --- a/lldb/source/Plugins/Process/Windows/ProcessWindows.h +++ b/lldb/source/Plugins/Process/Windows/ProcessWindows.h @@ -102,6 +102,7 @@ public: size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, lldb_private::Error &error) override; size_t DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, lldb_private::Error &error) override; + lldb_private::Error GetMemoryRegionInfo(lldb::addr_t vm_addr, lldb_private::MemoryRegionInfo &info) override; // IDebugDelegate overrides. void OnExitProcess(uint32_t exit_code) override; |