具体代码建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 我都无能为力 痛苦 想找个指导老师 学校里却没老师做这个 郁闷!!!