summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2015-01-21 23:26:40 +0000
committerZachary Turner <zturner@google.com>2015-01-21 23:26:40 +0000
commit5a7e8d09a814e707ada607f7a6656e33c24641cd (patch)
treece2389da36928024fd3f2aa739b7d7c7b7966afd
parent0a9f607f7b63abf001c4fb119cb1f06a54951aeb (diff)
downloadbcm5719-llvm-5a7e8d09a814e707ada607f7a6656e33c24641cd.tar.gz
bcm5719-llvm-5a7e8d09a814e707ada607f7a6656e33c24641cd.zip
Implement ProcessWindows::GetMemoryRegionInfo.
llvm-svn: 226742
-rw-r--r--lldb/source/Plugins/Process/Windows/ProcessWindows.cpp38
-rw-r--r--lldb/source/Plugins/Process/Windows/ProcessWindows.h1
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;
OpenPOWER on IntegriCloud