mirror of
https://github.com/BeneficialCode/WinArk.git
synced 2026-10-17 04:40:35 +08:00
Tweak the hashtable again.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user