当前位置 博文首页 > KOOKNUT的博客:定位HandleTableEntry(Windows内核学习笔记)

    KOOKNUT的博客:定位HandleTableEntry(Windows内核学习笔记)

    作者:[db:作者] 时间:2021-07-03 09:21

    通过HandleTable定位HandleTableEntry的方法:

    typedef union _EXHANDLE
    {
         struct
         {
             ULONG_PTR TagBits:2;//这两位为0
             ULONG_PTR Index:29;//句柄表的索引
         };
         struct
         {
             ULONG_PTR TagBits2:2;
             ULONG_PTR LowIndex:HANDLE_LOW_BITS;
             ULONG_PTR MidIndex:HANDLE_HIGH_BITS;
             ULONG_PTR HighIndex:HANDLE_HIGH_BITS;
             ULONG_PTR KernelFlag:KERNEL_FLAG_BITS;
         };
         HANDLE GenericHandleOverlay;
         ULONG_PTR Value;
    } EXHANDLE, *PEXHANDLE;
    PHANDLE_TABLE_ENTRY
    NTAPI
    ExpLookupHandleTableEntry(IN PHANDLE_TABLE HandleTable,
                              IN EXHANDLE Handle)
    {
        ULONG TableLevel;//句柄层数
        ULONG_PTR TableBase;//句柄表基地址
        PHANDLE_TABLE_ENTRY HandleArray, Entry;
        PVOID *PointerArray;
    
        /*清空标签位*/
        Handle.TagBits = 0;
    
        /*检查句柄值是否位于分配的范围内*/
        if (Handle.Value >= HandleTable->NextHandleNeedingPool)
        {
            return NULL;
        }
    
        /*得到TableCode值*/
        TableBase = HandleTable->TableCode;
    
        /*得到句柄表的层级数,以及句柄表的基地址*/
        TableLevel = (ULONG)(TableBase & 3);
        TableBase &= ~3;//抹掉最低3位,得真实地址
    
        PointerArray = (PVOID*)TableBase;//指向指针,指针又指向HandleEntry
        HandleArray = (PHANDLE_TABLE_ENTRY)TableBase;//指向HandleEntry
    
        /*检查在哪一级*/
        switch (TableLevel)
        {
            case 2:
    
                /*最高级*/
                PointerArray = PointerArray[Handle.HighIndex];
    
                /* Fall through */
            case 1:
    
                /*中间层级*/
                HandleArray = PointerArray[Handle.MidIndex];
    
                /* Fall through */
            case 0:
    
                /*最底层*/
                Entry = &HandleArray[Handle.LowIndex];
    
                /* All done */
                break;
    
            default:
    
                ASSERT(FALSE);
                Entry = NULL;
        }
    
        /* Return the handle entry */
        return Entry;
    }
    

    “失之东隅,收之桑榆。”
    参考资料:
    Reactos源码

    cs
    下一篇:没有了