Filemon的hashtable 看了一下午啊!

具体代码建Filemon  这里我只贴出一部分

 // Allocate a hash entry
  //
  newEntry = ExAllocatePool( NonPagedPool, 
  sizeof(HASH_ENTRY ) + strlen( fullPathName ) + 1);

  //
  // If no memory for a new entry, oh well.
  //
  if( newEntry ) {

  //
  // Fill in the new entry 
  //
  newEntry->FileObject = fileObject;
  strcpy( newEntry->FullPathName, fullPathName );

  //
  // Put it in the hash table
  //
  KeEnterCriticalRegion();
  ExAcquireResourceExclusiveLite( &HashResource, TRUE );

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

  ExReleaseResourceLite( &HashResource );
  KeLeaveCriticalRegion();
这是往哈希表存储数据的代码

 

在查找时是
 hashEntry = HashTable[ HASHOBJECT( fileObject ) ];
  prevEntry = NULL;
  while( hashEntry && hashEntry->FileObject != fileObject ) {
  prevEntry = hashEntry;
  hashEntry = hashEntry->Next;
  }
也就是说存的时候与我们遍历链表不同之处在于 这个起点不是链表的头部
而是从某一位置开始遍历
所以要保证能够找到 存储时也是用某种方法存储的

  newEntry = ExAllocatePool( NonPagedPool, 
  sizeof(HASH_ENTRY ) + strlen( fullPathName ) + 1);先分配内存
  if( newEntry ) {

  //
  // Fill in the new entry 
  //
  newEntry->FileObject = fileObject;
  strcpy( newEntry->FullPathName, fullPathName );

这就向新内存中存放fileObject和fullPathName了

  KeEnterCriticalRegion();
  ExAcquireResourceExclusiveLite( &HashResource, TRUE );

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

  ExReleaseResourceLite( &HashResource );
  KeLeaveCriticalRegion();

最后放入链表
那两个没见过的函数先不要管
看 newEntry->Next = HashTable[ HASHOBJECT(fileObject) ];
  HashTable[ HASHOBJECT(fileObject) ] = newEntry;

让新分配的newEntry指针指向当前的某一地址
然后这一地址=newEntry
也就是Next指向的就是这个自身了
所以这就成为了一个只含有一个元素的链表


下面考虑这个问题:对于HashTable[ HASHOBJECT(fileObject) ];我们有可能遇到:HASHOBJECT(fileObject1)=HASHOBJECT(fileObject2)的情况  

那么: 替换了?先看下面的问题

PHASH_ENTRY HashTable[NUMHASH]这是256个链表啊(NUMHASH=0x100)

  for( i = 0; i < NUMHASH; i++ ) {
  hashEntry = HashTable[i];
  while( hashEntry ) {
  nextEntry = hashEntry->Next;
  ExFreePool( hashEntry );
  hashEntry = nextEntry;
  }
  HashTable[i] = NULL;
  }清空的时候要两层循环 分别用于清空链表和数组



所以肯定没有替换!
所以唯一的解释:HASHOBJECT(fileObject1)=HASHOBJECT(fileObject2)的情况 出现时是链表中增加一个成员
所以我的结论是:这是一个拥有256个成员的数组 该数组中每个元素是一个链表

newEntry->Next = HashTable[ HASHOBJECT(fileObject) ];
  HashTable[ HASHOBJECT(fileObject) ] = newEntry;其实就是将Next=HashTable[ HASHOBJECT(fileObject) ]这个链表的开头  于是这个newEntry就成为了链表头  再把链表头改名为HashTable[ HASHOBJECT(fileObject) ]

 所以我所说的覆盖时错误的 !

这个主要思想 就是分类存储下fileobject和fullname  这样查询的时候就更快捷

 #define HASHOBJECT(_fileobject) (((ULONG)_fileobject)>>5)%NUMHASH其实理解并不难

取指针中的某几位 然后这个作为区分指针的标志   就好像球的颜色很多 号码不同  我把相同颜色的放一起  然后我找的时候先找对应的颜色 再去某种颜色里去找号码

 

学驱动真吃力!经常bsod 我都无能为力   痛苦    想找个指导老师  学校里却没老师做这个  郁闷!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值