118a9135dSAdrian McCarthy //===-- ProcessWindows.cpp --------------------------------------*- C++ -*-===// 218a9135dSAdrian McCarthy // 318a9135dSAdrian McCarthy // The LLVM Compiler Infrastructure 418a9135dSAdrian McCarthy // 518a9135dSAdrian McCarthy // This file is distributed under the University of Illinois Open Source 618a9135dSAdrian McCarthy // License. See LICENSE.TXT for details. 718a9135dSAdrian McCarthy // 818a9135dSAdrian McCarthy //===----------------------------------------------------------------------===// 918a9135dSAdrian McCarthy 1018a9135dSAdrian McCarthy #include "ProcessWindows.h" 1118a9135dSAdrian McCarthy 1218a9135dSAdrian McCarthy // Other libraries and framework includes 1318a9135dSAdrian McCarthy #include "lldb/Core/Module.h" 1418a9135dSAdrian McCarthy #include "lldb/Core/ModuleSpec.h" 1518a9135dSAdrian McCarthy #include "lldb/Core/PluginManager.h" 1618a9135dSAdrian McCarthy #include "lldb/Core/Section.h" 1718a9135dSAdrian McCarthy #include "lldb/Core/State.h" 18*0c35cde9SAdrian McCarthy #include "lldb/Host/windows/windows.h" 1918a9135dSAdrian McCarthy #include "lldb/Target/DynamicLoader.h" 2018a9135dSAdrian McCarthy #include "lldb/Target/MemoryRegionInfo.h" 2118a9135dSAdrian McCarthy #include "lldb/Target/Target.h" 2218a9135dSAdrian McCarthy 2318a9135dSAdrian McCarthy using namespace lldb; 2418a9135dSAdrian McCarthy using namespace lldb_private; 2518a9135dSAdrian McCarthy 2618a9135dSAdrian McCarthy namespace lldb_private 2718a9135dSAdrian McCarthy { 2818a9135dSAdrian McCarthy 2918a9135dSAdrian McCarthy //------------------------------------------------------------------------------ 3018a9135dSAdrian McCarthy // Constructors and destructors. 3118a9135dSAdrian McCarthy 3218a9135dSAdrian McCarthy ProcessWindows::ProcessWindows(lldb::TargetSP target_sp, Listener &listener) 3318a9135dSAdrian McCarthy : lldb_private::Process(target_sp, listener) 3418a9135dSAdrian McCarthy { 3518a9135dSAdrian McCarthy } 3618a9135dSAdrian McCarthy 3718a9135dSAdrian McCarthy ProcessWindows::~ProcessWindows() 3818a9135dSAdrian McCarthy { 3918a9135dSAdrian McCarthy } 4018a9135dSAdrian McCarthy 4118a9135dSAdrian McCarthy size_t 4218a9135dSAdrian McCarthy ProcessWindows::GetSTDOUT(char *buf, size_t buf_size, Error &error) 4318a9135dSAdrian McCarthy { 4418a9135dSAdrian McCarthy error.SetErrorString("GetSTDOUT unsupported on Windows"); 4518a9135dSAdrian McCarthy return 0; 4618a9135dSAdrian McCarthy } 4718a9135dSAdrian McCarthy 4818a9135dSAdrian McCarthy size_t 4918a9135dSAdrian McCarthy ProcessWindows::GetSTDERR(char *buf, size_t buf_size, Error &error) 5018a9135dSAdrian McCarthy { 5118a9135dSAdrian McCarthy error.SetErrorString("GetSTDERR unsupported on Windows"); 5218a9135dSAdrian McCarthy return 0; 5318a9135dSAdrian McCarthy } 5418a9135dSAdrian McCarthy 5518a9135dSAdrian McCarthy size_t 5618a9135dSAdrian McCarthy ProcessWindows::PutSTDIN(const char *buf, size_t buf_size, Error &error) 5718a9135dSAdrian McCarthy { 5818a9135dSAdrian McCarthy error.SetErrorString("PutSTDIN unsupported on Windows"); 5918a9135dSAdrian McCarthy return 0; 6018a9135dSAdrian McCarthy } 6118a9135dSAdrian McCarthy 6218a9135dSAdrian McCarthy //------------------------------------------------------------------------------ 6318a9135dSAdrian McCarthy // ProcessInterface protocol. 6418a9135dSAdrian McCarthy 6518a9135dSAdrian McCarthy 6618a9135dSAdrian McCarthy lldb::addr_t 6718a9135dSAdrian McCarthy ProcessWindows::GetImageInfoAddress() 6818a9135dSAdrian McCarthy { 6918a9135dSAdrian McCarthy Target &target = GetTarget(); 7018a9135dSAdrian McCarthy ObjectFile *obj_file = target.GetExecutableModule()->GetObjectFile(); 7118a9135dSAdrian McCarthy Address addr = obj_file->GetImageInfoAddress(&target); 7218a9135dSAdrian McCarthy if (addr.IsValid()) 7318a9135dSAdrian McCarthy return addr.GetLoadAddress(&target); 7418a9135dSAdrian McCarthy else 7518a9135dSAdrian McCarthy return LLDB_INVALID_ADDRESS; 7618a9135dSAdrian McCarthy } 7718a9135dSAdrian McCarthy 78*0c35cde9SAdrian McCarthy // The Windows page protection bits are NOT independent masks that can be bitwise-ORed 79*0c35cde9SAdrian McCarthy // together. For example, PAGE_EXECUTE_READ is not (PAGE_EXECUTE | PAGE_READ). 80*0c35cde9SAdrian McCarthy // To test for an access type, it's necessary to test for any of the bits that provide 81*0c35cde9SAdrian McCarthy // that access type. 82*0c35cde9SAdrian McCarthy bool 83*0c35cde9SAdrian McCarthy ProcessWindows::IsPageReadable(uint32_t protect) 84*0c35cde9SAdrian McCarthy { 85*0c35cde9SAdrian McCarthy return (protect & PAGE_NOACCESS) == 0; 86*0c35cde9SAdrian McCarthy } 87*0c35cde9SAdrian McCarthy 88*0c35cde9SAdrian McCarthy bool 89*0c35cde9SAdrian McCarthy ProcessWindows::IsPageWritable(uint32_t protect) 90*0c35cde9SAdrian McCarthy { 91*0c35cde9SAdrian McCarthy return (protect & (PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY | PAGE_READWRITE | PAGE_WRITECOPY)) != 0; 92*0c35cde9SAdrian McCarthy } 93*0c35cde9SAdrian McCarthy 94*0c35cde9SAdrian McCarthy bool 95*0c35cde9SAdrian McCarthy ProcessWindows::IsPageExecutable(uint32_t protect) 96*0c35cde9SAdrian McCarthy { 97*0c35cde9SAdrian McCarthy return (protect & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)) != 0; 98*0c35cde9SAdrian McCarthy } 99*0c35cde9SAdrian McCarthy 10018a9135dSAdrian McCarthy } 101