Some Appcall methods would fail if passed addresses with value zero

This commit is contained in:
elias.bachaalany 2010-09-17 12:04:27 +00:00
parent 0f64f33981
commit 36c814331a

View File

@ -532,8 +532,10 @@ class Appcall_callable__(object):
def __get_timeout(self): def __get_timeout(self):
return self.__timeout return self.__timeout
def __set_timeout(self, v): def __set_timeout(self, v):
self.__timeout = v self.__timeout = v
timeout = property(__get_timeout, __set_timeout) timeout = property(__get_timeout, __set_timeout)
"""An Appcall instance can change its timeout value with this attribute""" """An Appcall instance can change its timeout value with this attribute"""
@ -547,6 +549,7 @@ class Appcall_callable__(object):
else: else:
# Timeout is not set, then clear the timeout flag # Timeout is not set, then clear the timeout flag
v &= ~Appcall__.APPCALL_TIMEOUT v &= ~Appcall__.APPCALL_TIMEOUT
self.__options = v self.__options = v
options = property(__get_options, __set_options) options = property(__get_options, __set_options)
@ -554,11 +557,11 @@ class Appcall_callable__(object):
def __call__(self, *args): def __call__(self, *args):
"""Make object callable. We redirect execution to idaapi.appcall()""" """Make object callable. We redirect execution to idaapi.appcall()"""
if self.ea == None: if self.ea is None:
raise ValueError, "Object not callable!" raise ValueError, "Object not callable!"
# unpack arguments and convert to a list # convert arguments to a list
arg_list = [x for x in args] arg_list = list(args)
# Save appcall options and set new global options # Save appcall options and set new global options
old_opt = Appcall__.get_appcall_options() old_opt = Appcall__.get_appcall_options()
@ -582,10 +585,12 @@ class Appcall_callable__(object):
# Return or re-raise exception # Return or re-raise exception
if e_obj: if e_obj:
raise Exception, e_obj raise Exception, e_obj
return r return r
def __get_ea(self): def __get_ea(self):
return self.__ea return self.__ea
def __set_ea(self, val): def __set_ea(self, val):
self.__ea = val self.__ea = val
@ -611,6 +616,7 @@ class Appcall_callable__(object):
def __get_fields(self): def __get_fields(self):
return self.__fields return self.__fields
fields = property(__get_fields) fields = property(__get_fields)
"""Returns the field names""" """Returns the field names"""
@ -633,6 +639,9 @@ class Appcall_callable__(object):
def store(self, obj, dest_ea=None, base_ea=0, flags=0): def store(self, obj, dest_ea=None, base_ea=0, flags=0):
""" """
Packs an object into a given ea if provided or into a string if no address was passed. Packs an object into a given ea if provided or into a string if no address was passed.
@param obj: The object to pack
@param dest_ea: If packing to idb this will be the store location
@param base_ea: If packing to a buffer, this will be the base that will be used to relocate the pointers
@return: @return:
- If packing to a string then a Tuple(Boolean, packed_string or error code) - If packing to a string then a Tuple(Boolean, packed_string or error code)
@ -640,10 +649,20 @@ class Appcall_callable__(object):
""" """
# no ea passed? thus pack to a string # no ea passed? thus pack to a string
if not dest_ea: if dest_ea is None:
return _idaapi.pack_object_to_bv(obj, _idaapi.cvar.idati, self.type, self.fields, base_ea, flags) return _idaapi.pack_object_to_bv(obj,
_idaapi.cvar.idati,
self.type,
self.fields,
base_ea,
flags)
else: else:
return _idaapi.pack_object_to_idb(obj, _idaapi.cvar.idati, self.type, self.fields, dest_ea, flags) return _idaapi.pack_object_to_idb(obj,
_idaapi.cvar.idati,
self.type,
self.fields,
dest_ea,
flags)
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
class Appcall_consts__(object): class Appcall_consts__(object):
@ -688,9 +707,12 @@ class Appcall__(object):
@staticmethod @staticmethod
def __name_or_ea(name_or_ea): def __name_or_ea(name_or_ea):
"""Function that accepts a name or an ea and checks if the address is enabled. """
Function that accepts a name or an ea and checks if the address is enabled.
If a name is passed then idaapi.get_name_ea() is applied to retrieve the name If a name is passed then idaapi.get_name_ea() is applied to retrieve the name
@return: Returns the resolved EA or raises an exception if the address is not enabled @return:
- Returns the resolved EA or
- Raises an exception if the address is not enabled
""" """
# a string? try to resolve it # a string? try to resolve it
@ -705,16 +727,26 @@ class Appcall__(object):
@staticmethod @staticmethod
def proto(name_or_ea, prototype, flags = None): def proto(name_or_ea, prototype, flags = None):
"""Allows you to instantiate an appcall (callable object) with the desired prototype""" """
Allows you to instantiate an appcall (callable object) with the desired prototype
@param name_or_ea: The name of the function (will be resolved with LocByName())
@param prototype:
@return:
- On failure it raises an exception if the prototype could not be parsed
or the address is not resolvable
- Returns a callbable Appcall instance with the given prototypes and flags
"""
# resolve and raise exception on error # resolve and raise exception on error
ea = Appcall__.__name_or_ea(name_or_ea) ea = Appcall__.__name_or_ea(name_or_ea)
# parse the type # parse the type
if not flags: if not flags:
flags = 1 | 2 | 4 # PT_SIL | PT_NDC | PT_TYP flags = 1 | 2 | 4 # PT_SIL | PT_NDC | PT_TYP
result = _idaapi.idc_parse_decl(_idaapi.cvar.idati, prototype, flags) result = _idaapi.idc_parse_decl(_idaapi.cvar.idati, prototype, flags)
if not result: if not result:
raise ValueError, "Could not parse type: " + prototype raise ValueError, "Could not parse type: " + prototype
# Return the callable method with type info # Return the callable method with type info
return Appcall_callable__(ea, result[1], result[2]) return Appcall_callable__(ea, result[1], result[2])
@ -798,7 +830,7 @@ class Appcall__(object):
Parses a type string and returns an appcall object. Parses a type string and returns an appcall object.
One can then use retrieve() member method One can then use retrieve() member method
@param ea: Optional parameter that later can be used to retrieve the type @param ea: Optional parameter that later can be used to retrieve the type
@return: Appcall object @return: Appcall object or raises ValueError exception
""" """
# parse the type # parse the type
result = _idaapi.idc_parse_decl(_idaapi.cvar.idati, typestr, 1 | 2 | 4) # PT_SIL | PT_NDC | PT_TYP result = _idaapi.idc_parse_decl(_idaapi.cvar.idati, typestr, 1 | 2 | 4) # PT_SIL | PT_NDC | PT_TYP