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 9*2238dcc3SJonas Devlieghere 10caea440aSMed Ismail Bennaniclass InvalidScriptedProcess(ScriptedProcess): 11bb4ccc66SMed Ismail Bennani def __init__(self, exe_ctx: lldb.SBExecutionContext, args: lldb.SBStructuredData): 12bb4ccc66SMed Ismail Bennani super().__init__(exe_ctx, args) 13d3e0f7e1SMed Ismail Bennani self.threads[0] = InvalidScriptedThread(self, None) 14caea440aSMed Ismail Bennani 15*2238dcc3SJonas Devlieghere def read_memory_at_address( 16*2238dcc3SJonas Devlieghere self, addr: int, size: int, error: lldb.SBError 17*2238dcc3SJonas Devlieghere ) -> lldb.SBData: 187e01924eSMed Ismail Bennani error.SetErrorString("This is an invalid scripted process!") 197e01924eSMed Ismail Bennani return lldb.SBData() 20caea440aSMed Ismail Bennani 21caea440aSMed Ismail Bennani def get_loaded_images(self): 22caea440aSMed Ismail Bennani return self.loaded_images 23caea440aSMed Ismail Bennani 24caea440aSMed Ismail Bennani def get_process_id(self) -> int: 25caea440aSMed Ismail Bennani return 666 26caea440aSMed Ismail Bennani 27caea440aSMed Ismail Bennani def should_stop(self) -> bool: 28caea440aSMed Ismail Bennani return True 29caea440aSMed Ismail Bennani 30caea440aSMed Ismail Bennani def is_alive(self) -> bool: 31caea440aSMed Ismail Bennani return True 32caea440aSMed Ismail Bennani 33caea440aSMed Ismail Bennani def get_scripted_thread_plugin(self): 34caea440aSMed Ismail Bennani return InvalidScriptedThread.__module__ + "." + InvalidScriptedThread.__name__ 35caea440aSMed Ismail Bennani 36caea440aSMed Ismail Bennani 37caea440aSMed Ismail Bennaniclass InvalidScriptedThread(ScriptedThread): 38caea440aSMed Ismail Bennani def __init__(self, process, args): 39caea440aSMed Ismail Bennani super().__init__(process, args) 40caea440aSMed Ismail Bennani 41caea440aSMed Ismail Bennani def get_thread_id(self) -> int: 42caea440aSMed Ismail Bennani return 0x19 43caea440aSMed Ismail Bennani 44caea440aSMed Ismail Bennani def get_name(self) -> str: 45caea440aSMed Ismail Bennani return InvalidScriptedThread.__name__ + ".thread-1" 46caea440aSMed Ismail Bennani 47caea440aSMed Ismail Bennani def get_state(self) -> int: 48caea440aSMed Ismail Bennani return lldb.eStateInvalid 49caea440aSMed Ismail Bennani 50caea440aSMed Ismail Bennani def get_stop_reason(self) -> Dict[str, Any]: 51*2238dcc3SJonas Devlieghere return {"type": lldb.eStopReasonSignal, "data": {"signal": signal.SIGTRAP}} 52caea440aSMed Ismail Bennani 53caea440aSMed Ismail Bennani def get_register_context(self) -> str: 54caea440aSMed Ismail Bennani return None 55caea440aSMed Ismail Bennani 56*2238dcc3SJonas Devlieghere 57caea440aSMed Ismail Bennanidef __lldb_init_module(debugger, dict): 58*2238dcc3SJonas Devlieghere if not "SKIP_SCRIPTED_PROCESS_LAUNCH" in os.environ: 59caea440aSMed Ismail Bennani debugger.HandleCommand( 60*2238dcc3SJonas Devlieghere "process launch -C %s.%s" % (__name__, InvalidScriptedProcess.__name__) 61*2238dcc3SJonas Devlieghere ) 62caea440aSMed Ismail Bennani else: 63*2238dcc3SJonas Devlieghere print( 64*2238dcc3SJonas Devlieghere "Name of the class that will manage the scripted process: '%s.%s'" 65*2238dcc3SJonas Devlieghere % (__name__, InvalidScriptedProcess.__name__) 66*2238dcc3SJonas Devlieghere ) 67