1caea440aSMed Ismail Bennaniimport os,struct, signal
2caea440aSMed Ismail Bennani
3caea440aSMed Ismail Bennanifrom typing import Any, Dict
4caea440aSMed Ismail Bennani
5caea440aSMed Ismail Bennaniimport lldb
6caea440aSMed Ismail Bennanifrom lldb.plugins.scripted_process import ScriptedProcess
7caea440aSMed Ismail Bennanifrom lldb.plugins.scripted_process import ScriptedThread
8caea440aSMed Ismail Bennani
9caea440aSMed Ismail Bennaniclass InvalidScriptedProcess(ScriptedProcess):
10caea440aSMed Ismail Bennani    def __init__(self, target: lldb.SBTarget, args : lldb.SBStructuredData):
11caea440aSMed Ismail Bennani        super().__init__(target, args)
12d3e0f7e1SMed Ismail Bennani        self.threads[0] = InvalidScriptedThread(self, None)
13caea440aSMed Ismail Bennani
14caea440aSMed Ismail Bennani    def get_memory_region_containing_address(self, addr: int) -> lldb.SBMemoryRegionInfo:
15caea440aSMed Ismail Bennani        return None
16caea440aSMed Ismail Bennani
17caea440aSMed Ismail Bennani    def get_thread_with_id(self, tid: int):
18caea440aSMed Ismail Bennani        return {}
19caea440aSMed Ismail Bennani
20caea440aSMed Ismail Bennani    def get_registers_for_thread(self, tid: int):
21caea440aSMed Ismail Bennani        return {}
22caea440aSMed Ismail Bennani
23caea440aSMed Ismail Bennani    def read_memory_at_address(self, addr: int, size: int) -> lldb.SBData:
24caea440aSMed Ismail Bennani        return None
25caea440aSMed Ismail Bennani
26caea440aSMed Ismail Bennani    def get_loaded_images(self):
27caea440aSMed Ismail Bennani        return self.loaded_images
28caea440aSMed Ismail Bennani
29caea440aSMed Ismail Bennani    def get_process_id(self) -> int:
30caea440aSMed Ismail Bennani        return 666
31caea440aSMed Ismail Bennani
32caea440aSMed Ismail Bennani    def should_stop(self) -> bool:
33caea440aSMed Ismail Bennani        return True
34caea440aSMed Ismail Bennani
35caea440aSMed Ismail Bennani    def is_alive(self) -> bool:
36caea440aSMed Ismail Bennani        return True
37caea440aSMed Ismail Bennani
38caea440aSMed Ismail Bennani    def get_scripted_thread_plugin(self):
39caea440aSMed Ismail Bennani        return InvalidScriptedThread.__module__ + "." + InvalidScriptedThread.__name__
40caea440aSMed Ismail Bennani
41caea440aSMed Ismail Bennani
42caea440aSMed Ismail Bennaniclass InvalidScriptedThread(ScriptedThread):
43caea440aSMed Ismail Bennani    def __init__(self, process, args):
44caea440aSMed Ismail Bennani        super().__init__(process, args)
45caea440aSMed Ismail Bennani
46caea440aSMed Ismail Bennani    def get_thread_id(self) -> int:
47caea440aSMed Ismail Bennani        return 0x19
48caea440aSMed Ismail Bennani
49caea440aSMed Ismail Bennani    def get_name(self) -> str:
50caea440aSMed Ismail Bennani        return InvalidScriptedThread.__name__ + ".thread-1"
51caea440aSMed Ismail Bennani
52caea440aSMed Ismail Bennani    def get_state(self) -> int:
53caea440aSMed Ismail Bennani        return lldb.eStateInvalid
54caea440aSMed Ismail Bennani
55caea440aSMed Ismail Bennani    def get_stop_reason(self) -> Dict[str, Any]:
56caea440aSMed Ismail Bennani        return { "type": lldb.eStopReasonSignal, "data": {
57*f5e5074cSMed Ismail Bennani            "signal": signal.SIGTRAP
58caea440aSMed Ismail Bennani        } }
59caea440aSMed Ismail Bennani
60caea440aSMed Ismail Bennani    def get_register_context(self) -> str:
61caea440aSMed Ismail Bennani        return None
62caea440aSMed Ismail Bennani
63caea440aSMed Ismail Bennanidef __lldb_init_module(debugger, dict):
64caea440aSMed Ismail Bennani    if not 'SKIP_SCRIPTED_PROCESS_LAUNCH' in os.environ:
65caea440aSMed Ismail Bennani        debugger.HandleCommand(
66caea440aSMed Ismail Bennani            "process launch -C %s.%s" % (__name__,
67caea440aSMed Ismail Bennani                                     InvalidScriptedProcess.__name__))
68caea440aSMed Ismail Bennani    else:
69caea440aSMed Ismail Bennani        print("Name of the class that will manage the scripted process: '%s.%s'"
70caea440aSMed Ismail Bennani                % (__name__, InvalidScriptedProcess.__name__))
71