hive中的subkeylist的结构详解。。

在网上找了一圈。。也没有找到相关的资料。。一点都没有。。。  还有有大米公开的代码供参考。。。 赶紧把学习的成果记录下来。。

CM_KEY_NODE 的结构:

 +0x014 SubKeyCounts      : [2] Uint4B                 //SubKeyCounts[0]子键的个数

 +0x01c SubKeyLists       : [2] Uint4B              //SubKeyLists[0]子键列表相差本BIN的偏移

这里的subKeyList是一个偏移。。指向 CM_KEY_INDEX结构。。最复杂的也是这个结构。。

他有好几种变形。。。

可以是:

lf 结构

    + lf

    +lh

li 结构

ri 结构

可以根据 signature判断当前的index 属于那种结构。。对于每一种结构都有对应的 格式

struct lf_key {

  short id;         /* 0x0000 Word ID: ASCII-"lf" = 0x666C or "lh" = 0x686c */
  short no_keys;    /* 0x0002 Word number of keys          */
                    /* 0x0004 ???? Hash-Records            */
 
 union {

    struct lf_hash {
      long ofs_nk;    /* 0x0000 D-Word Offset of corresponding "nk"-Record  */
      char name[4];   /* 0x0004 D-Word ASCII: the first 4 characters of the key-name,  */
    } hash[1];

      /* WinXP uses a more real hash instead (base 37 of uppercase name chars)  */
      /*   padded with 0's. Case sensitiv!                         */

    struct lh_hash {
      long ofs_nk;    /* 0x0000 D-Word Offset of corresponding "nk"-Record  */
      long hash;      /* 0x0004 D-Word ASCII: the first 4 characters of the key-name,  */
    } lh_hash[1];
  };

};

/* 3.x version of the above, contains only offset table, NOT
 * any start of names "hash". Thus needs 'nk' lookups for searches.
 */
struct li_key {

  short id;         /* 0x0000 Word ID: ASCII-"li" = 0x696C */
  short no_keys;    /* 0x0002 Word number of keys          */
                    /* 0x0004 ???? Hash-Records            */
  struct li_hash {
    long ofs_nk;    /* 0x0000 D-Word Offset of corresponding "nk"-Record  */
  } hash[1];
};


/* This is a list of pointers to struct li_key, ie
 * an extention record if many li's.
 * This happens in NT4&5 when the lf hashlist grows larger
 * than about 400-500 entries/subkeys??, then the nk_key->ofs_lf points to this
 * instead of directly to an lf.
 * The sub-indices this points to seems to be li (yes!) in NT4 and 2k.
 * In XP and newer they point to lh which is more efficient.
 * Likely to happen in HKLM\Software\classes (file extention list) and
 * in SAM when many users.
 */
struct ri_key {

  short id;         /* 0x0000 Word ID: ASCII-"ri" = 0x6972 */
  short no_lis;    /* 0x0002 Word number of pointers to li */
                    /* 0x0004 ???? Hash-Records            */
  struct ri_hash {
      long ofs_li;    /* 0x0000 D-Word Offset of corresponding "li"-Record  */
  } hash[1];
};

 

当subkey的数量大约500时。。是ri结构。。ri结构保存了li结构或lf结构的索引。。

 

枚举一个Key的subKey的code:

 

Code

 

如果没有ri结构:找到subkey的 CM_Key_NODE结构的过程是这样的:

                                                  index.hash[i].ofs_nk

1.subKeyList--------》index结构----------------------------》key_Node

 

有ri结构:

                                                         rikey->hash[r].ofs_li                            index.hash[i].ofs_nk   

subkeylist ----------------> ri_index--------------------------------->li/lf结构----------------------------------》 Key_node

 

真日啊 。。。费劲。。

 


 

 

 

 

 

 

 

 

posted @ 2009-07-06 22:42  甜甜嘟嘟  阅读(607)  评论(0编辑  收藏  举报