Tweak the hashtable again.

This commit is contained in:
BeneficialCode
2023-11-26 17:12:29 +08:00
parent 0c56e88a8b
commit 86286af287
3 changed files with 12 additions and 13 deletions
+7 -7
View File
@@ -38,12 +38,12 @@ UINT32 HashTableGetBucketIndex(UINT32 bucketCount, UINT64 key) {
return (bucketCount - 1) & HashUlongPtr(key);
}
UINT32 HashTableInsert(PHASH_TABLE Hash, PHASH_BUCKET pBucket) {
UINT32 HashTableInsert(PHASH_TABLE Hash, PSINGLE_LIST_ENTRY pListEntry) {
UINT32 count = (Hash->BucketCount >> 5) & 0x7FFFFFF;
PHASH_ENTRY pEntry = CONTAINING_RECORD(pBucket, HASH_ENTRY, Entry);
PHASH_ENTRY pEntry = CONTAINING_RECORD(pListEntry, HASH_ENTRY, Link);
UINT64 key = (ULONGLONG(-1) << (Hash->BucketCount & 0x1F)) & pEntry->HashVaue;
UINT32 idx = HashTableGetBucketIndex(count, key);
PushEntryList((PSINGLE_LIST_ENTRY)&Hash->Buckets[idx], pBucket->Link);
PushEntryList((PSINGLE_LIST_ENTRY)&Hash->Buckets[idx], pListEntry);
count = Hash->ItemCount + 1;
Hash->ItemCount = count;
return count;
@@ -124,7 +124,7 @@ PHASH_BUCKET HashTableFindNext(PHASH_TABLE Hash, UINT64 Key, PHASH_BUCKET Bucket
for (bLastLink = HashBucketLastLink(pBucket);
!bLastLink;
bLastLink = HashBucketLastLink(pBucket)) {
PHASH_ENTRY pEntry = CONTAINING_RECORD(pBucket, HASH_ENTRY, Entry);
PHASH_ENTRY pEntry = CONTAINING_RECORD(pBucket, HASH_ENTRY, Link);
if (k == (value & pEntry->HashVaue)) {
return (PHASH_BUCKET)pBucket->Hash;
}
@@ -141,14 +141,14 @@ PHASH_TABLE HashTableGetTable(PHASH_BUCKET HashEntry) {
for (bLastLink = HashBucketLastLink(pBucket); !bLastLink;
bLastLink = HashBucketLastLink(pBucket)) {
pEntry = pBucket;
pEntry = (PHASH_BUCKET)pBucket->Link;
}
pHash = (PHASH_TABLE)(pBucket->Hash & ~1ull);
pEntry = NULL;
do
{
PHASH_ENTRY pHashEntry = CONTAINING_RECORD(pBucket, HASH_ENTRY, Entry);
PHASH_ENTRY pHashEntry = CONTAINING_RECORD(pBucket, HASH_ENTRY, Link);
pEntry = HashTableFindNext(pHash, pHashEntry->HashVaue, pEntry);
} while (pEntry && pEntry != HashEntry);
@@ -173,7 +173,7 @@ PHASH_BUCKET HashTableChangeTable(PHASH_TABLE Hash, ULONG size,
PHASH_BUCKET pBucket = &Hash->Buckets[j];
while (!HashBucketLastLink(pBucket)) {
p = pBucket;
PHASH_ENTRY pEntry = CONTAINING_RECORD(p, HASH_ENTRY, Entry);
PHASH_ENTRY pEntry = CONTAINING_RECORD(p, HASH_ENTRY, Link);
UINT32 idx = HashTableGetBucketIndex(bucketCount, value & pEntry->HashVaue);
PushEntryList((PSINGLE_LIST_ENTRY)&pBuckets[idx], p->Link);
}
+2 -2
View File
@@ -1,7 +1,7 @@
#pragma once
typedef struct _HASH_ENTRY {
SINGLE_LIST_ENTRY Entry;
SINGLE_LIST_ENTRY Link;
ULONG_PTR HashVaue;
}HASH_ENTRY, * PHASH_ENTRY;
@@ -37,7 +37,7 @@ UINT64 HashUStringUpcase(PWCH pBuffer, int len);
UINT32 HashTableGetBucketIndex(UINT32 bucketCount, UINT64 key);
UINT32 HashTableInsert(PHASH_TABLE Hash, PHASH_BUCKET pBucket);
UINT32 HashTableInsert(PHASH_TABLE Hash, PSINGLE_LIST_ENTRY pListEntry);
BOOLEAN HashBucketLastLink(PHASH_BUCKET bucket);
+3 -4
View File
@@ -19,7 +19,6 @@ PUCHAR g_pAddr = (PUCHAR)0xfffff96000082744;
HASH_TABLE g_Table;
struct FullItem {
HASH_BUCKET Bucket;
ULONG_PTR Value;
HASH_ENTRY Entry;
};
@@ -52,20 +51,20 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {
item->Value = 0x7fff0;
HashTableInsert(&g_Table, &item->Bucket);
HashTableInsert(&g_Table, &item->Entry.Link);
PHASH_BUCKET pBucket = NULL;
FullItem* pData = NULL;
pBucket = HashTableFindNext(&g_Table, key, pBucket);
if (pBucket != NULL) {
pData = CONTAINING_RECORD(pBucket, FullItem, Bucket);
pData = CONTAINING_RECORD(pBucket, FullItem, Entry);
KdPrint(("Value: %p\n", pData->Value));
}
HASH_TABLE_ITERATOR iter;
HashTableIterInit(&iter, &g_Table);
while (HashTableIterGetNext(&iter)) {
pData = CONTAINING_RECORD(iter.Bucket, FullItem, Bucket);
pData = CONTAINING_RECORD(iter.Bucket, FullItem, Entry);
HashTableIterRemove(&iter);
KdPrint(("Value: %p\n", pData->Value));
ExFreePoolWithTag(pData, 'meti');