CmpCheckValueList

INT64 __fastcall CmpCheckValueList(
        _HHIVE *Hive,
        INT64 SymLink,
        _CELL_DATA *List,
        UINT64 Count,
        UINT64 KeyCell,
        _RTL_BITMAP *Bitmap,
        UINT *MaxValueNameLen,
        UINT *MaxValueDataLen,
        UINT64 CheckFlags){
  unsigned int v9; 
  char v10; 
  _RTL_BITMAP *v11; 
  UINT v13; 
  unsigned __int64 v14; 
  char *v15; 
  bool v16; 
  __int64 v17; 
  unsigned int Length; 
  _HMAP_ENTRY *v19; 
  _CELL_DATA *v20; 
  int *v21; 
  int v22; 
  int v23; 
  unsigned int v24; 
  unsigned int v25; 
  __int64 v26; 
  bool v27; 
  _CELL_DATA *v28; 
  _CELL_DATA *v29; 
  unsigned int v30; 
  int Flags; 
  unsigned __int16 v32; 
  unsigned int v33; 
  unsigned __int16 v34; 
  unsigned int LowPart; 
  UINT Data; 
  _CELL_DATA *v37; 
  UINT64 v38; 
  _CELL_DATA *v39; 
  __int64 v40; 
  __int64 v41; 
  __int64 v42; 
  __int64 v43; 
  _CELL_DATA *v44; 
  __int64 v45; 
  unsigned int v46; 
  char v47; 
  unsigned int v48; 
  _CELL_DATA *v49; 
  UINT64 v50; 
  __int64 v51; 
  int v52; 
  UINT64 Point; 
  UINT64 Pointa; 
  UINT v56; 
  char v57; 
  int v58[2]; 
  char v59; 
  char *v60; 
  int v61[2]; 
  _CELL_DATA *v62; 
  int v63[2]; 
  unsigned int v64; 
  int v65[2]; 
  _RTL_BITMAP *BitMap; 
  int v67[2]; 
  PVOID CellIndex; 
  _CELL_DATA *v69; 
  _DWORD *v70; 
  unsigned int *v71; 
  _QWORD v72[3]; 
  unsigned int *v73; 

  v9 = Count;
  LODWORD(CellIndex) = KeyCell;
  v10 = SymLink;
  v64 = Count;
  v11 = (_RTL_BITMAP *)MaxValueNameLen;
  v13 = 0;
  v58[1] = 0;
  v59 = SymLink;
  v69 = List;
  BitMap = (_RTL_BITMAP *)MaxValueNameLen;
  v70 = (_DWORD *)CheckFlags;
  v71 = v73;
  v56 = 0;
  v58[0] = -1;
  v61[0] = -1;
  v61[1] = 0;
  v67[0] = -1;
  v67[1] = 0;
  v65[0] = -1;
  v65[1] = 0;
  v63[0] = -1;
  v63[1] = 0;
  v57 = 0;
  strcpy((char *)v72, "SymbolicLinkValue");
  if( MaxValueDataLen )
  {
    *((_QWORD *)MaxValueDataLen + 34) = List;
    MaxValueDataLen[70] = -1;
    MaxValueDataLen[71] = 0;
    *((_QWORD *)MaxValueDataLen + 36) = 0i64;
  }
  *(_DWORD *)CheckFlags = 0;
  *v73 = 0;
  if( !v9 )
    return 0;
  while( 1 )
  {
    v14 = List->u.KeyList[v13];
    v15 = (char *)List + 4 * v13;
    v60 = v15;
    if( v10 && v9 != 1 )
    {
      v33 = -1073741492;
      LODWORD(Point) = 64;
      goto LABEL_141;
    }
    if( (_DWORD)v14 == -1 )
    {
      LODWORD(Point) = 80;
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Point);
      if( MaxValueDataLen )
      {
        MaxValueDataLen[71] = -1;
        goto LABEL_130;
      }
      goto LABEL_131;
    }
    v62 = 0i64;
    v16 = (Hive->_bf_8c & 1) == 0;
    LODWORD(v62) = -1;
    if( v16 )
    {
      v17 = (unsigned int)v14 >> 31;
      Length = Hive->Storage[v17].Length;
      if( (v14 & 0x7FFFFFFF) >= Length || (v14 & 7) != 0 )
        goto LABEL_27;
      if( v11 && (v14 & 0x80000000) == 0i64 )
      {
        if( !_bittest64((const signed __int64 *)v11->Buffer, (unsigned int)v14 >> 3) )
          goto LABEL_27;
        RtlClearBits(v11, (unsigned int)v14 >> 3, 1u);
        Length = Hive->Storage[v17].Length;
      }
      if( (unsigned int)v14 + (v14 & 0x80000000) >= Length )
        goto LABEL_27;
      v19 = &Hive->Storage[v17].Map->Directory[(v14 >> 21) & 0x3FF]->Table[(v14 >> 12) & 0x1FF];
      if( !v19 || (v19->PermanentBinAddress & 2) != 0 )
        goto LABEL_27;
      v20 = Hive->GetCellRoutine(Hive, (unsigned int)v14, &v62);
      if( v20 )
      {
        v21 = (int *)&v20[-1].u.KeyString[38];
        if( v21 )
        {
          v22 = (int)v21;
          v23 = *v21;
          v24 = v22 - (v19->PermanentBinAddress & 0xFFFFFFF0);
          v25 = -v23;
          v27 = 0;
          if( v23 < 0 && v25 - 8 <= 0xFFFF8 )
          {
            v26 = *(unsigned int *)((v19->PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64) + 8);
            if( v25 <= (unsigned __int64)(v26 - 32) && v24 - v23 <= (unsigned int)v26 && v24 >= 0x20 )
              v27 = 1;
          }
          Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)&v62);
          if( !v27 )
          {
LABEL_27:
            LODWORD(Point) = 96;
            SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Point);
            if( MaxValueDataLen )
            {
              MaxValueDataLen[71] = v14;
LABEL_130:
              MaxValueDataLen[70] = v13;
              goto LABEL_131;
            }
            goto LABEL_131;
          }
        }
      }
    }
    v28 = Hive->GetCellRoutine(Hive, (unsigned int)v14, v58);
    v29 = v28;
    if( !v28 )
    {
      v33 = -1073741670;
      LODWORD(Point) = 112;
LABEL_141:
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 0i64, _CmpCheckValueList, v33, Point);
      if( MaxValueDataLen )
      {
        MaxValueDataLen[70] = v13;
        MaxValueDataLen[71] = v14;
      }
      return v33;
    }
    v30 = -4 - *(_DWORD *)&v28[-1].u.KeyString[38];
    if( v30 < 0x14 )
    {
      LODWORD(Point) = 128;
      goto LABEL_124;
    }
    if( v28->u.KeyNode.Signature != 27510 )
    {
      LODWORD(Point) = 136;
      goto LABEL_124;
    }
    Flags = v28->u.KeyNode.Flags;
    if( Flags + 20 > v30 )
    {
      LODWORD(Point) = 144;
      goto LABEL_124;
    }
    v32 = v28->u.KeyValue.Flags;
    if( (v32 & 1) != 0 )
    {
      if( (unsigned __int16)Flags > 0x3FFFu )
      {
        LODWORD(Point) = 146;
        goto LABEL_124;
      }
    }
    else
    {
      if( (Flags & 1) != 0 )
      {
        LODWORD(Point) = 148;
        goto LABEL_124;
      }
      if( (unsigned __int16)Flags > 0x7FFFu )
      {
        LODWORD(Point) = 150;
        goto LABEL_124;
      }
    }
    if( (Hive->BaseBlock->Flags & 2) == 0 && (v32 & 2) != 0 )
    {
      v57 = 1;
      v33 = -1073741492;
      if( MaxValueDataLen )
      {
        MaxValueDataLen[70] = v13;
        MaxValueDataLen[71] = v14;
        *((_QWORD *)MaxValueDataLen + 36) = v28;
      }
      if( ((unsigned int)Bitmap & 0x20000) != 0
        || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
      {
        LODWORD(Point) = 156;
        v50 = 0i64;
LABEL_145:
        SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, v50, _CmpCheckValueList, v33, Point);
LABEL_146:
        Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v58);
        return v33;
      }
      LODWORD(Point) = 152;
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Point);
      if( !HvpMarkCellDirty(Hive, (PVOID)(unsigned int)v14, 0, CmHiveDirtyNormal) )
      {
        v33 = -1073741443;
        LODWORD(Point) = 154;
        v50 = 1i64;
        goto LABEL_145;
      }
      v10 = v59;
      v29->u.KeyValue.Flags &= ~2u;
      Hive->BaseBlock->BootType |= 4u;
    }
    if( v10 )
    {
      if( *(_QWORD *)&v29->u.KeyString[10] != v72[0]
        || *(_QWORD *)&v29->u.KeyString[14] != v72[1]
        || LOBYTE(v29->u.KeyString[18]) != LOBYTE(v72[2]) )
      {
        LODWORD(Point) = 160;
        goto LABEL_149;
      }
      if( v29->u.KeyValue.Type != 6 && (v29->u.KeyString[8] & 2) == 0 )
      {
        LODWORD(Point) = 176;
        goto LABEL_149;
      }
    }
    v34 = 2 * v29->u.KeyNode.Flags;
    if( (v29->u.KeyString[8] & 1) == 0 )
      v34 = v29->u.KeyNode.Flags;
    if( *v70 < (unsigned int)v34 )
      *v70 = v34;
    LowPart = v29->u.KeyNode.LastWriteTime.anonymous_0.LowPart;
    if( v10 )
    {
      if( (LowPart & 1) != 0 )
      {
        LODWORD(Point) = 192;
      }
      else
      {
        if( LowPart <= 0xFFFF )
          goto LABEL_60;
        LODWORD(Point) = 208;
      }
LABEL_149:
      v33 = -1073741492;
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 0i64, _CmpCheckValueList, 3221225804i64, Point);
      if( MaxValueDataLen )
      {
        MaxValueDataLen[70] = v13;
        MaxValueDataLen[71] = v14;
        *((_QWORD *)MaxValueDataLen + 36) = v29;
      }
      goto LABEL_146;
    }
