Ignore:
Timestamp:
10/09/10 17:55:44 (14 years ago)
Author:
tim
Message:

worked on pyregfi value data interface

added initial scons target for API/devel documentation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/python/pyregfi/__init__.py

    r208 r209  
    132132
    133133
    134 
     134def _charss2strlist(chars_pointer):
     135    ret_val = []
     136    i = 0
     137    s = chars_pointer[i]
     138    while s != None:
     139        ret_val.append(s.decode('utf-8'))
     140        i += 1
     141        s = chars_pointer[i]
     142
     143    return ret_val
     144               
    135145
    136146class _StructureWrapper():
     
    196206            name = name.encode('utf-8')
    197207
    198         if self.find_element(self.hive.file, self.key.base,
    199                              create_string_buffer(name), byref(index)):
     208        if name != None:
     209            name = create_string_buffer(bytes(name))
     210
     211        if self.find_element(self.hive.file, self.key.base, name, byref(index)):
    200212            return self.constructor(self.hive, self.get_element(self.hive.file,
    201213                                                                self.key.base,
     
    203215        raise KeyError('')
    204216
    205 
     217    def get(self, name, default):
     218        try:
     219            return self[name]
     220        except KeyError:
     221            return default
     222   
    206223    def __iter__(self):
    207224        self.current = 0
     
    215232                                c_uint32(self.current))
    216233        self.current += 1
    217         return elem.contents
     234        return self.constructor(self.hive, elem)
    218235   
    219236
     
    241258    def __getattr__(self, name):
    242259        ret_val = super(Key, self).__getattr__(name)
    243         if ret_val == None:
    244             return None
    245260       
    246261        if name == "name":
    247             ret_val = ret_val.decode('utf-8')
     262            if ret_val == None:
     263                ret_val = self.name_raw
     264            else:
     265                ret_val = ret_val.decode('utf-8')
     266               
    248267        elif name == "name_raw":
    249268            length = super(Key, self).__getattr__('name_length')
     
    260279class Value(_StructureWrapper):
    261280    def __getattr__(self, name):
    262         ret_val = super(Value, self).__getattr__(name)
    263         if ret_val == None:
    264             return None
    265 
    266         if name == "name":
    267             ret_val = ret_val.decode('utf-8')
    268         elif name == "name_raw":
    269             length = super(Value, self).__getattr__('name_length')
    270             ret_val = _buffer2bytearray(ret_val, length)
    271        
     281        ret_val = None
     282        if name == "data":
     283            data_p = regfi.regfi_fetch_data(self.hive.file, self.base)
     284            try:
     285                data_struct = data_p.contents
     286            except Exception:
     287                return None
     288
     289            if data_struct.interpreted_size == 0:
     290                ret_val = None
     291            elif data_struct.type in (REG_SZ, REG_EXPAND_SZ, REG_LINK):
     292                # Unicode strings
     293                ret_val = data_struct.interpreted.string.decode('utf-8')
     294            elif data_struct.type in (REG_DWORD, REG_DWORD_BE):
     295                # 32 bit integers
     296                ret_val = data_struct.interpreted.dword
     297            elif data_struct.type == REG_QWORD:
     298                # 64 bit integers
     299                ret_val = data_struct.interpreted.qword
     300            elif data_struct.type == REG_MULTI_SZ:
     301                ret_val = _charss2strlist(data_struct.interpreted.multiple_string)
     302            elif data_struct.type in (REG_NONE, REG_RESOURCE_LIST,
     303                                      REG_FULL_RESOURCE_DESCRIPTOR,
     304                                      REG_RESOURCE_REQUIREMENTS_LIST,
     305                                      REG_BINARY):
     306                ret_val = _buffer2bytearray(data_struct.interpreted.none,
     307                                            data_struct.interpreted_size)
     308
     309            regfi.regfi_free_record(data_p)
     310           
     311        elif name == "data_raw":
     312            # XXX: should we load the data without interpretation instead?
     313            data_p = regfi.regfi_fetch_data(self.hive.file, self.base)
     314            try:
     315                data_struct = data_p.contents
     316            except Exception:
     317                return None
     318
     319            ret_val = _buffer2bytearray(data_struct.raw,
     320                                        data_struct.size)
     321            regfi.regfi_free_record(data_p)           
     322           
     323        else:
     324            ret_val = super(Value, self).__getattr__(name)
     325            if name == "name":
     326                if ret_val == None:
     327                    ret_val = self.name_raw
     328                else:
     329                    ret_val = ret_val.decode('utf-8')
     330
     331            elif name == "name_raw":
     332                length = super(Value, self).__getattr__('name_length')
     333                ret_val = _buffer2bytearray(ret_val, length)
     334
    272335        return ret_val
    273336
     
    285348   
    286349    def __init__(self, fh):
    287         # The fileno method may not exist, or it may thrown an exception
     350        # The fileno method may not exist, or it may throw an exception
    288351        # when called if the file isn't backed with a descriptor.
    289352        try:
Note: See TracChangeset for help on using the changeset viewer.