Changeset 225


Ignore:
Timestamp:
04/05/11 11:17:41 (13 years ago)
Author:
tim
Message:

added test case for python callback read/seek
began adding windows support in pyregfi
improved win32 build target

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • SConstruct

    r222 r225  
    3333
    3434win32_cmds='''
    35 rm -rf .release && mkdir -p .release/%s
     35rm -rf .release && mkdir -p .release/%s/python/pyregfi
    3636cp %s/src/*.exe .release/%s
     37
     38cp %s/pyregfi-distutils.py .release/%s/setup.py
     39cp %s/python/pyregfi/*.py .release/%s/python/pyregfi
     40
    3741cp win32/libiconv/bin/*.dll win32/libpthreads/bin/*.dll win32/libtalloc/bin/*.dll trunk/lib/*.dll .release/%s
    3842cd .release && zip -r %s.zip %s
     
    113117                                            [input_prefix+'src/reglookup-recover.c']+extra_obj)
    114118
    115             ret_val += win32_cmds % (t_base,input_prefix,
     119            ret_val += win32_cmds % (t_base,input_prefix,t_base,input_prefix,
     120                                     t_base,input_prefix,
    116121                                     t_base,t_base,t_base,t_base,t_base)
    117122
  • test/pyregfi-smoketest.py

    r224 r225  
    33import sys
    44import gc
     5import io
    56import time
    67import pyregfi
     8
    79
    810def usage():
     
    1517# Gathers various (meaningless) statistics to exercise simple attribute access
    1618# and to hopefully smoke out any bugs that can be identified by changing stats
    17 def iterTallyNames(hive):
     19def iterTallyNames(hive, fh):
    1820    key_count = 0
    1921    key_lens = 0
     
    6062# to find the same key again, verifying it is the same.  This test is currently
    6163# very slow because no key caching is used.
    62 def iterParentWalk(hive):
     64def iterParentWalk(hive, fh):
    6365    i = 1
    6466    for k in hive:
     
    7779# Uses the HiveIterator to walk all keys
    7880# Gathers various (meaningless) statistics about data/data_raw attributes
    79 def iterTallyData(hive):
     81def iterTallyData(hive, fh):
    8082    data_stat = 0.0
    8183    dataraw_stat = 0.0
     
    127129# list dictionary access.  Also builds nonsensical statistics as an excuse
    128130# to access various base structure attributes.
    129 def recurseKeyTally(hive):
     131def recurseKeyTally(hive, fh):
    130132    checkValues(hive.root)
    131133    recurseTree(hive.root, checkValues)
     
    135137
    136138# Iterates hive gathering stats about security and classname records
    137 def iterFetchRelated(hive):
     139def iterFetchRelated(hive, fh):
    138140    security_stat = 0.0
    139141    classname_stat = 0.0
     
    157159
    158160
    159 def iterIterWalk(hive):
     161def iterIterWalk(hive, fh):
    160162    sk_stat = 0.0
    161163    v_stat = 0.0
     
    183185
    184186
    185 
     187def iterCallbackIO(hive, fh):
     188    fh.seek(0)
     189    new_fh = io.BytesIO(fh.read())
     190    new_hive = pyregfi.Hive(new_fh)
     191    for k in new_hive:
     192        pass
     193
     194   
    186195if len(sys.argv) < 2:
    187196    usage()
     
    196205         ("iterIterWalk",iterIterWalk),]
    197206
    198 tests = [("iterIterWalk",iterIterWalk),]
     207tests = [("iterCallbackIO",iterCallbackIO),]
    199208
    200209
     
    211220        tstr = "'%s' on '%s'" % (tname,hname)
    212221        print("##BEGIN %s:" % tstr)
    213         t(hive)
     222        t(hive, fh)
    214223        print("##END %s; runtime=%f; messages:" % (tstr, time.time() - teststart))
    215224        print(pyregfi.GetLogMessages())
  • trunk/SConstruct

    r212 r225  
    11import sys
    22import os
    3 #import distutils.sysconfig
    43
    5 #cflags = '-std=gnu99 -pedantic -Wall'
    6 cflags = '-std=gnu99 -pedantic -Wall -fvisibility=hidden -ggdb'
    7 
     4cflags = '-std=gnu99 -pedantic -Wall -D_FILE_OFFSET_BITS=64 -fvisibility=hidden'
     5cflags += ' -ggdb'
    86
    97lib_src = ['lib/regfi.c',
  • trunk/lib/regfi.c

    r224 r225  
    612612  do
    613613  {
    614     rret = file_cb->read(file_cb, buf + rsize, *length - rsize);
     614    rret = file_cb->read(file_cb,
     615                         buf + rsize,
     616                         *length - rsize);
    615617    if(rret > 0)
    616618      rsize += rret;
  • trunk/python/pyregfi/__init__.py

    r224 r225  
    9595import sys
    9696import time
    97 import weakref
    9897from pyregfi.structures import *
    9998
     
    635634            pass
    636635       
     636        fh.seek(0)
    637637        self.raw_file = structures.REGFI_RAW_FILE()
    638638        self.raw_file.fh = fh
    639639        self.raw_file.seek = seek_cb_type(self.raw_file.cb_seek)
    640640        self.raw_file.read = read_cb_type(self.raw_file.cb_read)
    641         self.file = regfi.regfi_alloc_cb(self.raw_file, REGFI_ENCODING_UTF8)
    642 
     641        self.file = regfi.regfi_alloc_cb(pointer(self.raw_file), REGFI_ENCODING_UTF8)
     642        if not self.file:
     643            # XXX: switch to non-generic exception
     644            raise Exception("Could not open registry file.  Current log:\n"
     645                            + GetLogMessages())
    643646
    644647    def __getattr__(self, name):
  • trunk/python/pyregfi/structures.py

    r224 r225  
    8282
    8383
    84 # XXX: how can we know for sure the size of off_t and size_t?
    85 seek_cb_type = CFUNCTYPE(c_int64, POINTER(REGFI_RAW_FILE), c_uint64, c_int, use_errno=True)
    86 read_cb_type = CFUNCTYPE(c_int64, POINTER(REGFI_RAW_FILE), POINTER(c_char), c_uint64, use_errno=True)
     84# Load libregfi according to platform
     85regfi = None
     86if hasattr(ctypes, 'windll'):
     87    #regfi = ctypes.windll.libregfi
     88    regfi = ctypes.WinDLL('libregfi.dll', use_errno=True)
     89    CB_FACTORY = ctypes.WINFUNCTYPE
     90else:
     91    regfi = ctypes.CDLL(ctypes.util.find_library('regfi'), use_errno=True)
     92    CB_FACTORY = ctypes.CFUNCTYPE
     93
     94# XXX: how can we know for sure the size of off_t? 
     95#      -D_FILE_OFFSET_BITS=64 might help, need to research this
     96#      Also, may need to use something like ctypes_configure
     97#seek_cb_type = CB_FACTORY(c_int64, POINTER(REGFI_RAW_FILE), c_uint64, c_int, use_errno=True)
     98seek_cb_type = CB_FACTORY(c_int64, POINTER(REGFI_RAW_FILE), c_uint64, c_int)
     99#read_cb_type = CB_FACTORY(c_int64, POINTER(REGFI_RAW_FILE), POINTER(c_char), c_size_t, use_errno=True)
     100read_cb_type = CB_FACTORY(c_int64, POINTER(REGFI_RAW_FILE), POINTER(c_char), c_size_t)
    87101
    88102
     
    217231
    218232
    219 # Load libregfi and define function prototypes
    220 regfi = ctypes.CDLL(ctypes.util.find_library('regfi'), use_errno=True)
    221 
     233# Define function prototypes
    222234regfi.regfi_alloc.argtypes = [c_int, REGFI_ENCODING]
    223235regfi.regfi_alloc.restype = POINTER(REGFI_FILE)
Note: See TracChangeset for help on using the changeset viewer.