LABEL_60:
    if( (v29->u.KeyString[8] & 2) != 0 )
    {
      if( LowPart || v29->u.KeyValue.Type )
      {
        LODWORD(Point) = 224;
        goto LABEL_124;
      }
    }
    else if( LowPart >= 0x80000000 )
    {
      if( LowPart + 0x80000000 <= 4 )
        goto LABEL_113;
      LODWORD(Point) = 416;
LABEL_124:
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Point);
      goto LABEL_125;
    }
    Data = v29->u.KeyValue.Data;
    v37 = 0i64;
    if( LowPart )
    {
      if( !HvIsCellAllocated(Hive, Data, BitMap) )
      {
        LODWORD(Point) = 240;
        SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Point);
        v13 = v56;
LABEL_125:
        if( MaxValueDataLen )
        {
          MaxValueDataLen[70] = v13;
          MaxValueDataLen[71] = v14;
          *((_QWORD *)MaxValueDataLen + 36) = v29;
        }
        goto LABEL_127;
      }
      v37 = Hive->GetCellRoutine(Hive, Data, v61);
      if( !v37 )
      {
        LODWORD(Point) = 256;
        v33 = -1073741670;
        SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 0i64, _CmpCheckValueList, 3221225626i64, Point);
        if( MaxValueDataLen )
        {
          MaxValueDataLen[70] = v56;
          MaxValueDataLen[71] = Data;
        }
        goto LABEL_146;
      }
    }
    else if( Data != -1 )
    {
      LODWORD(Point) = 224;
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Point);
      v13 = v56;
      goto LABEL_125;
    }
    if( Hive->Version < 4 || LowPart <= 0x3FD8 )
    {
      if( !LowPart || LowPart <= -4 - *(_DWORD *)&v37[-1].u.KeyString[38] )
        goto LABEL_87;
      LODWORD(Point) = 400;
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Point);
      v13 = v56;
      if( MaxValueDataLen )
      {
        MaxValueDataLen[70] = v56;
        MaxValueDataLen[71] = v14;
        *((_QWORD *)MaxValueDataLen + 36) = v29;
      }
