CmpSelectLeaf

__int64 __fastcall CmpSelectLeaf(
        __int64 Hive,
        unsigned int *a2,
        const _UNICODE_STRING *a3,
        _HSTORAGE_TYPE a4,
        __int64 a5){
  void *v7; 
  _CM_KEY_INDEX *v9; 
  signed int i; 
  __int64 v11; 
  unsigned int v13; 
  int v14[2]; 
  int v15[4]; 

  v15[0] = -1;
  v14[0] = -1;
  v7 = (void *)*a2;
  v15[1] = 0;
  v14[1] = 0;
  if( HvMarkCellDirty((PVOID)Hive, v7, 0) )
  {
    v9 = (_CM_KEY_INDEX *)(*(__int64(__fastcall **)(__int64, _QWORD, int *))(Hive + 8))(Hive, *a2, v15);
    if( v9 )
    {
      for( i = CmpFindSubKeyInRoot((_HHIVE *)Hive, v9, a3, 0i64);
            i >= 0;
            i = CmpFindSubKeyInRoot((_HHIVE *)Hive, v9, a3, 0i64) )
      {
        v11 = (*(__int64(__fastcall **)(__int64, _QWORD, int *))(Hive + 8))(Hive, 0i64, v14);
        if( !v11 )
          break;
        if( *(_WORD *)(v11 + 2) < 0x3F5u )
        {
          *(_QWORD *)a5 = &v9->List[i];
          (*(void(__fastcall **)(__int64, int *))(Hive + 16))(Hive, v14);
          (*(void(__fastcall **)(__int64, int *))(Hive + 16))(Hive, v15);
          return 0i64;
        }
        v13 = CmpSplitLeaf(Hive, *a2, i, a4);
        if( v13 == -1
          || ((*(void(__fastcall **)(__int64, int *))(Hive + 16))(Hive, v15),
              *a2 = v13,
              (v9 = (_CM_KEY_INDEX *)(*(__int64(__fastcall **)(__int64, _QWORD, int *))(Hive + 8))(Hive, v13, v15)) == 0i64) )
        {
          (*(void(__fastcall **)(__int64, int *))(Hive + 16))(Hive, v14);
          break;
        }
        (*(void(__fastcall **)(__int64, int *))(Hive + 16))(Hive, v14);
      }
      if( v9 )
        (*(void(__fastcall **)(__int64, int *))(Hive + 16))(Hive, v15);
    }
  }
  return 0xFFFFFFFFi64;
}

Referenced by:

CmpAddSubKeyToList