Changeset 252
- Timestamp:
- 05/08/11 13:33:49 (14 years ago)
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
test/pyregfi-smoketest.py
r232 r252 42 42 43 43 44 # helper function44 # walks up parents to obtain path, rather than using downward links like iterator 45 45 def getCurrentPath(key): 46 46 if key == None: … … 71 71 i += 1 72 72 except Exception as e: 73 print("WARNING: Could not de cend to path '%s'.\nError:\n %s\n%s" % (path,e.args,e))73 print("WARNING: Could not descend to path '%s'.\nError:\n %s\n%s" % (path,e.args,e)) 74 74 print(" Successfully tested paths on %d keys." % i) 75 75 … … 162 162 iter = pyregfi.HiveIterator(hive) 163 163 for k in iter: 164 path = getCurrentPath(k)164 path = iter.current_path() 165 165 try: 166 hive_iter = hive.subtree(path )166 hive_iter = hive.subtree(path[1:]) 167 167 sk = hive_iter.first_subkey() 168 168 while sk != None: 169 169 ssk = hive_iter.find_subkey(sk.name) 170 sk_stat += len(ssk.name) 170 if ssk != None: 171 sk_stat += len(ssk.name) 172 else: 173 print("WARNING: ssk was None") 171 174 sk = hive_iter.next_subkey() 172 175 … … 174 177 while v != None: 175 178 vv = hive_iter.find_value(v.name) 176 v_stat += len(vv.name) 179 if vv != None: 180 v_stat += len(vv.name) 181 else: 182 print("WARNING: vv was None") 177 183 v = hive_iter.next_value() 178 184 179 185 except Exception as e: 180 print("WARNING: Could not de cend to path '%s'.\nError:\n %s\n%s" % (path,e.args,e))186 print("WARNING: Could not descend to path '%s'.\nError:\n %s\n%s" % (path[1:],e.args,e)) 181 187 print(" Subkey stat: %f" % sk_stat) 182 188 print(" Value stat: %f" % v_stat) -
trunk/include/regfi.h
r251 r252 1013 1013 * Adds an extra internal reference to specified record, making it necessary to 1014 1014 * call regfi_free_record on it an additional time before it is freed. This is 1015 * useful in cases where multiple threads/structures need access to a record,1015 * useful in cases where multiple threads/structures need access to a shared record, 1016 1016 * without requiring them to be in sync with when it is freed. 1017 1017 * … … 1022 1022 * REGFI_SK, REGFI_DATA, and REGFI_CLASSNAME records. 1023 1023 * 1024 * @return true on success, false otherwise 1025 * 1026 * @ingroup regfiBase 1027 */ 1028 _EXPORT() 1029 bool regfi_reference_record(REGFI_FILE* file, const void* record); 1024 * @return Updated record pointer on success, NULL otherwise 1025 * 1026 * @note Be sure to use the returned record for further access to the structure 1027 * instead of the previous version of the pointer. E.g.: 1028 * @code 1029 * myKey = (const REGFI_NK*)regfi_reference_record(myFile, myKey); 1030 * @endcode 1031 * 1032 * @ingroup regfiBase 1033 */ 1034 _EXPORT() 1035 const void* regfi_reference_record(REGFI_FILE* file, const void* record); 1030 1036 1031 1037 … … 1289 1295 */ 1290 1296 _EXPORT() 1291 bool regfi_iterator_ walk_path(REGFI_ITERATOR* i, const char** path);1297 bool regfi_iterator_descend(REGFI_ITERATOR* i, const char** path); 1292 1298 1293 1299 … … 1413 1419 1414 1420 1415 /** Returns the full path where the iterator is currently located as a list 1416 * of NK records 1421 /** Returns the current key and all parent keys as a list of NK records 1417 1422 * 1418 1423 * @param i the iterator … … 1420 1425 * @return An array of NK record pointers terminated by a NULL pointer. 1421 1426 * This array may be passed directly to regfi_free_record to free 1422 * the entire array. 1427 * the entire array. 1423 1428 * 1424 1429 * @note In order to use an element of the array independently from the … … 1430 1435 */ 1431 1436 _EXPORT() 1432 const REGFI_NK** regfi_iterator_ cur_path(REGFI_ITERATOR* i);1437 const REGFI_NK** regfi_iterator_ancestry(REGFI_ITERATOR* i); 1433 1438 1434 1439 -
trunk/lib/lru_cache.c
r250 r252 260 260 ht->table[hash] = e; 261 261 } 262 if(ht->talloc_data) 263 data = talloc_reference(e, data); 262 264 e->data = data; 263 if(ht->talloc_data)264 talloc_reference(e, e->data);265 265 266 266 /* Finally, let's insert the element to the newest position in the LRU list.*/ -
trunk/lib/regfi.c
r251 r252 1799 1799 /****************************************************************************** 1800 1800 *****************************************************************************/ 1801 bool regfi_reference_record(REGFI_FILE* file, const void* record) 1802 { 1803 bool ret_val = false; 1801 const void* regfi_reference_record(REGFI_FILE* file, const void* record) 1802 { 1803 const void* ret_val = NULL; 1804 1804 1805 if(!regfi_lock(file, &file->mem_lock, "regfi_reference_record")) 1805 1806 return ret_val; 1806 1807 if(talloc_reference(NULL, record) != NULL) 1808 ret_val = true; 1807 1808 ret_val = talloc_reference(NULL, record); 1809 1809 1810 1810 regfi_unlock(file, &file->mem_lock, "regfi_reference_record"); … … 1933 1933 if(subkey == NULL) 1934 1934 { 1935 regfi_log_add(REGFI_LOG_WARN, "Could not obtain cur_subkey during"1936 " iterator_down with subkey index (%d) and key offset=%.8X\n",1937 i->cur->cur_subkey, i->cur->offset);1938 1935 talloc_free(pos); 1939 1936 return false; … … 2026 2023 /****************************************************************************** 2027 2024 *****************************************************************************/ 2028 bool regfi_iterator_ walk_path(REGFI_ITERATOR* i, const char** path)2025 bool regfi_iterator_descend(REGFI_ITERATOR* i, const char** path) 2029 2026 { 2030 2027 uint32_t x; … … 2175 2172 /****************************************************************************** 2176 2173 *****************************************************************************/ 2177 const REGFI_NK** regfi_iterator_ cur_path(REGFI_ITERATOR* i)2174 const REGFI_NK** regfi_iterator_ancestry(REGFI_ITERATOR* i) 2178 2175 { 2179 2176 REGFI_NK** ret_val; … … 2203 2200 void_stack_iterator_free(iter); 2204 2201 2205 if(!regfi_lock(i->f, &i->f->mem_lock, "regfi_ cur_path"))2202 if(!regfi_lock(i->f, &i->f->mem_lock, "regfi_iterator_ancestry")) 2206 2203 { 2207 2204 talloc_free(ret_val); … … 2212 2209 talloc_reparent(NULL, ret_val, ret_val[k]); 2213 2210 2214 regfi_unlock(i->f, &i->f->mem_lock, "regfi_ cur_path");2211 regfi_unlock(i->f, &i->f->mem_lock, "regfi_iterator_ancestry"); 2215 2212 2216 2213 ret_val[k] = NULL; -
trunk/python/pyregfi/__init__.py
r233 r252 174 174 i = 0 175 175 s = chars_pointer[i] 176 while s != None:176 while s: 177 177 ret_val.append(s.decode('utf-8', 'replace')) 178 178 i += 1 … … 180 180 181 181 return ret_val 182 182 183 183 184 … … 316 317 raise Exception("Could not create _GenericList; key is NULL." 317 318 + "Current log:\n" + getLogMessages()) 318 319 if not regfi.regfi_reference_record(key._hive.file, key._base): 319 320 base = regfi.regfi_reference_record(key._hive.file, key._base) 321 if not base: 320 322 raise Exception("Could not create _GenericList; memory error." 321 323 + "Current log:\n" + getLogMessages()) 322 self._key_base = key._base324 self._key_base = cast(base, type(key._base)) 323 325 self._length = self._fetch_num(self._key_base) 324 326 self._hive = key._hive … … 461 463 ret_val = super(Key, self).__getattr__(name) 462 464 463 if ret_val == None:465 if not ret_val: 464 466 ret_val = self.name_raw 465 467 else: … … 624 626 ret_val = super(Value, self).__getattr__(name) 625 627 if name == "name": 626 if ret_val == None:628 if not ret_val: 627 629 ret_val = self.name_raw 628 630 else: … … 984 986 return ret_val 985 987 986 987 988 ## Traverse downward multiple levels 988 989 # … … 996 997 997 998 self._lock.acquire() 998 result = regfi.regfi_iterator_ walk_path(self._iter, cpath)999 result = regfi.regfi_iterator_descend(self._iter, cpath) 999 1000 self._lock.release() 1000 1001 if not result: 1001 1002 # XXX: Use non-generic exception 1002 1003 raise Exception('Could not locate path.\n'+getLogMessages()) 1004 1005 ## Obtains a list of the current key's ancestry 1006 # 1007 # @return A list of all parent keys starting with the root Key and ending 1008 # with the current Key 1009 def ancestry(self): 1010 self._lock.acquire() 1011 result = regfi.regfi_iterator_ancestry(self._iter) 1012 self._lock.release() 1013 1014 ret_val = [] 1015 i = 0 1016 k = result[i] 1017 while k: 1018 k = cast(regfi.regfi_reference_record(self._hive.file, k), POINTER(REGFI_NK)) 1019 ret_val.append(Key(self._hive, k)) 1020 i += 1 1021 k = result[i] 1022 1023 regfi.regfi_free_record(self._hive.file, result) 1024 return ret_val 1025 1026 ## Obtains the current path of the iterator 1027 # 1028 # @return A list of key names starting with the root up to and 1029 # including the current key 1030 # 1031 def current_path(self): 1032 ancestry = self.ancestry() 1033 return [str(a.name) for a in ancestry] 1003 1034 1004 1035 -
trunk/python/pyregfi/structures.py
r233 r252 20 20 21 21 REGFI_DATA_TYPE = c_uint32 22 22 REGFI_NTTIME = c_uint64 23 23 24 24 # Prototype everything first so we don't have to worry about reference order 25 class REGFI_NTTIME(Structure):26 pass27 28 25 class REGFI_VK(Structure): 29 26 pass … … 97 94 read_cb_type = CB_FACTORY(c_int64, POINTER(REGFI_RAW_FILE), POINTER(c_char), c_size_t, use_errno=True) 98 95 99 100 REGFI_NTTIME._fields_ = [('low', c_uint32),101 ('high', c_uint32)]102 96 103 97 REGFI_VK._fields_ = [('offset', c_uint32), … … 253 247 254 248 regfi.regfi_reference_record.argtypes = [POINTER(REGFI_FILE), c_void_p] 255 regfi.regfi_reference_record.restype = c_ bool249 regfi.regfi_reference_record.restype = c_void_p 256 250 257 251 regfi.regfi_fetch_num_subkeys.argtypes = [POINTER(REGFI_NK)] … … 307 301 regfi.regfi_iterator_to_root.restype = c_bool 308 302 309 regfi.regfi_iterator_ walk_path.argtypes = [POINTER(REGFI_ITERATOR), POINTER(c_char_p)]310 regfi.regfi_iterator_ walk_path.restype = c_bool303 regfi.regfi_iterator_descend.argtypes = [POINTER(REGFI_ITERATOR), POINTER(c_char_p)] 304 regfi.regfi_iterator_descend.restype = c_bool 311 305 312 306 regfi.regfi_iterator_cur_key.argtypes = [POINTER(REGFI_ITERATOR)] … … 337 331 regfi.regfi_iterator_find_value.restype = c_bool 338 332 333 regfi.regfi_iterator_ancestry.argtypes = [POINTER(REGFI_ITERATOR)] 334 regfi.regfi_iterator_ancestry.restype = POINTER(POINTER(REGFI_NK)) 339 335 340 336 regfi.regfi_init.argtypes = [] -
trunk/src/reglookup.c
r251 r252 227 227 buf[0] = '\0'; 228 228 229 path = regfi_iterator_ cur_path(i);229 path = regfi_iterator_ancestry(i); 230 230 if(path == NULL) 231 231 { … … 381 381 382 382 root = regfi_iterator_cur_key(iter); 383 regfi_reference_record(iter->f, root); 384 cur = root; 383 cur = root = regfi_reference_record(iter->f, root); 385 384 regfi_iterator_first_subkey(iter); 386 385 sub = regfi_iterator_cur_subkey(iter); … … 504 503 } 505 504 506 if(!regfi_iterator_ walk_path(iter, tmp_path))505 if(!regfi_iterator_descend(iter, tmp_path)) 507 506 { 508 507 printMsgs(iter->f);
Note: See TracChangeset
for help on using the changeset viewer.