void ntdll_redir_init(void) { uint i; ntdll_table = strhash_hash_create(GLOBAL_DCONTEXT, hashtable_num_bits(REDIRECT_NTDLL_NUM*2), 80 /* load factor: not perf-critical, plus static */, HASHTABLE_SHARED | HASHTABLE_PERSISTENT, NULL _IF_DEBUG("ntdll redirection table")); TABLE_RWLOCK(ntdll_table, write, lock); for (i = 0; i < REDIRECT_NTDLL_NUM; i++) { strhash_hash_add(GLOBAL_DCONTEXT, ntdll_table, redirect_ntdll[i].name, (void *) redirect_ntdll[i].func); } TABLE_RWLOCK(ntdll_table, write, unlock); if (get_os_version() >= WINDOWS_VERSION_7) { ntdll_win7_table = strhash_hash_create(GLOBAL_DCONTEXT, REDIRECT_NTDLL_WIN7_NUM*2, 80 /* load factor: not perf-critical, plus static */, HASHTABLE_SHARED | HASHTABLE_PERSISTENT, NULL _IF_DEBUG("ntdll win7 redirection table")); TABLE_RWLOCK(ntdll_win7_table, write, lock); for (i = 0; i < REDIRECT_NTDLL_WIN7_NUM; i++) { strhash_hash_add(GLOBAL_DCONTEXT, ntdll_win7_table, redirect_ntdll_win7[i].name, (void *) redirect_ntdll_win7[i].func); } TABLE_RWLOCK(ntdll_win7_table, write, unlock); } }
void advapi32_redir_init(void) { uint i; advapi32_table = strhash_hash_create(GLOBAL_DCONTEXT, hashtable_num_bits(REDIRECT_ADVAPI32_NUM*2), 80 /* load factor: not perf-critical, plus static */, HASHTABLE_SHARED | HASHTABLE_PERSISTENT, NULL _IF_DEBUG("advapi32 redirection table")); TABLE_RWLOCK(advapi32_table, write, lock); for (i = 0; i < REDIRECT_ADVAPI32_NUM; i++) { strhash_hash_add(GLOBAL_DCONTEXT, advapi32_table, redirect_advapi32[i].name, (void *) redirect_advapi32[i].func); } TABLE_RWLOCK(advapi32_table, write, unlock); }
/* Returns the proper number of hash bits to have a capacity with the * given load for the given number of entries */ uint hashtable_bits_given_entries(uint entries, uint load) { /* Add 1 for the sentinel */ return hashtable_num_bits(((entries + 1) * 100) / load); }