bluacat
驱动小牛
驱动小牛
  • 注册日期2004-09-13
  • 最后登录2016-09-25
  • 粉丝0
  • 关注0
  • 积分1023分
  • 威望277点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1806回复:5

文件状态的跟踪问题

楼主#
更多 发布于:2007-03-22 19:52
  参考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系列的软件,均发现状态不正确。明明在写。可是安装以上的方法却是已经关闭了。

请高人指点一二。
bluacat
驱动小牛
驱动小牛
  • 注册日期2004-09-13
  • 最后登录2016-09-25
  • 粉丝0
  • 关注0
  • 积分1023分
  • 威望277点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-03-26 23:47
up
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
板凳#
发布于:2007-03-27 11:04
也正在研究中,cad没有图签的是好的,有图签就出错
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-27 12:48
HASH 冲突你如何处理的?
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
地下室#
发布于:2007-03-27 19:21
1。比较常用的就是二级HASH。
2。状态不对,估计是STREAM的原因。
人总在矛盾中徘徊。。。
bluacat
驱动小牛
驱动小牛
  • 注册日期2004-09-13
  • 最后登录2016-09-25
  • 粉丝0
  • 关注0
  • 积分1023分
  • 威望277点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
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那篇文章做的。
游客

返回顶部