You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
273 lines
6.1 KiB
273 lines
6.1 KiB
|
|
//
|
|
// Copyright (C) 2000, Microsoft Corporation
|
|
//
|
|
// File: shash.h
|
|
//
|
|
// Contents: Generic hashtable
|
|
// Classes:
|
|
//
|
|
// History: April. 9 2001, Author: Rohanp
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
#ifndef __SHASHTABLE_H__
|
|
#define __SHASHTABLE_H__
|
|
|
|
#pragma warning(disable: 4200)
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
//forward declaration
|
|
struct _SHASH_TABLE;
|
|
|
|
struct _SHASH_HEADER;
|
|
|
|
// This function computes the hash value
|
|
//
|
|
typedef ULONG (*PFNHASH)( void* pvKey ) ;
|
|
|
|
//
|
|
// This function compares the keys
|
|
//
|
|
typedef int (*PFNMATCHKEY)( void* key1, void* key2 ) ;
|
|
|
|
|
|
//
|
|
// This function gets called when the keys get removed
|
|
//
|
|
typedef int (*PFNREMOVEKEY)(struct _SHASH_HEADER * pHeader) ;
|
|
|
|
|
|
//
|
|
// This function gets called when the keys get removed
|
|
//
|
|
typedef DWORD (*PFNENUMERATEKEY)(struct _SHASH_HEADER * pHeader, void * pContext ) ;
|
|
|
|
|
|
// memory allocations function
|
|
typedef void* (*PFNALLOC)( ULONG cb ) ;
|
|
|
|
|
|
// memory free function
|
|
typedef void (*PFNFREE)( void* lpv ) ;
|
|
|
|
//
|
|
// This function allocs memory for the tables lock
|
|
//
|
|
typedef void * (*PFNALLOCLOCK)( void ) ;
|
|
|
|
//
|
|
// This function releases the lock memory
|
|
//
|
|
typedef void (*PFNFREELOCK)( void * ) ;
|
|
|
|
|
|
typedef BOOLEAN (*PFNAQUIREWRITELOCK)( struct _SHASH_TABLE * pTable ) ;
|
|
typedef BOOLEAN (*PFNAQUIREREADLOCK)( struct _SHASH_TABLE * pTable ) ;
|
|
typedef BOOLEAN (*PFNRELEASEWRITELOCK)( struct _SHASH_TABLE * pTable ) ;
|
|
typedef BOOLEAN (*PFNRELEASEREADLOCK)( struct _SHASH_TABLE * pTable ) ;
|
|
|
|
|
|
#define SHASH_DEFAULT_HASH_SIZE 512
|
|
#define SHASH_CRIT_SPIN_COUNT 4000
|
|
|
|
//
|
|
// There are flags that are not used by shash, they can be used by
|
|
// the caller.
|
|
//
|
|
#define SHASH_USER_FLAGS 0xFFFF0000
|
|
|
|
typedef struct _SHASH_HEADER
|
|
{
|
|
ULONG Signature;
|
|
ULONG Flags;
|
|
PVOID pvKey;
|
|
PVOID pData;
|
|
LONG RefCount;
|
|
ULONG dwHash;
|
|
FILETIME Time;
|
|
LIST_ENTRY ListEntry;
|
|
}SHASH_HEADER, *PSHASH_HEADER;
|
|
|
|
#define SHASH_FLAG_DELETE_PENDING 0x00000001
|
|
|
|
typedef struct _SHASHFUNCTABLE
|
|
{
|
|
PFNHASH HashFunc;
|
|
PFNMATCHKEY CompareFunc;
|
|
PFNALLOC AllocFunc;
|
|
PFNFREE FreeFunc;
|
|
PFNALLOC AllocHashEntryFunc;
|
|
PFNFREE FreeHashEntryFunc;
|
|
PFNALLOCLOCK AllocLockFunc;
|
|
PFNFREELOCK FreeLockFunc;
|
|
PFNAQUIREWRITELOCK WriteLockFunc;
|
|
PFNAQUIREREADLOCK ReadLockFunc;
|
|
PFNRELEASEWRITELOCK ReleaseWriteLockFunc;
|
|
PFNRELEASEREADLOCK ReleaseReadLockFunc;
|
|
ULONG Flags;
|
|
ULONG NumBuckets;
|
|
} SHASH_FUNCTABLE, *PSHASH_FUNCTABLE;
|
|
|
|
typedef struct _SHASH_BUCKET
|
|
{
|
|
ULONG Count;
|
|
LIST_ENTRY ListHead;
|
|
} SHASH_BUCKET, *PHASH_SBUCKET;
|
|
|
|
typedef struct _SHASH_ENTRY
|
|
{
|
|
PVOID pvKey;
|
|
LONG RefCount;
|
|
ULONG Flags;
|
|
PVOID pData;
|
|
LARGE_INTEGER EntryTime;
|
|
LARGE_INTEGER ExpireTime;
|
|
LIST_ENTRY ListEntry;
|
|
} SHASH_ENTRY, *PSHASH_ENTRY;
|
|
|
|
typedef struct _SHASH_TABLE
|
|
{
|
|
PFNHASH HashFunc;
|
|
PFNMATCHKEY CompareFunc;
|
|
PFNALLOC AllocFunc;
|
|
PFNFREE FreeFunc;
|
|
PFNALLOC AllocHashEntryFunc;
|
|
PFNFREE FreeHashEntryFunc;
|
|
PFNALLOCLOCK AllocLockFunc;
|
|
PFNFREELOCK FreeLockFunc;
|
|
PFNAQUIREWRITELOCK WriteLockFunc;
|
|
PFNAQUIREREADLOCK ReadLockFunc;
|
|
PFNRELEASEWRITELOCK ReleaseWriteLockFunc;
|
|
PFNRELEASEREADLOCK ReleaseReadLockFunc;
|
|
LONG Version;
|
|
ULONG Flags;
|
|
ULONG NumBuckets;
|
|
ULONG TotalItems;
|
|
PVOID pLock;
|
|
SHASH_BUCKET HashBuckets[0];
|
|
} SHASH_TABLE, *PSHASH_TABLE;
|
|
|
|
#define SHASH_CAP_POWER_OF2 0x000001
|
|
#define SHASH_CAP_TABLE_LOCKED 0x000002
|
|
#define SHASH_CAP_NOSEARCH_INSERT 0x000004
|
|
|
|
#define SHASH_DEFAULT_HASHTIMEOUT (15 * 60) //timeout entries in 15 minutes
|
|
|
|
#define SHASH_REPLACE_IFFOUND 1
|
|
#define SHASH_FAIL_IFFOUND 2
|
|
|
|
#ifdef KERNEL_MODE
|
|
#define SHASH_GET_TIME(Time) KeQuerySystemTime(Time)
|
|
#else
|
|
#define SHASH_GET_TIME(Time) NtQuerySystemTime(Time)
|
|
#endif
|
|
|
|
|
|
typedef struct _SHASH_ITERATOR {
|
|
//
|
|
// index
|
|
//
|
|
ULONG index;
|
|
|
|
LIST_ENTRY* pListHead;
|
|
|
|
//
|
|
//
|
|
LIST_ENTRY* ple;
|
|
|
|
PSHASH_HEADER pEntry;
|
|
|
|
} SHASH_ITERATOR,*PSHASH_ITERATOR;
|
|
|
|
NTSTATUS
|
|
ShashInitHashTable(
|
|
PSHASH_TABLE *ppHashTable,
|
|
PSHASH_FUNCTABLE pFuncTable);
|
|
|
|
|
|
void
|
|
ShashTerminateHashTable(
|
|
PSHASH_TABLE pHashTable
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
SHashInsertKey(IN PSHASH_TABLE pTable,
|
|
IN void * pData,
|
|
IN void * pvKeyIn,
|
|
IN DWORD InsertFlag
|
|
);
|
|
|
|
|
|
|
|
NTSTATUS
|
|
SHashRemoveKey( IN PSHASH_TABLE pTable,
|
|
IN void * pvKeyIn,
|
|
IN PFNREMOVEKEY pRemoveFunc
|
|
);
|
|
|
|
|
|
PSHASH_HEADER
|
|
SHashLookupKeyEx( IN PSHASH_TABLE pTable,
|
|
IN void* pvKeyIn
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
SHashIsKeyInTable( IN PSHASH_TABLE pTable,
|
|
IN void* pvKeyIn
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
SHashGetDataFromTable( IN PSHASH_TABLE pTable,
|
|
IN void* pvKeyIn,
|
|
IN void ** ppData
|
|
);
|
|
|
|
NTSTATUS
|
|
ShashEnumerateItems(IN PSHASH_TABLE pTable,
|
|
IN PFNENUMERATEKEY pfnCallback,
|
|
IN LPVOID lpvClientContext
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
SHashReleaseReference( IN PSHASH_TABLE pTable,
|
|
IN PSHASH_HEADER pData
|
|
);
|
|
|
|
|
|
PSHASH_HEADER
|
|
SHashStartEnumerate(
|
|
IN PSHASH_ITERATOR pIterator,
|
|
IN PSHASH_TABLE pTable
|
|
);
|
|
|
|
PSHASH_HEADER
|
|
SHashNextEnumerate(
|
|
IN PSHASH_ITERATOR pIterator,
|
|
IN PSHASH_TABLE pTable);
|
|
|
|
|
|
VOID
|
|
SHashFinishEnumerate(
|
|
IN PSHASH_ITERATOR pIterator,
|
|
IN PSHASH_TABLE pTable
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
SHashMarkForDeletion( IN PSHASH_TABLE pTable,
|
|
IN PSHASH_HEADER pData
|
|
);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#pragma warning(default: 4200)
|
|
#endif
|