LABEL_104:
      Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v61);
LABEL_127:
      Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v58);
      v15 = v60;
      goto LABEL_131;
    }
    if( (unsigned int)(-4 - *(_DWORD *)&v37[-1].u.KeyString[38]) < 8
      || v37->u.KeyNode.Signature != 25188
      || !v37->u.KeyNode.Flags
      || (v38 = v37->u.KeyNode.LastWriteTime.anonymous_0.LowPart, (_DWORD)v38 == -1) )
    {
      LODWORD(Point) = 272;
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Point);
      if( MaxValueDataLen )
      {
        MaxValueDataLen[70] = v56;
        MaxValueDataLen[71] = Data;
      }
      Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v61);
      Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v58);
      v13 = v56;
      v15 = v60;
      goto LABEL_131;
    }
    if( !HvIsCellAllocated(Hive, v38, BitMap) )
    {
      LODWORD(Point) = 288;
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Point);
      v13 = v56;
      if( MaxValueDataLen )
      {
        MaxValueDataLen[70] = v56;
        MaxValueDataLen[71] = v37->u.KeyNode.LastWriteTime.anonymous_0.LowPart;
        *((_QWORD *)MaxValueDataLen + 36) = v37;
      }
      goto LABEL_104;
    }
    v39 = Hive->GetCellRoutine(Hive, v37->u.KeyNode.LastWriteTime.anonymous_0.LowPart, v63);
    v62 = v39;
    v40 = (__int64)v39;
    if( !v39 )
    {
      LODWORD(Point) = 304;
      v33 = -1073741670;
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 0i64, _CmpCheckValueList, 3221225626i64, Point);
      if( MaxValueDataLen )
      {
        MaxValueDataLen[70] = v56;
        MaxValueDataLen[71] = v37->u.KeyNode.LastWriteTime.anonymous_0.LowPart;
      }
