diff --git a/volatility/__init__.py b/volatility/__init__.py index e69de29bb..f436a3cc1 100644 --- a/volatility/__init__.py +++ b/volatility/__init__.py @@ -0,0 +1 @@ +"""Volatility 3 - An open-source memory forensics framework""" diff --git a/volatility/framework/__init__.py b/volatility/framework/__init__.py index 0185b4dc2..d48258f6d 100644 --- a/volatility/framework/__init__.py +++ b/volatility/framework/__init__.py @@ -1,4 +1,4 @@ -### +# ## # # Libtool version scheme # @@ -11,13 +11,15 @@ # 3. If only additions to the interface have been made, increment age # 4. If changes or removals of the interface have been made, set age to 0 -_current = 3 # Number of releases of the library with any change -_revision = 0 # Number of changes that don't affect the interface -_age = 0 # Number of consecutive versions of the interface the current version supports +CURRENT = 3 # Number of releases of the library with any change +REVISION = 0 # Number of changes that don't affect the interface +AGE = 0 # Number of consecutive versions of the interface the current version supports + def version(): """Provides the so version number of the library""" - return _current - _age, _age, _revision + return CURRENT - AGE, AGE, REVISION + def require_version(*args): """Checks the required version of a plugin""" @@ -31,8 +33,10 @@ def require_version(*args): " is an older revision than the required version " + ".".join([str(x) for x in args[0:2]])) + from volatility.framework import interfaces, symbols, layers + class Context(interfaces.context.ContextInterface): """Maintains the context within which to construct objects @@ -54,7 +58,7 @@ class Context(interfaces.context.ContextInterface): self._symbol_space = symbols.SymbolSpace(natives) self._memory = layers.Memory() - ### Symbol Space Functions + # ## Symbol Space Functions @property def symbol_space(self): @@ -67,7 +71,7 @@ class Context(interfaces.context.ContextInterface): """A Memory object, allowing access to all data and translation layers currently available within the context""" return self._memory - ### Address Space Functions + # ## Address Space Functions def add_translation_layer(self, layer): """Adds a named translation layer to the context @@ -78,14 +82,14 @@ class Context(interfaces.context.ContextInterface): """ self._memory.add_layer(layer) - ### Object Factory Functions + # ## Object Factory Functions def object(self, symbol, layer_name, offset): """Object factory, takes a context, symbol, offset and optional layername - + Looks up the layername in the context, finds the object template based on the symbol, and constructs an object using the object template on the layer at the offset. - + :return: A fully constructed object :rtype: :py:class:`volatility.framework.interfaces.objects.ObjectInterface` """ diff --git a/volatility/framework/config.py b/volatility/framework/config.py index b1af15b3e..3926b9194 100644 --- a/volatility/framework/config.py +++ b/volatility/framework/config.py @@ -6,8 +6,10 @@ Created on 7 May 2013 from volatility.framework import validity + class Option(validity.ValidityRoutines): """Class to handle a single specific configuration option""" + def __init__(self, name, option_type, definition = None, description = None): """Creates a new option""" self.type_check(option_type, type) @@ -18,20 +20,24 @@ class Option(validity.ValidityRoutines): @property def option_type(self): + """The data type of the Option, such as string, integer, etc""" return self._option_type @property def name(self): + """The name of the Option.""" return self._name @property def description(self): + """A short description of what the Option is designed to affect or achieve.""" return self._description @property def definition(self): return self._definition + class ConfigurationGroup(validity.ValidityRoutines): """Class to handle configuration groups, contains options""" @@ -50,6 +56,7 @@ class ConfigurationGroup(validity.ValidityRoutines): self._options[name] = value raise TypeError("Attribute " + name + " must be an Option object") + class Configuration(validity.ValidityRoutines): """Class to handle configuration, contains configuration groups""" diff --git a/volatility/framework/interfaces/context.py b/volatility/framework/interfaces/context.py index a900a37d3..3b2d4890d 100644 --- a/volatility/framework/interfaces/context.py +++ b/volatility/framework/interfaces/context.py @@ -5,6 +5,7 @@ Created on 6 May 2013 """ from abc import ABCMeta, abstractmethod, abstractproperty + class ContextInterface(object): """All context-like objects must adhere to the following interface. @@ -15,13 +16,13 @@ class ContextInterface(object): def __init__(self): """Initializes the context with a symbol_space""" - ### Symbol Space Functions + # ## Symbol Space Functions @abstractproperty def symbol_space(self): """Returns the symbol_space for the context""" - ### Memory Functions + # ## Memory Functions @abstractproperty def memory(self): @@ -32,15 +33,15 @@ class ContextInterface(object): """Adds a named translation layer to the context memory""" self.memory.add_layer(layer) - ### Object Factory Functions + # ## Object Factory Functions @abstractmethod def object(self, symbol, layer_name, offset): """Object factory, takes a context, symbol, offset and optional layer_name - + Looks up the layer_name in the context, finds the object template based on the symbol, - and constructs an object using the object template on the layer at the offset. - + and constructs an object using the object template on the layer at the offset. + Returns a fully constructed object """ diff --git a/volatility/framework/interfaces/layers.py b/volatility/framework/interfaces/layers.py index db77ce961..156522d25 100644 --- a/volatility/framework/interfaces/layers.py +++ b/volatility/framework/interfaces/layers.py @@ -9,6 +9,7 @@ from volatility.framework import validity, exceptions from volatility.framework.interfaces import context as context_module from abc import ABCMeta, abstractmethod, abstractproperty + class DataLayerInterface(validity.ValidityRoutines): """A Layer that directly holds data (and does not translate it""" __metaclass__ = ABCMeta @@ -39,22 +40,21 @@ class DataLayerInterface(validity.ValidityRoutines): @abstractmethod def read(self, offset, length, pad = False): """Reads an offset for length bytes and returns 'bytes' (not 'str') of length size - + If there is a fault of any kind (such as a page fault), an exception will be thrown unless pad is set, in which case the read errors will be replaced by null characters. """ @abstractmethod def write(self, offset, data): - """Writes a chunk of data at offset. - + """Writes a chunk of data at offset. + Any unavailable sections in the underlying bases will cause an exception to be thrown. Note: Writes are not atomic, therefore some data can be written, even if an exception is thrown. """ class TranslationLayerInterface(DataLayerInterface): - @abstractmethod def translate(self, offset): """Returns a tuple of (offset, layer) indicating the translation of input domain to the output range""" @@ -62,7 +62,7 @@ class TranslationLayerInterface(DataLayerInterface): @abstractmethod def mapping(self, offset, length): """Returns a sorted list of (offset, mapped_offset, length, layer) mappings - + This allows translation layers to provide maps of contiguous regions in one layer """ return [] @@ -71,7 +71,7 @@ class TranslationLayerInterface(DataLayerInterface): def dependencies(self): """Returns a list of layer names that this layer translates onto""" - ### Read/Write functions for mapped pages + # ## Read/Write functions for mapped pages def read(self, offset, length, pad = False): """Reads an offset for length bytes and returns 'bytes' (not 'str') of length size""" diff --git a/volatility/framework/interfaces/objects.py b/volatility/framework/interfaces/objects.py index bf1163b7b..2d92c23cb 100644 --- a/volatility/framework/interfaces/objects.py +++ b/volatility/framework/interfaces/objects.py @@ -5,9 +5,11 @@ Created on 6 May 2013 """ import copy +from abc import ABCMeta, abstractmethod + from volatility.framework import validity from volatility.framework.interfaces import context as context_module -from abc import ABCMeta, abstractmethod + class ObjectInterface(validity.ValidityRoutines): """ A base object required to be the ancestor of every object used in volatility """ @@ -38,11 +40,13 @@ class ObjectInterface(validity.ValidityRoutines): object_template = self._context.symbol_space.resolve(new_structure_name) return object_template(context = self._context, layer_name = self._layer_name, offset = self._offset) + class Template(object): """Class for all Factories that take offsets, and data layers and produce objects - + This is effectively a class for currying object calls """ + def __init__(self, structure_name = None, **kwargs): """Stores the keyword arguments for later use""" self._kwargs = kwargs diff --git a/volatility/framework/interfaces/symbols.py b/volatility/framework/interfaces/symbols.py index f0f5e6cd7..c64f8ad94 100644 --- a/volatility/framework/interfaces/symbols.py +++ b/volatility/framework/interfaces/symbols.py @@ -6,6 +6,7 @@ Created on 4 May 2013 from volatility.framework import validity, exceptions + class SymbolTableInterface(validity.ValidityRoutines): """Handles a table of symbols""" @@ -16,11 +17,11 @@ class SymbolTableInterface(validity.ValidityRoutines): self.name = name or None self._native_structures = native_structures - ### Required Constant symbol functions + # ## Required Constant symbol functions def get_constant(self, name): """Resolves a symbol name into a constant - + If the symbol isn't found, it raises a SymbolError exception """ raise NotImplementedError("Abstract property get_constant not implemented by subclass.") @@ -30,11 +31,11 @@ class SymbolTableInterface(validity.ValidityRoutines): """Returns an iterator of the constant symbols""" raise NotImplementedError("Abstract property constants not implemented by subclass.") - ### Required Structure symbol functions + # ## Required Structure symbol functions def get_structure(self, name): """Resolves a symbol name into an object template - + If the symbol isn't found it raises a SymbolError exception """ raise NotImplementedError("Abstract method get_structure not implemented by subclass.") @@ -44,7 +45,7 @@ class SymbolTableInterface(validity.ValidityRoutines): """Returns an iterator of the structure symbols""" raise NotImplementedError("Abstract property structures not implemented by subclass.") - ### Native Type Handler + # ## Native Type Handler @property def natives(self): @@ -68,10 +69,11 @@ class SymbolTableInterface(validity.ValidityRoutines): """Removes the associated class override for a specific structure symbol""" raise NotImplementedError("Abstract method del_structure_class not implemented yet.") -# ### Helper functions that can be overridden + +# ### Helper functions that can be overridden # -# def __len__(self): -# """Returns the number of items in the symbol list""" +# def __len__(self): +# """Returns the number of items in the symbol list""" # return len(self.structures) # # def __getitem__(self, key): @@ -93,7 +95,7 @@ class NativeTableInterface(SymbolTableInterface): """Class to distinguish NativeSymbolLists from other symbol lists""" @staticmethod - def constant(self): + def constant(): raise exceptions.SymbolError("NativeTables never hold constants") @property diff --git a/volatility/framework/layers/__init__.py b/volatility/framework/layers/__init__.py index 56bbf125d..fd8a266fb 100644 --- a/volatility/framework/layers/__init__.py +++ b/volatility/framework/layers/__init__.py @@ -7,6 +7,7 @@ Created on 4 May 2013 from volatility.framework import validity, interfaces, exceptions from volatility.framework.layers import physical, intel + class Memory(validity.ValidityRoutines): """Container for multiple layers of data""" @@ -15,7 +16,7 @@ class Memory(validity.ValidityRoutines): def read(self, layer, offset, length, pad = False): """Reads from a particular layer at offset for length bytes - + Returns 'bytes' not 'str' """ return self[layer].read(offset, length, pad) @@ -26,7 +27,7 @@ class Memory(validity.ValidityRoutines): def add_layer(self, layer): """Adds a layer to memory model - + This will throw an exception if the required dependencies are not met """ self.type_check(layer, interfaces.layers.DataLayerInterface) @@ -41,7 +42,7 @@ class Memory(validity.ValidityRoutines): def del_layer(self, name): """Removes the layer called name - + This will throw an exception if other layers depend upon this layer """ for layer in self._layers: diff --git a/volatility/framework/layers/intel.py b/volatility/framework/layers/intel.py index b907ebc86..19236f443 100644 --- a/volatility/framework/layers/intel.py +++ b/volatility/framework/layers/intel.py @@ -6,8 +6,10 @@ Created on 7 May 2013 import math import struct + from volatility.framework import interfaces, exceptions + class Intel(interfaces.layers.TranslationLayerInterface): """Translation Layer for the Intel IA32 memory mapping""" @@ -43,7 +45,7 @@ class Intel(interfaces.layers.TranslationLayerInterface): def _translate(self, offset): """Translates a specific offset based on paging tables - + Returns the offset and the pagesize """ # Setup the entry and how far we are through the offset @@ -88,7 +90,7 @@ class Intel(interfaces.layers.TranslationLayerInterface): def mapping(self, offset, length): """Returns a sorted list of (offset, mapped_offset, length, layer) mappings - + This allows translation layers to provide maps of contiguous regions in one layer """ result = [] @@ -100,6 +102,7 @@ class Intel(interfaces.layers.TranslationLayerInterface): result.append((chunk_offset, chunk_size)) return result + class IntelPAE(Intel): """Class for handling Physical Address Extensions for Intel architectures""" @@ -116,8 +119,8 @@ class IntelPAE(Intel): ('page directory', 9, True), ('page table', 9, True)] -class Intel32e(Intel): +class Intel32e(Intel): def __init__(self, *args, **kwargs): Intel.__init__(self, *args, **kwargs) @@ -132,17 +135,17 @@ class Intel32e(Intel): ('page directory', 9, True), ('page table', 9, True)] -class WindowsMixin(object): +class WindowsMixin(object): @staticmethod def _page_is_valid(entry): """Returns whether a particular page is valid based on its entry - + Windows uses additional "available" bits to store flags These flags allow windows to determine whether a page is still valid - + Bit 11 is the transition flag, and Bit 10 is the prototype flag - + For more information, see Windows Internals (6th Ed, Part 2, pages 268-269) """ - return (entry & 1) or ((entry & 1 << 11) and not (entry & 1 << 10)) + return (entry & 1) or ((entry & 1 << 11) and not entry & 1 << 10) diff --git a/volatility/framework/layers/physical.py b/volatility/framework/layers/physical.py index 852f4bf0f..97489de32 100644 --- a/volatility/framework/layers/physical.py +++ b/volatility/framework/layers/physical.py @@ -5,8 +5,10 @@ Created on 6 May 2013 """ import os.path + from volatility.framework import interfaces, exceptions + class BufferDataLayer(interfaces.layers.DataLayerInterface): """A DataLayer class backed by a buffer in memory, designed for testing and swift data access""" @@ -37,6 +39,7 @@ class BufferDataLayer(interfaces.layers.DataLayerInterface): self.type_check(data, bytes) self._buffer = self._buffer[:address] + data + self._buffer[address + len(data):] + class FileLayer(interfaces.layers.DataLayerInterface): """a DataLayer backed by a file on the filesystem""" @@ -81,7 +84,7 @@ class FileLayer(interfaces.layers.DataLayerInterface): def write(self, offset, data): """Writes to the file - + This will technically allow writes beyond the extent of the file """ if not self.is_valid(offset): diff --git a/volatility/framework/objects/__init__.py b/volatility/framework/objects/__init__.py index d79f2cc02..4dd3658aa 100644 --- a/volatility/framework/objects/__init__.py +++ b/volatility/framework/objects/__init__.py @@ -6,11 +6,14 @@ Created on 17 Feb 2013 import struct import collections + from volatility.framework import interfaces from volatility.framework.objects import templates + class Void(interfaces.objects.ObjectInterface): """Returns an object to represent void/unknown types""" + @classmethod def template_size(cls, arguments): """Dummy size for Void objects""" @@ -25,6 +28,7 @@ class Void(interfaces.objects.ObjectInterface): def template_replace_child(cls, old_child, new_child, arguments): """Dummy method that does nothing for Void objects""" + class PrimitiveObject(interfaces.objects.ObjectInterface): """PrimitiveObject is an interface for any objects that should simulate a Python primitive""" @@ -59,6 +63,7 @@ class PrimitiveObject(interfaces.objects.ObjectInterface): def template_replace_child(cls, old_child, new_child, arguments): """Since this template can't ever have children, this method can be empty""" + class Integer(PrimitiveObject, int): """Primitive Object that handles standard numeric types""" @@ -72,6 +77,7 @@ class Integer(PrimitiveObject, int): return self._context.memory.write(self._layer_name, self._offset, data) raise TypeError("Integer objects require an integer to be written") + class Float(PrimitiveObject, float): """Primitive Object that handles double or floating point numbers""" @@ -85,6 +91,7 @@ class Float(PrimitiveObject, float): return self._context.memory.write(self._layer_name, self._offset, data) raise TypeError("Float objects require a float to be written") + class Bytes(PrimitiveObject, bytes): """Primitive Object that handles specific series of bytes""" @@ -104,9 +111,10 @@ class Bytes(PrimitiveObject, bytes): return self._context.memory.write(self._layer_name, self._offset, data) raise TypeError("Bytes objects require a bytes type to be written") + class String(PrimitiveObject, str): """Primitive Object that handles string values - + length: specifies the maximum possible length that the string could hold in memory """ @@ -126,8 +134,10 @@ class String(PrimitiveObject, str): return self._context.memory.write(self._layer_name, self._offset, data) raise TypeError("String objects require a string to be written") + class Pointer(Integer): """Pointer which points to another object""" + def __init__(self, context, layer_name, offset, structure_name, size = None, parent = None, struct_format = None, target = None): if not isinstance(target, templates.ObjectTemplate): @@ -170,8 +180,10 @@ class Pointer(Integer): if arguments['target'] == old_child: arguments['target'] = new_child + class BitField(PrimitiveObject, int): """Object containing a field which is made up of bits rather than whole bytes""" + def __new__(cls, context, layer_name, offset, structure_name, size = None, parent = None, target = None, start_bit = 0, end_bit = 0, **kwargs): value = target(context = context, @@ -192,6 +204,7 @@ class BitField(PrimitiveObject, int): def write(self, value): raise NotImplementedError("Writing to BitFields is not yet implemented") + class Enumeration(interfaces.objects.ObjectInterface): """Returns an object made up of choices""" # FIXME: Add in body for the enumeration object @@ -202,8 +215,10 @@ class Enumeration(interfaces.objects.ObjectInterface): def write(self, value): raise NotImplementedError("Writing to Enumerations is not yet implemented") + class Array(interfaces.objects.ObjectInterface, collections.Sequence): """Object which can contain a fixed number of an object type""" + def __init__(self, context, layer_name, offset, structure_name, size = None, parent = None, count = 0, target = None): if not isinstance(target, templates.ObjectTemplate): @@ -251,6 +266,7 @@ class Array(interfaces.objects.ObjectInterface, collections.Sequence): def write(self, value): raise NotImplementedError("Writing to Arrays is not yet implemented") + class Struct(interfaces.objects.ObjectInterface): """Object which can contain members that are other objects""" diff --git a/volatility/framework/objects/templates.py b/volatility/framework/objects/templates.py index fba88298b..939131236 100644 --- a/volatility/framework/objects/templates.py +++ b/volatility/framework/objects/templates.py @@ -6,15 +6,17 @@ Created on 1 Mar 2013 from volatility.framework import interfaces, validity + class ObjectTemplate(interfaces.objects.Template, validity.ValidityRoutines): """Factory class that produces objects that adhere to the Object interface on demand - + This is effectively a method of currying, but adds more structure to avoid abuse. It also allows inspection of information that should already be known: * Structure size * Members, etc etc. """ + def __init__(self, object_class = None, structure_name = None, **kwargs): interfaces.objects.Template.__init__(self, structure_name = structure_name, **kwargs) self.class_check(object_class, interfaces.objects.ObjectInterface) @@ -36,34 +38,37 @@ class ObjectTemplate(interfaces.objects.Template, validity.ValidityRoutines): @property def children(self): """A function that returns a list of child templates of a template - + This is used to traverse the template tree """ return self.object_class.template_children(self._kwargs) def replace_child(self, old_child, new_child): """A function for replacing one child with another - + We pass in the kwargs directly so they can be changed """ self.object_class.template_replace_child(old_child, new_child, self._kwargs) def __call__(self, context, layer_name, offset, parent = None): """Constructs the object - - Returns: an object adhereing to the Object interface + + Returns: an object adhereing to the Object interface """ # We always use the template size (as calculated by the object class) # over the one passed in by an argument self._kwargs['size'] = self.size self._kwargs['structure_name'] = self.structure_name - return self.object_class(context = context, layer_name = layer_name, offset = offset, parent = parent, **self._kwargs) + return self.object_class(context = context, layer_name = layer_name, offset = offset, parent = parent, + **self._kwargs) + class ReferenceTemplate(interfaces.objects.Template): """Factory class that produces objects based on a delayed reference type - - It should not return any attributes + + It should not return any attributes """ + def __call__(self, context, *args, **kwargs): template = context.symbol_space.get_structure(self._structure_name) return template(context = context, *args, **kwargs) diff --git a/volatility/framework/plugins/__init__.py b/volatility/framework/plugins/__init__.py index a307d328c..4db04d4f2 100644 --- a/volatility/framework/plugins/__init__.py +++ b/volatility/framework/plugins/__init__.py @@ -1,4 +1,2 @@ - - # TODO: Code to import all the py/pyc files available (but not both). -# TODO: Code to return a none-instantiated list of plugin classes. \ No newline at end of file +# TODO: Code to return a none-instantiated list of plugin classes. diff --git a/volatility/framework/renderers/__init__.py b/volatility/framework/renderers/__init__.py index 141977fdc..183bf18ff 100644 --- a/volatility/framework/renderers/__init__.py +++ b/volatility/framework/renderers/__init__.py @@ -82,8 +82,8 @@ class TreeGrid(TreeRow): converted_columns = [] for (name, column_type, column_format) in columns: is_simple_type = False - for t in self.simple_types: - is_simple_type = is_simple_type or issubclass(column_type, t) + for stype in self.simple_types: + is_simple_type = is_simple_type or issubclass(column_type, stype) if not is_simple_type: raise TypeError("Column " + name + "'s type " + column_type.__class__.__name__ + " is not a simple type") @@ -135,7 +135,7 @@ class FormatSpecification(object): # noinspection PyShadowingBuiltins def __init__(self, fill = None, align = None, sign = None, alt = None, zero = None, width = None, - precision = None, type = None): + precision = None, type = None): # pylint: disable=W0622 self._fill = fill self._align = align self._sign = sign @@ -297,4 +297,4 @@ class FormatSpecification(object): (str(self.width) if self.width else '') + (("." + str(self.precision)) if self.precision or self.precision == 0 else '') + (self.type or '')) - return spec \ No newline at end of file + return spec diff --git a/volatility/framework/renderers/basic.py b/volatility/framework/renderers/basic.py index 032cb149e..3b4e04796 100644 --- a/volatility/framework/renderers/basic.py +++ b/volatility/framework/renderers/basic.py @@ -1,10 +1,9 @@ -from framework.renderers import FormatSpecification - __author__ = 'mike' +import sys + from volatility.framework.interfaces import renderers as interface from volatility.framework import renderers -import sys class TextRenderer(interface.Renderer): @@ -40,8 +39,9 @@ class TextRenderer(interface.Renderer): # Then print out the headers and the values at their appropriate spacings # Potentially warn if the output is likely to be longer than the display area. - headers = [("{0:" + FormatSpecification(width = column_maximum_widths[column.index], fill = ' ', - align = '^').to_string() + "}").format(column.name) for column in + headers = [("{0:" + renderers.FormatSpecification(width = column_maximum_widths[column.index], fill = ' ', + align = '^').to_string() + "}").format(column.name) for column + in grid.columns] print(sep.join(headers)) @@ -50,4 +50,4 @@ class TextRenderer(interface.Renderer): for column in grid.columns: row_text.append(("{:" + column.format.to_string() + "}").format(row.values[column.index])) line = sep.join(row_text) - sys.stdout.write(line + "\n") \ No newline at end of file + sys.stdout.write(line + "\n") diff --git a/volatility/framework/symbols/__init__.py b/volatility/framework/symbols/__init__.py index 0de80f305..dd95a64ee 100644 --- a/volatility/framework/symbols/__init__.py +++ b/volatility/framework/symbols/__init__.py @@ -5,11 +5,13 @@ Created on 7 Feb 2013 ''' import collections + from volatility.framework import objects, interfaces, exceptions + class SymbolSpace(collections.Mapping): """Handles an ordered collection of SymbolTables - + This collection is ordered so that resolution of symbols can proceed down through the ranks if a namespace isn't specified. """ @@ -63,7 +65,7 @@ class SymbolSpace(collections.Mapping): def get_structure(self, symbol): """Takes a symbol name and resolves it - + This method ensures that all referenced templates (including self-referential templates) are satisfied as ObjectTemplates """ diff --git a/volatility/framework/symbols/native.py b/volatility/framework/symbols/native.py index fe7767c75..55445375e 100644 --- a/volatility/framework/symbols/native.py +++ b/volatility/framework/symbols/native.py @@ -4,8 +4,10 @@ Created on 10 Apr 2013 @author: mike ''' import copy + from volatility.framework import objects, interfaces + class NativeTable(interfaces.symbols.NativeTableInterface): """Symbol List that handles Native types""" @@ -18,7 +20,7 @@ class NativeTable(interfaces.symbols.NativeTableInterface): self._overrides[native_type] = native_class # Create this once early, because it may get used a lot self._structures = set(self._native_dictionary.keys()).union( - {'Enumeration', 'array', 'BitField', 'void', 'pointer'}) + set(['Enumeration', 'array', 'BitField', 'void', 'pointer'])) def get_structure_class(self, name): ntype, fmt = native_types.get(name, (objects.Integer, '')) @@ -31,43 +33,47 @@ class NativeTable(interfaces.symbols.NativeTableInterface): def get_structure(self, structure_name): """Resolves a symbol name into an object template - + symbol_space is used to resolve any target symbols if they don't exist in this list """ additional = {} if structure_name == 'void': return objects.templates.ObjectTemplate(objects.Void, structure_name = structure_name) elif structure_name == 'array': - return objects.templates.ObjectTemplate(objects.Array, structure_name = structure_name, count = 0, target = self.get_structure('void')) + return objects.templates.ObjectTemplate(objects.Array, structure_name = structure_name, count = 0, + target = self.get_structure('void')) elif structure_name == 'Enumeration': - return objects.templates.ObjectTemplate(objects.Enumeration, structure_name = structure_name, target = self.get_structure('void'), choices = {}) + return objects.templates.ObjectTemplate(objects.Enumeration, structure_name = structure_name, + target = self.get_structure('void'), choices = {}) elif structure_name == 'BitField': - return objects.templates.ObjectTemplate(objects.BitField, structure_name = structure_name, start_bit = 0, end_bit = 0) + return objects.templates.ObjectTemplate(objects.BitField, structure_name = structure_name, start_bit = 0, + end_bit = 0) _native_type, native_format = self._native_dictionary[structure_name] if structure_name == 'pointer': additional = {'target': self.get_structure('void')} - return objects.templates.ObjectTemplate(self.get_structure_class(structure_name), #pylint: disable-msg=W0142 - structure_name = structure_name, - struct_format = native_format, - **additional) + return objects.templates.ObjectTemplate(self.get_structure_class(structure_name), # pylint: disable=W0142 + structure_name = structure_name, + struct_format = native_format, + **additional) -native_types = {'int' : (objects.Integer, 'H'), - 'short' : (objects.Integer, 'H'), + 'short': (objects.Integer, '