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