LABEL_160:
      Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v61);
      goto LABEL_146;
    }
    v41 = v37->u.KeyNode.Flags;
    if( (unsigned __int64)(4 * v41) < 4
      || 4 * v41 > (unsigned __int64)(unsigned int)(-4 - *(_DWORD *)&v39[-1].u.KeyString[38]) )
    {
      LODWORD(Point) = 320;
      goto LABEL_99;
    }
    if( (_DWORD)v41 != (LowPart + 16343) / 0x3FD8 )
    {
      LODWORD(Point) = 336;
LABEL_99:
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Point);
      v13 = v56;
      if( MaxValueDataLen )
      {
        MaxValueDataLen[70] = v56;
        MaxValueDataLen[71] = v14;
        *((_QWORD *)MaxValueDataLen + 36) = v29;
      }
      Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v63);
      goto LABEL_104;
    }
    v42 = 0i64;
    if( !(_DWORD)v41 )
    {
LABEL_86:
      ((void(__fastcall *)(_HHIVE *, int *, __int64, __int64))Hive->ReleaseCellRoutine)(Hive, v63, v41, v40);
LABEL_87:
      if( v37 )
        Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v61);
      LowPart = v29->u.KeyNode.LastWriteTime.anonymous_0.LowPart;
      v13 = v56;
