1 //===-- ProcessWindows.h ----------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef liblldb_Plugins_Process_Windows_Common_ProcessWindows_H_
10 #define liblldb_Plugins_Process_Windows_Common_ProcessWindows_H_
11 
12 #include "lldb/Target/Process.h"
13 #include "lldb/Utility/Status.h"
14 #include "lldb/lldb-forward.h"
15 
16 #include "llvm/Support/Mutex.h"
17 
18 #include "IDebugDelegate.h"
19 #include "Plugins/DynamicLoader/Windows-DYLD/DynamicLoaderWindowsDYLD.h"
20 
21 namespace lldb_private {
22 
23 class HostProcess;
24 class ProcessWindowsData;
25 
26 class ProcessWindows : public Process, public IDebugDelegate {
27 public:
28   // Static functions.
29   static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp,
30                                         lldb::ListenerSP listener_sp,
31                                         const FileSpec *);
32 
33   static void Initialize();
34 
35   static void Terminate();
36 
37   static lldb_private::ConstString GetPluginNameStatic();
38 
39   static const char *GetPluginDescriptionStatic();
40 
41   // Constructors and destructors
42   ProcessWindows(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp);
43 
44   ~ProcessWindows();
45 
46   size_t GetSTDOUT(char *buf, size_t buf_size, Status &error) override;
47   size_t GetSTDERR(char *buf, size_t buf_size, Status &error) override;
48   size_t PutSTDIN(const char *buf, size_t buf_size, Status &error) override;
49 
50   // lldb_private::Process overrides
51   ConstString GetPluginName() override;
52   uint32_t GetPluginVersion() override;
53 
54   Status EnableBreakpointSite(BreakpointSite *bp_site) override;
55   Status DisableBreakpointSite(BreakpointSite *bp_site) override;
56 
57   Status DoDetach(bool keep_stopped) override;
58   Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) override;
59   Status DoAttachToProcessWithID(
60       lldb::pid_t pid,
61       const lldb_private::ProcessAttachInfo &attach_info) override;
62   Status DoResume() override;
63   Status DoDestroy() override;
64   Status DoHalt(bool &caused_stop) override;
65 
66   void DidLaunch() override;
67   void DidAttach(lldb_private::ArchSpec &arch_spec) override;
68 
69   void RefreshStateAfterStop() override;
70 
71   bool CanDebug(lldb::TargetSP target_sp,
72                 bool plugin_specified_by_name) override;
73   bool DestroyRequiresHalt() override { return false; }
74   bool UpdateThreadList(ThreadList &old_thread_list,
75                         ThreadList &new_thread_list) override;
76   bool IsAlive() override;
77 
78   size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size,
79                       Status &error) override;
80   size_t DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size,
81                        Status &error) override;
82   lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions,
83                                 Status &error) override;
84   Status DoDeallocateMemory(lldb::addr_t ptr) override;
85   Status GetMemoryRegionInfo(lldb::addr_t vm_addr,
86                              MemoryRegionInfo &info) override;
87 
88   lldb::addr_t GetImageInfoAddress() override;
89 
90   DynamicLoaderWindowsDYLD *GetDynamicLoader() override;
91 
92   // IDebugDelegate overrides.
93   void OnExitProcess(uint32_t exit_code) override;
94   void OnDebuggerConnected(lldb::addr_t image_base) override;
95   ExceptionResult OnDebugException(bool first_chance,
96                                    const ExceptionRecord &record) override;
97   void OnCreateThread(const HostThread &thread) override;
98   void OnExitThread(lldb::tid_t thread_id, uint32_t exit_code) override;
99   void OnLoadDll(const ModuleSpec &module_spec,
100                  lldb::addr_t module_addr) override;
101   void OnUnloadDll(lldb::addr_t module_addr) override;
102   void OnDebugString(const std::string &string) override;
103   void OnDebuggerError(const Status &error, uint32_t type) override;
104 
105 private:
106   Status WaitForDebuggerConnection(DebuggerThreadSP debugger,
107                                    HostProcess &process);
108 
109   // These decode the page protection bits.
110   static bool IsPageReadable(uint32_t protect);
111   static bool IsPageWritable(uint32_t protect);
112   static bool IsPageExecutable(uint32_t protect);
113 
114   llvm::sys::Mutex m_mutex;
115   std::unique_ptr<ProcessWindowsData> m_session_data;
116 };
117 }
118 
119 #endif // liblldb_Plugins_Process_Windows_Common_ProcessWindows_H_
120