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