Windows System Software -- Consulting, Training, Development -- Unique Expertise, Guaranteed Results

Home NTDEV

Before Posting...

Please check out the Community Guidelines in the Announcements and Administration Category.

More Info on Driver Writing and Debugging


The free OSR Learning Library has more than 50 articles on a wide variety of topics about writing and debugging device drivers and Minifilters. From introductory level to advanced. All the articles have been recently reviewed and updated, and are written using the clear and definitive style you've come to expect from OSR over the years.


Check out The OSR Learning Library at: https://www.osr.com/osr-learning-library/


Why no one use RtlxxxHashTable?

tanda996tanda996 Member Posts: 24
  1. I find out that ntoskrnl exported run-time hashtable library:
    HKQ2mwg.png

but when searching it on google there is no one use or an example about it.
is it have many disadvantage or something?

  1. If someone have experienced on RtlxxxHashTable pls review my codes (insert/remove and clear function) with RtlxxxHashTable below, it is implemented right? (because it undocumented).
void
UpdateTable(
    _In_ ULONG ProcessId,
    _In_ bool Insert
)
{
    sync::AutoLock _(m_lock); // RAII fast mutex lock
    if (Insert) // insert
    {
            auto entry = ExAllocatePool(PagedPool, sizeof(MY_STRUCT_ENTRY));
            if (entry)
            {
                RtlInsertEntryHashTable(m_hashTable, &entry->entry, ULONG_PTR(ProcessId), nullptr); // m_hashTable is a class member;
            }
    }
    else // remove
    {
        auto entry = RtlLookupEntryHashTable(m_hashTable, ULONG_PTR(ProcessId), nullptr);
        if (entry)
        {
            RtlRemoveEntryHashTable(m_hashTable, entry, nullptr);
            ExFreePoo(entry);
        }
    }
}


void
Clear(
)
{
    sync::AutoLock _(m_lock); // RAII fast mutex lock
    if (m_hashTable) // a class member;
    {
        RTL_DYNAMIC_HASH_TABLE_ENUMERATOR enumrator = {};
        if (RtlInitEnumerationHashTable(m_hashTable, &enumrator))
        {
            while (true)
            {
                auto entry = RtlEnumerateEntryHashTable(m_hashTable, &enumrator);
                if (entry == nullptr)
                {
                    break;
                }
                RtlRemoveEntryHashTable(m_hashTable, entry, nullptr);
                ExFreePool(entry);
            }
            RtlEndEnumerationHashTable(m_hashTable, &enumrator);
        }
        RtlDeleteHashTable(m_hashTable);
    }
}
Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. Sign in or register to get started.

Upcoming OSR Seminars
OSR has suspended in-person seminars due to the Covid-19 outbreak. But, don't miss your training! Attend via the internet instead!
Kernel Debugging 30 January 2023 Live, Online
Developing Minifilters 20 March 2023 Live, Online
Internals & Software Drivers 17 April 2023 Live, Online
Writing WDF Drivers 22 May 2023 Live, Online