1f3176f5fSMed Ismail Bennanifrom abc import ABCMeta, abstractmethod
2f3176f5fSMed Ismail Bennaniimport six
3f3176f5fSMed Ismail Bennani
4f3176f5fSMed Ismail Bennaniimport lldb
5f3176f5fSMed Ismail Bennani
6f3176f5fSMed Ismail Bennani@six.add_metaclass(ABCMeta)
7f3176f5fSMed Ismail Bennaniclass ScriptedProcess:
8f3176f5fSMed Ismail Bennani
9f3176f5fSMed Ismail Bennani    """
10f3176f5fSMed Ismail Bennani    The base class for a scripted process.
11f3176f5fSMed Ismail Bennani
12f3176f5fSMed Ismail Bennani    Most of the base class methods are `@abstractmethod` that need to be
13f3176f5fSMed Ismail Bennani    overwritten by the inheriting class.
14f3176f5fSMed Ismail Bennani
15f3176f5fSMed Ismail Bennani    DISCLAIMER: THIS INTERFACE IS STILL UNDER DEVELOPMENT AND NOT STABLE.
16f3176f5fSMed Ismail Bennani                THE METHODS EXPOSED MIGHT CHANGE IN THE FUTURE.
17f3176f5fSMed Ismail Bennani    """
18f3176f5fSMed Ismail Bennani
19f3176f5fSMed Ismail Bennani    @abstractmethod
20f3176f5fSMed Ismail Bennani    def __init__(self, target, args):
21f3176f5fSMed Ismail Bennani        """ Construct a scripted process.
22f3176f5fSMed Ismail Bennani
23f3176f5fSMed Ismail Bennani        Args:
24f3176f5fSMed Ismail Bennani            target (lldb.SBTarget): The target launching the scripted process.
25f3176f5fSMed Ismail Bennani            args (lldb.SBStructuredData): A Dictionary holding arbitrary
26f3176f5fSMed Ismail Bennani                key/value pairs used by the scripted process.
27f3176f5fSMed Ismail Bennani        """
28f3176f5fSMed Ismail Bennani        self.target = None
29f3176f5fSMed Ismail Bennani        self.args = None
30f3176f5fSMed Ismail Bennani        if isinstance(target, lldb.SBTarget) and target.IsValid():
31f3176f5fSMed Ismail Bennani            self.target = target
32f3176f5fSMed Ismail Bennani        if isinstance(args, lldb.SBStructuredData) and args.IsValid():
33f3176f5fSMed Ismail Bennani            self.args = args
34f3176f5fSMed Ismail Bennani
35f3176f5fSMed Ismail Bennani    @abstractmethod
36f3176f5fSMed Ismail Bennani    def get_memory_region_containing_address(addr):
37f3176f5fSMed Ismail Bennani        """ Get the memory region for the scripted process, containing a
38f3176f5fSMed Ismail Bennani            specific address.
39f3176f5fSMed Ismail Bennani
40f3176f5fSMed Ismail Bennani        Args:
41f3176f5fSMed Ismail Bennani            addr (int): Address to look for in the scripted process memory
42f3176f5fSMed Ismail Bennani                regions.
43f3176f5fSMed Ismail Bennani
44f3176f5fSMed Ismail Bennani        Returns:
45f3176f5fSMed Ismail Bennani            lldb.SBMemoryRegionInfo: The memory region containing the address.
46f3176f5fSMed Ismail Bennani                None if out of bounds.
47f3176f5fSMed Ismail Bennani        """
48f3176f5fSMed Ismail Bennani        pass
49f3176f5fSMed Ismail Bennani
50f3176f5fSMed Ismail Bennani    @abstractmethod
51f3176f5fSMed Ismail Bennani    def get_thread_with_id(tid):
52f3176f5fSMed Ismail Bennani        """ Get the scripted process thread with a specific ID.
53f3176f5fSMed Ismail Bennani
54f3176f5fSMed Ismail Bennani        Args:
55f3176f5fSMed Ismail Bennani            tid (int): Thread ID to look for in the scripted process.
56f3176f5fSMed Ismail Bennani
57f3176f5fSMed Ismail Bennani        Returns:
58f3176f5fSMed Ismail Bennani            Dict: The thread represented as a dictionary, withr the
59f3176f5fSMed Ismail Bennani                tid thread ID. None if tid doesn't match any of the scripted
60f3176f5fSMed Ismail Bennani                process threads.
61f3176f5fSMed Ismail Bennani        """
62f3176f5fSMed Ismail Bennani        pass
63f3176f5fSMed Ismail Bennani
64f3176f5fSMed Ismail Bennani    @abstractmethod
65f3176f5fSMed Ismail Bennani    def get_registers_for_thread(tid):
66f3176f5fSMed Ismail Bennani        """ Get the register context dictionary for a certain thread of
67f3176f5fSMed Ismail Bennani            the scripted process.
68f3176f5fSMed Ismail Bennani
69f3176f5fSMed Ismail Bennani        Args:
70f3176f5fSMed Ismail Bennani            tid (int): Thread ID for the thread's register context.
71f3176f5fSMed Ismail Bennani
72f3176f5fSMed Ismail Bennani        Returns:
73f3176f5fSMed Ismail Bennani            Dict: The register context represented as a dictionary, for the
74f3176f5fSMed Ismail Bennani                tid thread. None if tid doesn't match any of the scripted
75f3176f5fSMed Ismail Bennani                process threads.
76f3176f5fSMed Ismail Bennani        """
77f3176f5fSMed Ismail Bennani        pass
78f3176f5fSMed Ismail Bennani
79f3176f5fSMed Ismail Bennani    @abstractmethod
80f3176f5fSMed Ismail Bennani    def read_memory_at_address(addr, size):
81f3176f5fSMed Ismail Bennani        """ Get a memory buffer from the scripted process at a certain address,
82f3176f5fSMed Ismail Bennani            of a certain size.
83f3176f5fSMed Ismail Bennani
84f3176f5fSMed Ismail Bennani        Args:
85f3176f5fSMed Ismail Bennani            addr (int): Address from which we should start reading.
86f3176f5fSMed Ismail Bennani            size (int): Size of the memory to read.
87f3176f5fSMed Ismail Bennani
88f3176f5fSMed Ismail Bennani        Returns:
89f3176f5fSMed Ismail Bennani            lldb.SBData: An `lldb.SBData` buffer with the target byte size and
90f3176f5fSMed Ismail Bennani                byte order storing the memory read.
91f3176f5fSMed Ismail Bennani        """
92f3176f5fSMed Ismail Bennani        pass
93f3176f5fSMed Ismail Bennani
94f3176f5fSMed Ismail Bennani    @abstractmethod
95f3176f5fSMed Ismail Bennani    def get_loaded_images(self):
96f3176f5fSMed Ismail Bennani        """ Get the list of loaded images for the scripted process.
97f3176f5fSMed Ismail Bennani
98f3176f5fSMed Ismail Bennani        ```
99f3176f5fSMed Ismail Bennani        class ScriptedProcessImage:
100f3176f5fSMed Ismail Bennani            def __init__(name, file_spec, uuid, load_address):
101f3176f5fSMed Ismail Bennani              self.name = name
102f3176f5fSMed Ismail Bennani              self.file_spec = file_spec
103f3176f5fSMed Ismail Bennani              self.uuid = uuid
104f3176f5fSMed Ismail Bennani              self.load_address = load_address
105f3176f5fSMed Ismail Bennani        ```
106f3176f5fSMed Ismail Bennani
107f3176f5fSMed Ismail Bennani        Returns:
108f3176f5fSMed Ismail Bennani            List[ScriptedProcessImage]: A list of `ScriptedProcessImage`
109f3176f5fSMed Ismail Bennani                containing for each entry, the name of the library, a UUID,
110f3176f5fSMed Ismail Bennani                an `lldb.SBFileSpec` and a load address.
111f3176f5fSMed Ismail Bennani                None if the list is empty.
112f3176f5fSMed Ismail Bennani        """
113f3176f5fSMed Ismail Bennani        pass
114f3176f5fSMed Ismail Bennani
115f3176f5fSMed Ismail Bennani    def get_process_id(self):
116f3176f5fSMed Ismail Bennani        """ Get the scripted process identifier.
117f3176f5fSMed Ismail Bennani
118f3176f5fSMed Ismail Bennani        Returns:
119f3176f5fSMed Ismail Bennani            int: The scripted process identifier.
120f3176f5fSMed Ismail Bennani        """
121f3176f5fSMed Ismail Bennani        return 0
122f3176f5fSMed Ismail Bennani
123f3176f5fSMed Ismail Bennani
124f3176f5fSMed Ismail Bennani    def launch(self):
125f3176f5fSMed Ismail Bennani        """ Simulate the scripted process launch.
126f3176f5fSMed Ismail Bennani
127f3176f5fSMed Ismail Bennani        Returns:
128f3176f5fSMed Ismail Bennani            lldb.SBError: An `lldb.SBError` with error code 0.
129f3176f5fSMed Ismail Bennani        """
130f3176f5fSMed Ismail Bennani        return lldb.SBError()
131f3176f5fSMed Ismail Bennani
132f3176f5fSMed Ismail Bennani    def resume(self):
133f3176f5fSMed Ismail Bennani        """ Simulate the scripted process resume.
134f3176f5fSMed Ismail Bennani
135f3176f5fSMed Ismail Bennani        Returns:
136f3176f5fSMed Ismail Bennani            lldb.SBError: An `lldb.SBError` with error code 0.
137f3176f5fSMed Ismail Bennani        """
138f3176f5fSMed Ismail Bennani        return lldb.SBError()
139f3176f5fSMed Ismail Bennani
140f3176f5fSMed Ismail Bennani    @abstractmethod
141*312b43daSMed Ismail Bennani    def should_stop(self):
142*312b43daSMed Ismail Bennani        """ Check if the scripted process plugin should produce the stop event.
143*312b43daSMed Ismail Bennani
144*312b43daSMed Ismail Bennani        Returns:
145*312b43daSMed Ismail Bennani            bool: True if scripted process should broadcast a stop event.
146*312b43daSMed Ismail Bennani                  False otherwise.
147*312b43daSMed Ismail Bennani        """
148*312b43daSMed Ismail Bennani        pass
149*312b43daSMed Ismail Bennani
150*312b43daSMed Ismail Bennani    def stop(self):
151*312b43daSMed Ismail Bennani        """ Trigger the scripted process stop.
152*312b43daSMed Ismail Bennani
153*312b43daSMed Ismail Bennani        Returns:
154*312b43daSMed Ismail Bennani            lldb.SBError: An `lldb.SBError` with error code 0.
155*312b43daSMed Ismail Bennani        """
156*312b43daSMed Ismail Bennani        return lldb.SBError()
157*312b43daSMed Ismail Bennani
158*312b43daSMed Ismail Bennani    @abstractmethod
159f3176f5fSMed Ismail Bennani    def is_alive(self):
160f3176f5fSMed Ismail Bennani        """ Check if the scripted process is alive.
161f3176f5fSMed Ismail Bennani
162f3176f5fSMed Ismail Bennani        Returns:
163f3176f5fSMed Ismail Bennani            bool: True if scripted process is alive. False otherwise.
164f3176f5fSMed Ismail Bennani        """
165f3176f5fSMed Ismail Bennani        pass
166