学习filemon中的哈希表

学习下哈希表,这个哈希表的例子是在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;       定位方法,取fileobject5位然后%NUMHASH

            newEntry->Next = HashTable[ HASHOBJECT(fileObject) ];

            HashTable[ HASHOBJECT(fileObject) ] = newEntry; 

            strcpy( newEntry->FullPathName, fullPathName );

        }

    }

    KeReleaseSpinLock( &HashMutex, oldirql );

和哈,又学习了一个数据结构了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值