LABEL_113:
      v46 = LowPart + 0x80000000;
      if( LowPart < 0x80000000 )
        v46 = LowPart;
      if( *v71 < v46 )
        *v71 = v46;
      Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v58);
      v47 = v57;
      ++v13;
      v9 = v64;
      v56 = v13;
      goto LABEL_138;
    }
    while( HvIsCellAllocated(Hive, *(unsigned int *)(v40 + 4 * v42), BitMap) )
    {
      v43 = (__int64)v62;
      v44 = Hive->GetCellRoutine(Hive, v62->u.KeyList[v42], v65);
      if( !v44 )
      {
        LODWORD(Point) = 368;
        v33 = -1073741670;
        SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 0i64, _CmpCheckValueList, 3221225626i64, Point);
        if( MaxValueDataLen )
        {
          v51 = (__int64)v62;
          MaxValueDataLen[70] = v42;
          MaxValueDataLen[71] = *(_DWORD *)(v51 + 4 * v42);
          *((_QWORD *)MaxValueDataLen + 36) = v37;
        }
        Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v63);
        goto LABEL_160;
      }
      if( (unsigned int)(-4 - *(_DWORD *)&v44[-1].u.KeyString[38]) < 0x3FD8 )
      {
        LODWORD(Point) = 384;
        SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Point);
        if( MaxValueDataLen )
        {
          MaxValueDataLen[70] = v42;
          MaxValueDataLen[71] = *(_DWORD *)(v43 + 4 * v42);
          *((_QWORD *)MaxValueDataLen + 36) = v37;
        }
        Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v65);
        Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v63);
        Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v61);
        Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v58);
        v13 = v56;
        v15 = v60;
        goto LABEL_131;
      }
      Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v65);
      v42 = (unsigned int)(v42 + 1);
      v40 = v43;
      if( (unsigned int)v42 >= v37->u.KeyNode.Flags )
        goto LABEL_86;
    }
    LODWORD(Point) = 352;
    SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Point);
    if( MaxValueDataLen )
    {
      v45 = (__int64)v62;
      MaxValueDataLen[70] = v42;
      MaxValueDataLen[71] = *(_DWORD *)(v45 + 4 * v42);
      *((_QWORD *)MaxValueDataLen + 36) = v37;
    }
    Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v63);
    Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v61);
    Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v58);
    v13 = v56;
    v15 = v60;
LABEL_131:
    if( ((unsigned int)Bitmap & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
    {
      LODWORD(Pointa) = 48;
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 0i64, _CmpCheckValueList, 3221225804i64, Pointa);
      return(unsigned int)-1073741492;
    }
    LODWORD(Pointa) = 0;
    SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 1ui64, _CmpCheckValueList, 3221225804i64, Pointa);
    v48 = (unsigned int)CellIndex;
    v49 = Hive->GetCellRoutine(Hive, (unsigned int)CellIndex, v67);
    if( !v49 )
    {
      LODWORD(Point) = 16;
      v33 = -1073741670;
      SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 0i64, _CmpCheckValueList, 3221225626i64, Point);
      return v33;
    }
    if( !HvpMarkCellDirty(Hive, (PVOID)v48, 0, CmHiveDirtyNormal) )
      break;
    if( !HvpMarkCellDirty(Hive, (PVOID)v49->u.KeyNode.ValueList.List, 0, CmHiveDirtyNormal) )
    {
      v52 = 40;
      goto LABEL_166;
    }
    --v49->u.KeyNode.ValueList.Count;
    v9 = --v64;
    memmove(v15, &v69->u.KeyIndex.List[v13], 4 * (v64 - v13));
    Hive->BaseBlock->BootType |= 4u;
    Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v67);
    v47 = 1;
    v57 = 1;
LABEL_138:
    if( v13 >= v9 )
    {
      if( v47 )
        return(unsigned int)-2147483606;
      return 0;
    }
    v11 = BitMap;
    v10 = v59;
    List = v69;
  }
  v52 = 24;
LABEL_166:
  LODWORD(Point) = v52;
  v33 = -1073741443;
  SetFailureLocation((_HIVE_LOAD_FAILURE *)MaxValueDataLen, 0i64, _CmpCheckValueList, 3221225853i64, Point);
  Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v67);
  return v33;
}

Referenced by:

CmpCheckKey