学习下哈希表,这个哈希表的例子是在filemon中提取出来的
这里是哈希表的一些简单介绍
http://www.bccn.net/Article/kfyy/sjjg/200411/260.html
哈希表结构:
// Structure for the fileobject/name hash table
//文件对象和名字散列表
typedef struct _nameentry {
PFILE_OBJECT FileObject;
PCHAR FullPathName;
struct _nameentry *Next;
} HASH_ENTRY, *PHASH_ENTRY;
//最大的能装的树木
// Number of hash buckets in the hash table
//
#define NUMHASH 0x100
//
// Hash function. Basically chops the low few bits of the file object
//哈希表定位的方法,感觉是(除留余数法)
#define HASHOBJECT(_fileobject) (((ULONG)_fileobject)>>5)%NUMHASH
//查找我们的fileobject是否存在于哈希表中
// First, lookup the object in the hash table to see if a name
// has already been generated for it
//首先,在hash表中循环对象去看看是否name已经存在了
KeAcquireSpinLock( &HashMutex, &oldirql );
//这里还添上了自己的fileobject,防止哈希表冲突
hashEntry = HashTable[ HASHOBJECT( fileObject ) ];
while( hashEntry && hashEntry->FileObject != fileObject ) //这个就算是查找算法了
{
hashEntry = hashEntry->Next;
}
//
// Did we find an entry?
//
if( hashEntry )
{
//
// Yes, so get the name from the entry.
//
strcpy( fullPathName, hashEntry->FullPathName );
KeReleaseSpinLock( &HashMutex, oldirql );
return;
}
KeReleaseSpinLock( &HashMutex, oldirql );
//得到fileobject后,我们存进哈希表中去
// Now that we have a name associated with the file object, put the
// association in a hash table
//
KeAcquireSpinLock( &HashMutex, &oldirql );
//
// Allocate a hash entry
//将我们得到的全盘路径名放到hash表中
newEntry = MemAllocateFromNPagedLookasideList( &HashLookaside );
//
// If no memory for a new entry, oh well.
//
if( newEntry )
{
//
// Fill in the new entry and put it in the hash table
//
newEntry->FileObject = fileObject;
newEntry->FullPathName = MemAllocatePool( NonPagedPool, strlen(fullPathName)+1);//分配空间
//
// Make sure there was memory for the name
//
if( !newEntry->FullPathName )
{
MemFreeToNPagedLookasideList( &HashLookaside, newEntry );
}
else
{
//哈希表,HashTable[ HASHOBJECT(fileObject) ] = newEntry; 定位方法,取fileobject低5位然后%NUMHASH。
newEntry->Next = HashTable[ HASHOBJECT(fileObject) ];
HashTable[ HASHOBJECT(fileObject) ] = newEntry;
strcpy( newEntry->FullPathName, fullPathName );
}
}
KeReleaseSpinLock( &HashMutex, oldirql );
和哈,又学习了一个数据结构了