阅读:1805回复:5
文件状态的跟踪问题
参考OSR的此文Tracking State and Context - Reference Counting for File System Filter Drivers<http://www.osronline.com/article.cfm?id=102
>和toolfoot的代码,我hashtable保存Fileobject->fsContext.来跟踪文件的状态。 office系列和记事本都没问题,但是CAD系列的软件,均发现状态不正确。明明在写。可是安装以上的方法却是已经关闭了。 请高人指点一二。 |
|
沙发#
发布于:2007-03-26 23:47
![]() |
|
板凳#
发布于:2007-03-27 11:04
也正在研究中,cad没有图签的是好的,有图签就出错
|
|
地板#
发布于:2007-03-27 12:48
HASH 冲突你如何处理的?
|
|
地下室#
发布于:2007-03-27 19:21
1。比较常用的就是二级HASH。
2。状态不对,估计是STREAM的原因。 |
|
|
5楼#
发布于:2007-03-27 21:55
1.HASH 冲突你如何处理的?
我代码如下: VOID AddHashEntry(IN PDCI_USER_OBJECT UserObj, IN PFILE_OBJECT FileObject) { PCHAR buffer = NULL; PHASH_ENTRY newHash = NULL; PHASH_ENTRY pHash = NULL; KIRQL oldIrql; PLIST_ENTRY pListHead; UINT_PTR hashIndex; ASSERT(UserObj && FileObject); ASSERT(UserObj->objType == USER_OBJECT_FILE_IN_ACL || UserObj->objType == USER_OBJECT_PROC_IN_ACL); //FreeHashEntry(FileObject); //用fscontext 作为Key hashIndex = HASH_FUNC(FileObject); KeAcquireSpinLock( &gHashLockTable[hashIndex],&oldIrql); pListHead = &gHashTable[hashIndex]; //查找 pHash = HashBucketLookup(pListHead,FileObject); if (pHash != NULL) { // // Update UserObject // pHash->RefCount += 1; pHash->UserObject.AclFileStatus = UserObj->AclFileStatus; KdPrint(("addHash ! hi:%d p:%d Exits fo:%p ref:%d Afg:%d At:%d \n", hashIndex, PsGetCurrentProcessId(), FileObject, pHash->RefCount, pHash->UserObject.AccessFlag, pHash->UserObject.AclFileStatus )); KeReleaseSpinLock(&gHashLockTable[hashIndex], oldIrql); return; } // // add hashentry // buffer = AllocateHashEntryBuffer(); if (buffer == NULL) { KeReleaseSpinLock(&gHashLockTable[hashIndex], oldIrql); KdPrint(("AddHash Allocate Mem Error\n")); return; } newHash = (PHASH_ENTRY) buffer; RtlCopyMemory(&newHash->UserObject,UserObj,sizeof(DCI_USER_OBJECT)); newHash->fsContext = FileObject; newHash->RefCount = 1; newHash->UserObject.ProcID = (ULONG)PsGetCurrentProcessId(); // // Put it in the hash table // InsertHeadList(&gHashTable[hashIndex],&newHash->List); KeReleaseSpinLock(&gHashLockTable[hashIndex], oldIrql); // // Save ACL Entry ProcessName and Handle // //AddNewAclProc(); KdPrint(("**addHash! hi:%d p:%d fo:%p TYPE:%d AcFlag:%d aclStaus:%d \n", hashIndex, PsGetCurrentProcessId(), FileObject, UserObj->objType, UserObj->AccessFlag, UserObj->AclFileStatus)); return; } 2.状态不对,估计是STREAM的原因 问题不大,完全按照OSR那篇文章做的。 |
|