def _buildVsType(self, tname, tsize, tflags): if tflags & VSFF_POINTER: if tsize == 4: return vs_prim.v_ptr32() elif tsize == 8: return vs_prim.v_ptr64() else: raise Exception('Invalid Pointer Width: %d' % tsize) if tname is not None: return self.buildVStruct(tname) if tsize not in TSIZES: return v_bytes(size=tsize) return prim_types[tsize]()
def _buildVsType(self, tname, tsize, tflags): if tflags & VSFF_POINTER: if tsize == 4: return vs_prim.v_ptr32() elif tsize == 8: return vs_prim.v_ptr64() else: raise Exception('Invalid Pointer Width: %d' % tsize) if tname is not None: return self.buildVStruct(tname) if tsize not in [1, 2, 4, 8]: return v_bytes(size=tsize) return prim_types[tsize]()
def buildVStruct(self, vsname): # Check for a namespace parts = vsname.split('.', 1) if len(parts) == 2: ns = self._vs_namespaces.get(parts[0]) if ns == None: raise Exception( 'Namespace %s is not present! (need symbols?)' % parts[0]) # If a module gets added as a namespace, assume it has a class def... if isinstance(ns, types.ModuleType): cls = getattr(ns, parts[1]) if cls == None: raise Exception('Unknown VStruct Definition: %s' % vsname) return cls() return ns.buildVStruct(parts[1]) vsdef = self._vs_defs.get(vsname) if vsdef == None: raise Exception('Unknown VStruct Definition: %s' % vsname) vsname, vssize, vskids = vsdef vs = vstruct.VStruct() vs._vs_name = vsname for fname, foffset, fsize, ftypename, fflags in vskids: if fflags & VSFF_POINTER: # FIXME support pointers with types! if fsize == 4: fieldval = vs_prim.v_ptr32() elif fsize == 8: fieldval = vs_prim.v_ptr64() else: raise Exception('Invalid Pointer Width: %d' % fsize) elif fflags & VSFF_ARRAY: if ftypename != None: fieldval = vstruct.VArray() while len(fieldval) < fsize: fieldval.vsAddElement(self.buildVStruct(ftypename)) else: # FIXME actually handle arrays! fieldval = vs_prim.v_bytes(size=fsize) elif ftypename == None: if fsize not in [1, 2, 4, 8]: #print 'Primitive Field Size: %d' % fsize fieldval = v_bytes(size=fsize) else: fieldval = prim_types[fsize]() else: fieldval = self.buildVStruct(ftypename) cursize = len(vs) if foffset < cursize: #print 'FIXME handle unions, overlaps, etc...' continue if foffset > cursize: setattr(vs, '_pad%.4x' % foffset, vs_prim.v_bytes(size=(foffset - cursize))) setattr(vs, fname, fieldval) return vs
def buildVStruct(self, vsname): # Check for a namespace parts = vsname.split('.', 1) if len(parts) == 2: ns = self._vs_namespaces.get(parts[0]) if ns == None: raise Exception('Namespace %s is not present! (need symbols?)' % parts[0]) # If a module gets added as a namespace, assume it has a class def... if isinstance(ns, types.ModuleType): cls = getattr(ns, parts[1]) if cls == None: raise Exception('Unknown VStruct Definition: %s' % vsname) return cls() return ns.buildVStruct(parts[1]) vsdef = self._vs_defs.get(vsname) if vsdef == None: raise Exception('Unknown VStruct Definition: %s' % vsname) vsname, vssize, vskids = vsdef vs = vstruct.VStruct() vs._vs_name = vsname for fname, foffset, fsize, ftypename, fflags in vskids: if fflags & VSFF_POINTER: # FIXME support pointers with types! if fsize == 4: fieldval = vs_prim.v_ptr32() elif fsize == 8: fieldval = vs_prim.v_ptr64() else: raise Exception('Invalid Pointer Width: %d' % fsize) elif fflags & VSFF_ARRAY: if ftypename != None: fieldval = vstruct.VArray() while len(fieldval) < fsize: fieldval.vsAddElement( self.buildVStruct(ftypename) ) else: # FIXME actually handle arrays! fieldval = vs_prim.v_bytes(size=fsize) elif ftypename == None: if fsize not in [1,2,4,8]: #print 'Primitive Field Size: %d' % fsize fieldval = v_bytes(size=fsize) else: fieldval = prim_types[fsize]() else: fieldval = self.buildVStruct(ftypename) cursize = len(vs) if foffset < cursize: #print 'FIXME handle unions, overlaps, etc...' continue if foffset > cursize: setattr(vs, '_pad%.4x' % foffset, vs_prim.v_bytes(size=(foffset-cursize))) setattr(vs, fname, fieldval) return vs