Leaked source code of windows server 2003
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

//
// 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