1# Copyright (c) 2016, Tomohiro Kusumi 2# All rights reserved. 3# 4# Redistribution and use in source and binary forms, with or without 5# modification, are permitted provided that the following conditions are met: 6# 7# 1. Redistributions of source code must retain the above copyright notice, this 8# list of conditions and the following disclaimer. 9# 2. Redistributions in binary form must reproduce the above copyright notice, 10# this list of conditions and the following disclaimer in the documentation 11# and/or other materials provided with the distribution. 12# 13# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 14# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 17# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 20# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 24import sys 25 26from . import setting 27from . import util 28 29class Error (util.GenericError): 30 pass 31 32try: 33 from . import _native 34 _e = None 35except Exception: # not only ImportError 36 _e = sys.exc_info()[1] 37 _native = None 38 if setting.use_debug: 39 raise 40 41def get_so(safe=False): 42 if not _native: 43 if safe: 44 return None 45 raise Error(repr(_e)) 46 return _native 47 48def is_enabled(): 49 return get_so(True) is not None 50 51def get_blkdev_info(f): 52 return get_so().get_blkdev_info(f) 53 54def has_ptrace(): 55 return get_ptrace_word_size() > 0 56 57def ptrace_peektext(pid, addr): 58 return get_so().ptrace_peektext(pid, addr) 59 60def ptrace_peekdata(pid, addr): 61 return get_so().ptrace_peekdata(pid, addr) 62 63def ptrace_poketext(pid, addr, data): 64 return get_so().ptrace_poketext(pid, addr, data) 65 66def ptrace_pokedata(pid, addr, data): 67 return get_so().ptrace_pokedata(pid, addr, data) 68 69def ptrace_attach(pid): 70 return get_so().ptrace_attach(pid) 71 72def ptrace_detach(pid): 73 return get_so().ptrace_detach(pid) 74 75def get_ptrace_word_size(): 76 try: 77 return get_so().get_ptrace_word_size() 78 except Exception: 79 return -1 # don't raise an exception 80