Changeset 226
- Timestamp:
- 04/05/11 15:01:41 (14 years ago)
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
SConstruct
r225 r226 1 cflags = '-std=gnu99 -pedantic -Wall '1 cflags = '-std=gnu99 -pedantic -Wall -D_FILE_OFFSET_BITS=64 -DREGFI_WIN32' 2 2 3 3 libiconv_path='win32/libiconv/' … … 100 100 regfi_obj.append(s[0:-1]+'o') 101 101 102 # XXX: Several options here may not be necessary. 103 # Need to investigate why stdcall interfaces don't seem to be 104 # working on Windows. 102 105 env.Command(input_prefix+'lib/libregfi.o', regfi_o+extra_obj, 103 106 'i586-mingw32msvc-dlltool --export-all-symbols' 104 +' -- dllname libregfi.dll -e $TARGET'107 +' --add-stdcall-alias --dllname libregfi.dll -e $TARGET' 105 108 +' -l %slib/libregfi.dll.a %s' 106 109 % (input_prefix, ' '.join(regfi_obj))) … … 108 111 env.Command(input_prefix+'lib/libregfi.dll', 109 112 input_prefix+'lib/libregfi.o', 110 'i586-mingw32msvc-gcc --shared -o $TARGET $SOURCE %s' 113 'i586-mingw32msvc-gcc ' + cflags 114 + ' --shared -Wl,--out-implib -add-stdcall-alias -o $TARGET $SOURCE %s' 111 115 % ' '.join(regfi_obj+extra_obj)) 112 116 -
trunk/include/regfi.h
r224 r226 84 84 #undef _EXPORT 85 85 #endif 86 #ifdef REGFI_WIN32 87 #define _EXPORT __declspec(dllexport) 88 #else 86 89 #define _EXPORT __attribute__((visibility("default"))) 87 88 90 #endif 91 92 #ifndef EOVERFLOW 93 # define EOVERFLOW E2BIG 94 #endif 89 95 90 96 /******************************************************************************/ … … 709 715 typedef struct _regfi_raw_file 710 716 { 711 off_t (* seek)(); /* (REGFI_RAW_FILE* self, off_t offset, int whence) */717 int64_t (* seek)(); /* (REGFI_RAW_FILE* self, uint64_t offset, int whence) */ 712 718 ssize_t (* read)(); /* (REGFI_RAW_FILE* self, void* buf, size_t count) */ 713 719 … … 1627 1633 /* Private (and undocumented) Functions */ 1628 1634 /******************************************************************************/ 1629 off_tregfi_raw_seek(REGFI_RAW_FILE* self,1630 off_t offset, int whence);1635 int64_t regfi_raw_seek(REGFI_RAW_FILE* self, 1636 uint64_t offset, int whence); 1631 1637 ssize_t regfi_raw_read(REGFI_RAW_FILE* self, 1632 1638 void* buf, size_t count); 1633 1639 _EXPORT 1634 off_tregfi_seek(REGFI_RAW_FILE* file_cb,1635 off_t offset, int whence);1640 uint64_t regfi_seek(REGFI_RAW_FILE* file_cb, 1641 uint64_t offset, int whence); 1636 1642 _EXPORT 1637 1643 uint32_t regfi_read(REGFI_RAW_FILE* file_cb, -
trunk/lib/regfi.c
r225 r226 573 573 574 574 575 off_t regfi_raw_seek(REGFI_RAW_FILE* self, off_t offset, int whence) 576 { 575 int64_t regfi_raw_seek(REGFI_RAW_FILE* self, uint64_t offset, int whence) 576 { 577 if(sizeof(off_t) == 4 && offset > 2147483647) 578 { 579 errno = EOVERFLOW; 580 return -1; 581 } 577 582 return lseek(*(int*)self->state, offset, whence); 578 583 } … … 587 592 * Convenience function to wrap up the ugly callback stuff 588 593 *****************************************************************************/ 589 off_t regfi_seek(REGFI_RAW_FILE* file_cb, off_t offset, int whence)594 uint64_t regfi_seek(REGFI_RAW_FILE* file_cb, uint64_t offset, int whence) 590 595 { 591 596 return file_cb->seek(file_cb, offset, whence); … … 1561 1566 REGFI_HBIN* hbin = NULL; 1562 1567 uint32_t hbin_off, cache_secret; 1563 int 32_t file_length;1568 int64_t file_length; 1564 1569 bool rla; 1565 1570 … … 1567 1572 * and one hbin. 1568 1573 */ 1569 file_length = file_cb->seek(file_cb, 0, SEEK_END);1574 file_length = regfi_seek(file_cb, 0, SEEK_END); 1570 1575 if(file_length < REGFI_REGF_SIZE+REGFI_HBIN_ALLOC) 1571 1576 { … … 1574 1579 return NULL; 1575 1580 } 1576 file_cb->seek(file_cb, 0, SEEK_SET);1581 regfi_seek(file_cb, 0, SEEK_SET); 1577 1582 1578 1583 if(output_encoding != REGFI_ENCODING_UTF8 -
trunk/python/pyregfi/__init__.py
r225 r226 177 177 def GetLogMessages(): 178 178 msgs = regfi.regfi_log_get_str() 179 if msgs == None:179 if not msgs: 180 180 return '' 181 181 return msgs.decode('utf-8') … … 625 625 # @note Supplied file must be seekable 626 626 def __init__(self, fh): 627 # The fileno method may not exist, or it may throw an exception 628 # when called if the file isn't backed with a descriptor. 629 fn = None 627 630 try: 628 # The fileno method may not exist, or it may throw an exception 629 # when called if the file isn't backed with a descriptor. 630 if hasattr(fh, 'fileno'): 631 self.file = regfi.regfi_alloc(fh.fileno(), REGFI_ENCODING_UTF8) 632 return 631 # XXX: Native calls to Windows filenos don't seem to work. 632 # Need to investigate why. 633 if not is_win32 and hasattr(fh, 'fileno'): 634 fn = fh.fileno() 633 635 except: 634 636 pass 635 636 fh.seek(0) 637 self.raw_file = structures.REGFI_RAW_FILE() 638 self.raw_file.fh = fh 639 self.raw_file.seek = seek_cb_type(self.raw_file.cb_seek) 640 self.raw_file.read = read_cb_type(self.raw_file.cb_read) 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()) 637 638 if fn != None: 639 self.file = regfi.regfi_alloc(fn, REGFI_ENCODING_UTF8) 640 if not self.file: 641 # XXX: switch to non-generic exception 642 raise Exception("Could not open registry file. Current log:\n" 643 + GetLogMessages()) 644 else: 645 fh.seek(0) 646 self.raw_file = structures.REGFI_RAW_FILE() 647 self.raw_file.fh = fh 648 self.raw_file.seek = seek_cb_type(self.raw_file.cb_seek) 649 self.raw_file.read = read_cb_type(self.raw_file.cb_read) 650 self.file = regfi.regfi_alloc_cb(pointer(self.raw_file), REGFI_ENCODING_UTF8) 651 if not self.file: 652 # XXX: switch to non-generic exception 653 raise Exception("Could not open registry file. Current log:\n" 654 + GetLogMessages()) 655 646 656 647 657 def __getattr__(self, name): … … 703 713 def __init__(self, hive): 704 714 self._iter = regfi.regfi_iterator_new(hive.file, REGFI_ENCODING_UTF8) 705 if self._iter == None:715 if not self._iter: 706 716 raise Exception("Could not create iterator. Current log:\n" 707 717 + GetLogMessages()) -
trunk/python/pyregfi/structures.py
r225 r226 13 13 from ctypes import * 14 14 15 is_win32 = hasattr(ctypes, 'windll') 15 16 16 17 # XXX: can we always be sure enums are this size? … … 61 62 except Exception: 62 63 traceback.print_exc() 63 # XXX: os.EX_IOERR may not be available on Windoze 64 set_errno(os.EX_IOERR) 64 set_errno(74) # os.EX_IOERR 65 65 return -1 66 66 … … 76 76 except Exception: 77 77 traceback.print_exc() 78 # XXX: os.EX_IOERR may not be available on Windoze 79 set_errno(os.EX_IOERR) 78 set_errno(74) # os.EX_IOERR 80 79 return -1 81 80 return len(tmp) … … 84 83 # Load libregfi according to platform 85 84 regfi = None 86 if hasattr(ctypes, 'windll'): 85 if is_win32: 86 # XXX: Using C calling conventions on cross-compiled DLLs seems to work fine 87 # on Windows, but I'm not sure if stdcall symbols are supported 88 # correctly for native Windows binaries... 87 89 #regfi = ctypes.windll.libregfi 88 regfi = ctypes.WinDLL('libregfi.dll', use_errno=True) 89 CB_FACTORY = ctypes.WINFUNCTYPE 90 #CB_FACTORY = ctypes.WINFUNCTYPE 91 regfi = ctypes.CDLL('libregfi.dll', use_errno=True) 92 CB_FACTORY = ctypes.CFUNCTYPE 90 93 else: 91 94 regfi = ctypes.CDLL(ctypes.util.find_library('regfi'), use_errno=True) 92 95 CB_FACTORY = ctypes.CFUNCTYPE 93 96 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) 98 seek_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) 100 read_cb_type = CB_FACTORY(c_int64, POINTER(REGFI_RAW_FILE), POINTER(c_char), c_size_t) 97 seek_cb_type = CB_FACTORY(c_int64, POINTER(REGFI_RAW_FILE), c_uint64, c_int, use_errno=True) 98 read_cb_type = CB_FACTORY(c_int64, POINTER(REGFI_RAW_FILE), POINTER(c_char), c_size_t, use_errno=True) 101 99 102 100
Note: See TracChangeset
for help on using the changeset viewer.