CmpCheckKey

INT64 __fastcall CmpCheckKey(
        _HHIVE *HiveToCheck,
        UINT64 CheckFlags,
        UINT64 Cell,
        UINT64 ParentCell,
        UINT8 ResetSD,
        _RTL_BITMAP *Bitmap){
  _HIVE_LOAD_FAILURE *v6; 
  unsigned int v8; 
  unsigned int v9; 
  unsigned int v10; 
  _CELL_DATA *v12; 
  _CELL_DATA *v13; 
  unsigned int v14; 
  unsigned int NameLength; 
  unsigned int v16; 
  char v17; 
  unsigned int v18; 
  unsigned int v19; 
  int v20; 
  UINT64 v21; 
  unsigned int ClassLength; 
  unsigned int Class; 
  unsigned int Security; 
  _CELL_DATA *v25; 
  bool v26; 
  void(__fastcall *ReleaseCellRoutine)(_HHIVE *, _HV_GET_CELL_CONTEXT *); 
  unsigned int v28; 
  _CELL_DATA *v29; 
  _CELL_DATA *v30; 
  _CELL_DATA *v31; 
  _CELL_DATA *v32; 
  _CELL_DATA *v33; 
  unsigned __int16 v34; 
  int v35; 
  unsigned __int16 v36; 
  unsigned int v37; 
  unsigned __int16 Flags; 
  UINT64 v39; 
  UINT64 v40; 
  __int64 v41; 
  unsigned __int16 v42; 
  unsigned int v43; 
  _CELL_DATA *(__fastcall *GetCellRoutine)(_HHIVE *, unsigned int, _HV_GET_CELL_CONTEXT *); 
  _CELL_DATA *v45; 
  unsigned __int64 v46; 
  int v47; 
  _CELL_DATA *v48; 
  int v49; 
  _RTL_BITMAP *v50; 
  _CELL_DATA *v51; 
  _CM_KEY_INDEX *v52; 
  unsigned int v53; 
  unsigned __int16 Signature; 
  int v55; 
  bool v56; 
  int v57; 
  int v58; 
  int Count; 
  int v60; 
  int v61; 
  unsigned int v62; 
  char *v63; 
  _CELL_DATA *v64; 
  _CM_KEY_INDEX *v65; 
  unsigned int v66; 
  unsigned __int16 v67; 
  int v68; 
  __int16 v69; 
  int v70; 
  int v71; 
  int v72; 
  int v73; 
  bool v74; 
  bool v75; 
  UINT64 Point; 
  _RTL_BITMAP *Bitmapa; 
  _CELL_DATA *v78; 
  int v79[2]; 
  UINT64 v80; 
  unsigned int v81; 
  int v82[2]; 
  int v83; 
  int v84; 
  int v85[2]; 
  int v86[2]; 
  UINT64 Index; 
  int v88[2]; 
  int v89[2]; 
  UINT64 Cella; 
  unsigned int v91; 
  unsigned int CellIndex; 
  unsigned int v93; 
  _HIVE_LOAD_FAILURE *HiveLoadFailure; 
  char HiveLoadFailurea; 

  v93 = ParentCell;
  CellIndex = Cell;
  v91 = CheckFlags;
  v6 = HiveLoadFailure;
  v85[1] = 0;
  v80 = 0i64;
  v85[0] = -1;
  v8 = ParentCell;
  v88[0] = -1;
  v9 = Cell;
  v82[0] = -1;
  v10 = CheckFlags;
  v79[0] = -1;
  v89[0] = -1;
  v88[1] = 0;
  v82[1] = 0;
  v79[1] = 0;
  v89[1] = 0;
  HiveLoadFailurea = 0;
  v78 = 0i64;
  if( v6 )
  {
    v6->CheckKey.Cell = Cell;
    v6->CheckKey.CellPoint = 0i64;
    v6->CheckKey.RootPoint = 0i64;
    v6->CheckKey.Index = -1;
  }
  if( !HvIsCellAllocated(HiveToCheck, (unsigned int)Cell, Bitmap) )
  {
    LODWORD(Point) = 0;
    SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225804i64, Point);
    return 3221225804i64;
  }
  v12 = HiveToCheck->GetCellRoutine(HiveToCheck, v9, v88);
  v13 = v12;
  if( !v12 )
  {
    LODWORD(Point) = 16;
    SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225626i64, Point);
    return 3221225626i64;
  }
  if( v6 )
    v6->CheckKey.CellPoint = v12;
  v14 = -4 - *(_DWORD *)&v12[-1].u.KeyString[38];
  if( v14 - 76 > 0x410 )
  {
    LODWORD(Point) = 32;
LABEL_353:
    v18 = -1073741492;
LABEL_354:
    v21 = 0i64;
LABEL_355:
    SetFailureLocation(v6, v21, _CmpCheckKey, v18, Point);
    goto LABEL_356;
  }
  NameLength = v12->u.KeyNode.NameLength;
  if( !(_WORD)NameLength || NameLength + 76 > v14 )
  {
    LODWORD(Point) = 48;
    goto LABEL_353;
  }
  if( (v12->u.KeyValue.NameLength & 0x20) != 0 )
  {
    if( (unsigned __int16)NameLength <= 0x100u )
    {
      if( LOBYTE(v12->u.KeyString[38]) )
      {
        v16 = 0;
        while( *((_BYTE *)&v12->u.KeyString[38] + v16) != 92 )
        {
          if( ++v16 >= NameLength )
            goto LABEL_20;
        }
        LODWORD(Point) = 1280;
      }
      else
      {
        LODWORD(Point) = 64;
      }
    }
    else
    {
      LODWORD(Point) = 53;
    }
    goto LABEL_353;
  }
  if( (unsigned __int16)NameLength > 0x200u )
  {
    LODWORD(Point) = 69;
    goto LABEL_353;
  }
  if( (NameLength & 1) != 0 )
  {
    LODWORD(Point) = 80;
    goto LABEL_353;
  }
  if( !v12->u.KeyNode.Name[0] )
  {
    LODWORD(Point) = 96;
    goto LABEL_353;
  }
  v19 = NameLength >> 1;
  v20 = 0;
  if( v19 )
  {
    while( v12->u.KeyNode.Name[v20] != 92 )
    {
      if( ++v20 >= v19 )
        goto LABEL_20;
    }
    LODWORD(Point) = 1296;
    goto LABEL_353;
  }
LABEL_20:
  v17 = 1;
  if( v12->u.KeyNode.Signature != 27502 )
  {
    HiveLoadFailurea = 1;
    v18 = -1073741492;
    if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
    {
      LODWORD(Point) = 144;
      v21 = 1i64;
      goto LABEL_355;
    }
    LODWORD(Point) = 112;
    SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
    if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
    {
      v18 = -1073741443;
      LODWORD(Point) = 128;
      goto LABEL_354;
    }
    v13->u.KeyNode.Signature = 27502;
    HiveToCheck->BaseBlock->BootType |= 4u;
  }
  if( (HiveToCheck->BaseBlock->Flags & 2) == 0 && (*((_BYTE *)&v13->u.KeyNode + 13) & 3) != 0 )
  {
    HiveLoadFailurea = 1;
    v18 = -1073741492;
    if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
    {
      LODWORD(Point) = 148;
      goto LABEL_354;
    }
    LODWORD(Point) = 146;
    SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
    if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
    {
      v18 = -1073741443;
      LODWORD(Point) = 150;
      goto LABEL_354;
    }
    *((_BYTE *)&v13->u.KeyNode + 13) &= 0xFCu;
    HiveToCheck->BaseBlock->BootType |= 4u;
  }
  if( v8 == -1 )
  {
    if( (*((_BYTE *)&v13->u.KeyNode + 13) & 1) != 0 )
    {
      HiveLoadFailurea = 1;
      v18 = -1073741492;
      if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
      {
        LODWORD(Point) = 492;
        goto LABEL_354;
      }
      LODWORD(Point) = 484;
      SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
      if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
      {
        v18 = -1073741443;
        LODWORD(Point) = 488;
        goto LABEL_354;
      }
      *((_BYTE *)&v13->u.KeyNode + 13) = *((_BYTE *)&v13->u.KeyNode + 13) & 0xFC | 2;
      goto LABEL_58;
    }
  }
  else
  {
    if( (*((_BYTE *)&HiveToCheck->GetCellRoutine(HiveToCheck, v8, v82)->u.KeyNode + 13) & 3) == 3
      && (((*((_BYTE *)&v13->u.KeyNode + 13) & 3) - 1) & 0xFD) != 0 )
    {
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v82);
      HiveLoadFailurea = 1;
      v18 = -1073741492;
      if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
      {
        LODWORD(Point) = 156;
        goto LABEL_354;
      }
      LODWORD(Point) = 152;
      SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
      if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
      {
        v18 = -1073741443;
        LODWORD(Point) = 154;
        goto LABEL_354;
      }
      *((_BYTE *)&v13->u.KeyNode + 13) |= 3u;
LABEL_58:
      HiveToCheck->BaseBlock->BootType |= 4u;
      goto LABEL_59;
    }
    HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v82);
  }
LABEL_59:
  ClassLength = v13->u.KeyNode.ClassLength;
  Class = v13->u.KeyNode.Class;
  Security = v13->u.KeyNode.Security;
  HIDWORD(Index) = v13->u.KeyNode.ValueList.Count;
  LODWORD(Cella) = v13->u.KeyNode.ValueList.List;
  v81 = ClassLength;
  if( ClassLength )
  {
    if( Class == -1 )
    {
      HiveLoadFailurea = 1;
      v18 = -1073741492;
      if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
      {
        LODWORD(Point) = 157;
        goto LABEL_354;
      }
      LODWORD(Point) = 155;
      SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225804i64, Point);
      if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
      {
        v18 = -1073741443;
        LODWORD(Point) = 159;
        goto LABEL_354;
      }
      v81 = 0;
      v13->u.KeyNode.ClassLength = 0;
      goto LABEL_93;
    }
    if( (*((_BYTE *)&v13->u.KeyNode + 13) & 3) == 1 )
    {
      LODWORD(Point) = 158;
LABEL_80:
      SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
      goto LABEL_81;
    }
    if( !HvIsCellAllocated(HiveToCheck, Class, Bitmap) )
    {
LABEL_81:
      if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
      {
        LODWORD(Point) = 192;
        SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225804i64, Point);
        v18 = -1073741492;
        goto LABEL_356;
      }
      LODWORD(Point) = 160;
      SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
      if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
      {
        v18 = -1073741443;
        LODWORD(Point) = 176;
        goto LABEL_354;
      }
      HiveLoadFailurea = 1;
      v13->u.KeyNode.ClassLength = 0;
      v13->u.KeyNode.Class = -1;
      v81 = 0;
      HiveToCheck->BaseBlock->BootType |= 4u;
      goto LABEL_93;
    }
    v25 = HiveToCheck->GetCellRoutine(HiveToCheck, Class, v89);
    if( !v25 )
    {
      v18 = -1073741670;
      LODWORD(Point) = 208;
      goto LABEL_354;
    }
    v26 = v81 <= -4 - *(_DWORD *)&v25[-1].u.KeyString[38];
    ReleaseCellRoutine = HiveToCheck->ReleaseCellRoutine;
    if( !v26 )
    {
      ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v89);
      LODWORD(Point) = 224;
      goto LABEL_80;
    }
    ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v89);
  }
  else if( Class != -1 )
  {
    HiveLoadFailurea = 1;
    v18 = -1073741492;
    if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
    {
      LODWORD(Point) = 228;
      goto LABEL_354;
    }
    LODWORD(Point) = 232;
    SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
    if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
    {
      v18 = -1073741443;
      LODWORD(Point) = 236;
      v21 = 1i64;
      goto LABEL_355;
    }
    v13->u.KeyNode.Class = -1;
    HiveToCheck->BaseBlock->BootType |= 4u;
    goto LABEL_93;
  }
  v17 = HiveLoadFailurea;
LABEL_93:
  if( Security == -1 )
  {
    LODWORD(Point) = 256;
    SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
    v28 = v93;
    goto LABEL_111;
  }
  v28 = v93;
  if( v93 == -1 )
    goto LABEL_150;
  if( (v10 & 0x20000) == 0 && (BYTE3(NlsMbCodePageTag) || (*(&CmpDummyThreadEvent + 2744) & 6) != 0) && ResetSD )
    goto LABEL_111;
  while( 1 )
  {
    if( v28 == -1 )
    {
LABEL_150:
      Flags = v13->u.KeyNode.Flags;
      if( (Flags & 0x50) != 0 )
      {
        LODWORD(Point) = 432;
        goto LABEL_346;
      }
      if( (Flags & 2) == 0 )
        goto LABEL_158;
      v17 = 1;
      v18 = -1073741492;
      HiveLoadFailurea = 1;
      if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
      {
        LODWORD(Point) = 480;
        goto LABEL_347;
      }
      LODWORD(Point) = 448;
      SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
      v37 = CellIndex;
      if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
      {
        v18 = -1073741443;
        LODWORD(Point) = 464;
        goto LABEL_347;
      }
      v13->u.KeyNode.Flags &= ~2u;
      HiveToCheck->BaseBlock->BootType |= 4u;
    }
    else
    {
      if( v13->u.KeyNode.Parent != v28 )
      {
        v17 = 1;
        v18 = -1073741492;
        HiveLoadFailurea = 1;
        if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
        {
          LODWORD(Point) = 352;
          goto LABEL_347;
        }
        LODWORD(Point) = 320;
        SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
        if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
        {
          v18 = -1073741443;
          LODWORD(Point) = 336;
          goto LABEL_347;
        }
        v13->u.KeyNode.Parent = v28;
        HiveToCheck->BaseBlock->BootType |= 4u;
      }
      v32 = HiveToCheck->GetCellRoutine(HiveToCheck, v28, v82);
      v33 = v32;
      if( !v32 )
      {
        v18 = -1073741670;
        LODWORD(Point) = 368;
        goto LABEL_347;
      }
      v34 = 2 * v13->u.KeyNode.NameLength;
      v35 = *(_DWORD *)&v32->u.KeyString[26];
      if( (v13->u.KeyValue.NameLength & 0x20) == 0 )
        v34 = v13->u.KeyNode.NameLength;
      if( (unsigned __int16)v35 < (unsigned int)v34 )
      {
        v17 = 1;
        v18 = -1073741492;
        HiveLoadFailurea = 1;
        if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
        {
          LODWORD(Point) = 370;
          v40 = 0i64;
          goto LABEL_165;
        }
        LODWORD(Point) = 372;
        SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
        if( !HvMarkCellDirty(HiveToCheck, (PVOID)v93, 0) )
        {
          LODWORD(Point) = 374;
          v40 = 1i64;
          goto LABEL_164;
        }
        v36 = 2 * v13->u.KeyNode.NameLength;
        if( (v13->u.KeyValue.NameLength & 0x20) == 0 )
          v36 = v13->u.KeyNode.NameLength;
        v33->u.KeyString[26] = v36;
        HiveToCheck->BaseBlock->BootType |= 4u;
      }
      if( v33->u.KeyNode.MaxClassLen < v81 )
      {
        v17 = 1;
        v18 = -1073741492;
        HiveLoadFailurea = 1;
        if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
        {
          LODWORD(Point) = 376;
          v40 = 0i64;
          goto LABEL_165;
        }
        LODWORD(Point) = 378;
        SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
        if( !HvMarkCellDirty(HiveToCheck, (PVOID)v93, 0) )
        {
          LODWORD(Point) = 380;
          v40 = 0i64;
LABEL_164:
          v18 = -1073741443;
LABEL_165:
          SetFailureLocation(v6, v40, _CmpCheckKey, v18, Point);
          HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v82);
          goto LABEL_349;
        }
        v33->u.KeyNode.MaxClassLen = v81;
        HiveToCheck->BaseBlock->BootType |= 4u;
      }
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v82);
      if( (v13->u.KeyValue.NameLength & 0xE) == 0 )
      {
        v28 = v93;
LABEL_158:
        v37 = CellIndex;
        goto LABEL_159;
      }
      v17 = 1;
      v18 = -1073741492;
      HiveLoadFailurea = 1;
      if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
      {
        LODWORD(Point) = 416;
        goto LABEL_347;
      }
      LODWORD(Point) = 384;
      SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
      v37 = CellIndex;
      if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
      {
        v18 = -1073741443;
        LODWORD(Point) = 400;
        goto LABEL_347;
      }
      v28 = v93;
      v13->u.KeyNode.Flags &= 0xFFF1u;
      HiveToCheck->BaseBlock->BootType |= 4u;
    }
LABEL_159:
    v39 = v13->u.KeyNode.Security;
    LODWORD(Index) = 0;
    if( CmpFindSecurityCellCacheIndex((CMHIVE *)HiveToCheck, v39, &Index) )
      break;
    LODWORD(Point) = 496;
    SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
LABEL_111:
    if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
    {
      LODWORD(Point) = 304;
      SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225804i64, Point);
      v18 = -1073741492;
      goto LABEL_349;
    }
    v86[0] = -1;
    v86[1] = 0;
    v83 = -1;
    v84 = 0;
    if( v28 == -1 )
    {
      LODWORD(Point) = 272;
LABEL_346:
      v18 = -1073741492;
LABEL_347:
      SetFailureLocation(v6, 0i64, _CmpCheckKey, v18, Point);
      goto LABEL_349;
    }
    v29 = HiveToCheck->GetCellRoutine(HiveToCheck, v28, v86);
    v30 = v29;
    if( !v29 )
    {
      v18 = -1073741670;
      LODWORD(Point) = 276;
      goto LABEL_347;
    }
    v31 = HiveToCheck->GetCellRoutine(HiveToCheck, v29->u.KeyNode.Security, &v83);
    if( !v31 )
    {
      LODWORD(Point) = 280;
      v18 = -1073741670;
      SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225626i64, Point);
      goto LABEL_343;
    }
    if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
    {
      LODWORD(Point) = 284;
      goto LABEL_341;
    }
    if( !HvMarkCellDirty(HiveToCheck, (PVOID)v30->u.KeyNode.Security, 0) )
    {
      LODWORD(Point) = 288;
LABEL_341:
      v18 = -1073741443;
      SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225853i64, Point);
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)&v83);
LABEL_343:
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v86);
      goto LABEL_349;
    }
    v13->u.KeyNode.Security = v30->u.KeyNode.Security;
    ++v31->u.KeyValue.Type;
    HiveToCheck->BaseBlock->BootType |= 4u;
    HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)&v83);
    HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v86);
    v28 = v93;
    v17 = 1;
    HiveLoadFailurea = 1;
  }
  v41 = *(_QWORD *)&HiveToCheck[1].Storage[0].FreeDisplay[1].Display.Buffer[4 * (unsigned int)Index + 2];
  ++*(_DWORD *)(v41 + 28);
  v42 = v13->u.KeyNode.Flags;
  if( (v42 & 0x40) != 0 )
  {
    if( (v42 & 0x1E) != 0 )
    {
      v17 = 1;
      v18 = -1073741492;
      HiveLoadFailurea = 1;
      if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
      {
        LODWORD(Point) = 656;
        goto LABEL_347;
      }
      v37 = CellIndex;
      if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
      {
        v18 = -1073741443;
        LODWORD(Point) = 640;
        goto LABEL_347;
      }
      v13->u.KeyNode.Flags &= 0xFFE1u;
      HiveToCheck->BaseBlock->BootType |= 4u;
    }
    if( (v13->u.KeyNode.ValueList.Count & 0x80000000) == 0 )
    {
      LODWORD(Point) = 672;
      goto LABEL_346;
    }
  }
  else
  {
    if( !HIDWORD(Index) )
      goto LABEL_189;
    if( (*((_BYTE *)&v13->u.KeyNode + 13) & 3) == 1 )
    {
      LODWORD(Point) = 504;
      goto LABEL_178;
    }
    v43 = Cella;
    if( !HvIsCellAllocated(HiveToCheck, (unsigned int)Cella, Bitmap) )
    {
      LODWORD(Point) = 512;
      goto LABEL_178;
    }
    v84 = 0;
    GetCellRoutine = HiveToCheck->GetCellRoutine;
    v83 = -1;
    v45 = GetCellRoutine(HiveToCheck, v43, (_HV_GET_CELL_CONTEXT *)&v83);
    if( !v45 )
    {
      v18 = -1073741670;
      LODWORD(Point) = 528;
      goto LABEL_347;
    }
    v46 = 4i64 * HIDWORD(Index);
    if( v46 > 0xFFFFFFFF || (unsigned int)v46 > -4 - *(_DWORD *)&v45[-1].u.KeyString[38] )
    {
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)&v83);
      LODWORD(Point) = 544;
LABEL_178:
      v18 = -1073741492;
    }
    else
    {
      LODWORD(Bitmapa) = v10;
      LODWORD(Point) = CellIndex;
      v18 = CmpCheckValueList(
              HiveToCheck,
              (v13->u.KeyValue.NameLength & 0x10) != 0,
              v45,
              HIDWORD(Index),
              Point,
              Bitmapa,
              &Bitmap->SizeOfBitMap,
              (UINT *)v6,
              (UINT64)&v80);
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)&v83);
      if( v18 == -2147483606 )
      {
        v17 = 1;
        HiveLoadFailurea = 1;
LABEL_188:
        v37 = CellIndex;
        goto LABEL_189;
      }
      if( (v18 & 0x80000000) == 0 )
        goto LABEL_188;
      if( v18 != -1073741492 )
        goto LABEL_349;
      if( v6 )
        v6->CheckKey.CellPoint = v45;
      LODWORD(Point) = 560;
    }
    SetFailureLocation(v6, 1ui64, _CmpCheckKey, v18, Point);
    while( 1 )
    {
      if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
      {
        LODWORD(Point) = 592;
        goto LABEL_347;
      }
      v37 = CellIndex;
      if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
      {
        v18 = -1073741443;
        LODWORD(Point) = 576;
        goto LABEL_347;
      }
      v13->u.KeyNode.ValueList.List = -1;
      v13->u.KeyNode.ValueList.Count = 0;
      v17 = 1;
      HiveLoadFailurea = 1;
      HiveToCheck->BaseBlock->BootType |= 4u;
LABEL_189:
      if( v13->u.KeyNode.ValueList.Count )
        break;
      if( v13->u.KeyNode.ValueList.List == -1 )
      {
        v80 = 0i64;
        break;
      }
      LODWORD(Point) = 608;
      v18 = -1073741492;
      SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
    }
    if( v13->u.KeyNode.MaxValueNameLen < (unsigned int)v80 )
    {
      v17 = 1;
      v18 = -1073741492;
      HiveLoadFailurea = 1;
      if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
      {
        LODWORD(Point) = 610;
        goto LABEL_347;
      }
      v37 = CellIndex;
      if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
      {
        v18 = -1073741443;
        LODWORD(Point) = 612;
        goto LABEL_347;
      }
      v13->u.KeyNode.MaxValueNameLen = v80;
      HiveToCheck->BaseBlock->BootType |= 4u;
    }
    v47 = v10 & 0x20000;
    if( v13->u.KeyNode.MaxValueDataLen < HIDWORD(v80) )
    {
      v17 = 1;
      v18 = -1073741492;
      HiveLoadFailurea = 1;
      if( v47 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
      {
        LODWORD(Point) = 614;
        goto LABEL_347;
      }
      v37 = CellIndex;
      if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
      {
        v18 = -1073741443;
        LODWORD(Point) = 616;
        goto LABEL_347;
      }
      v13->u.KeyNode.MaxValueDataLen = HIDWORD(v80);
      HiveToCheck->BaseBlock->BootType |= 4u;
    }
    if( !v47 )
    {
      if( v13->u.KeyNode.MaxValueNameLen != (_DWORD)v80 && HvMarkCellDirty(HiveToCheck, (PVOID)v37, 0) )
        v13->u.KeyNode.MaxValueNameLen = v80;
      if( v13->u.KeyNode.MaxValueDataLen != HIDWORD(v80) && HvMarkCellDirty(HiveToCheck, (PVOID)v37, 0) )
        v13->u.KeyNode.MaxValueDataLen = HIDWORD(v80);
    }
  }
  HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v88);
  v48 = HiveToCheck->GetCellRoutine(HiveToCheck, v37, v88);
  v13 = v48;
  if( !v48 )
  {
    v18 = -1073741670;
    LODWORD(Point) = 688;
    goto LABEL_347;
  }
  if( v6 )
    v6->CheckKey.CellPoint = v48;
  if( (v37 & 0x80000000) != 0 )
  {
    if( v48->u.KeyNode.SubKeyCounts[0] )
    {
      LODWORD(Point) = 704;
      goto LABEL_346;
    }
LABEL_308:
    v73 = -1;
    goto LABEL_309;
  }
  if( !v48->u.KeyNode.SubKeyCounts[0] )
    goto LABEL_308;
  if( (*((_BYTE *)&v48->u.KeyNode + 13) & 3) == 1 )
  {
    v18 = -1073741492;
    v49 = 712;
    goto LABEL_314;
  }
  v50 = Bitmap;
  if( !HvIsCellAllocated(HiveToCheck, v48->u.KeyNode.SubKeyLists[0], Bitmap) )
  {
    v18 = -1073741492;
    v49 = 720;
    goto LABEL_314;
  }
  v51 = HiveToCheck->GetCellRoutine(HiveToCheck, v13->u.KeyNode.SubKeyLists[0], v79);
  v78 = v51;
  v52 = (_CM_KEY_INDEX *)v51;
  if( !v51 )
  {
    v18 = -1073741670;
    LODWORD(Point) = 736;
    goto LABEL_354;
  }
  v53 = -4 - *(_DWORD *)&v51[-1].u.KeyString[38];
  if( v53 < 8 )
    goto LABEL_312;
  Signature = v51->u.KeyNode.Signature;
  v55 = v51->u.KeyNode.Flags;
  v56 = ((v51->u.KeyNode.Signature - 26220) & 0xFDFF) == 0;
  v57 = 8;
  if( !v56 )
    v57 = 4;
  if( (unsigned __int64)(unsigned int)(v55 * v57) + 4 < 4 )
    goto LABEL_312;
  v58 = 8;
  if( ((Signature - 26220) & 0xFDFF) != 0 )
    v58 = 4;
  if( (unsigned __int64)(unsigned int)(v55 * v58) + 4 > v53 )
  {
LABEL_312:
    v18 = -1073741492;
    HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
    v49 = 752;
    goto LABEL_313;
  }
  if( !(_WORD)v55 )
  {
    v18 = -1073741492;
    HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
    v49 = 784;
    goto LABEL_313;
  }
  if( v6 )
  {
    v6->CheckKey.RootPoint = v52;
    Signature = v52->Signature;
  }
  if( Signature != 26988 && Signature != 26220 && Signature != 26732 && Signature != 26994 )
  {
    v18 = -1073741492;
    HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
    v49 = 992;
    goto LABEL_313;
  }
  Count = v52->Count;
  if( Signature != 26994 )
  {
    if( Count != v13->u.KeyNode.SubKeyCounts[0] )
    {
      v18 = -1073741492;
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
      v49 = 816;
      goto LABEL_313;
    }
    HIDWORD(Point) = HIDWORD(v6);
    v60 = CmpCheckLeaf(HiveToCheck, v10, v52, v13->u.KeyNode.SubKeyLists[0]);
    v18 = v60;
    if( v60 == -2147483606 )
    {
      v17 = 1;
    }
    else if( v60 < 0 )
    {
      if( v60 == -1073741492 )
      {
        v49 = 832;
        goto LABEL_314;
      }
      goto LABEL_349;
    }
    goto LABEL_307;
  }
  v61 = 0;
  v62 = 0;
  if( !(_WORD)Count )
  {
LABEL_304:
    if( v13->u.KeyNode.SubKeyCounts[0] != v61 )
    {
      v18 = -1073741492;
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
      v10 = v91;
      v49 = 960;
      goto LABEL_313;
    }
    v17 = HiveLoadFailurea;
    v10 = v91;
LABEL_307:
    HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
    v78 = 0i64;
    goto LABEL_308;
  }
  while( 2 )
  {
    if( v6 )
      v6->CheckKey.Index = v62;
    v63 = (char *)v52 + 4 * v62;
    if( !HvIsCellAllocated(HiveToCheck, *((unsigned int *)v63 + 1), v50) )
    {
      v18 = -1073741492;
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
      v10 = v91;
      v49 = 848;
      goto LABEL_313;
    }
    v64 = HiveToCheck->GetCellRoutine(HiveToCheck, *((unsigned int *)v63 + 1), v85);
    v65 = (_CM_KEY_INDEX *)v64;
    if( !v64 )
    {
      v18 = -1073741670;
      LODWORD(Point) = 864;
      goto LABEL_347;
    }
    v66 = -4 - *(_DWORD *)&v64[-1].u.KeyString[38];
    if( v66 < 8 )
      goto LABEL_301;
    v67 = v64->u.KeyNode.Signature;
    v68 = v64->u.KeyNode.Flags;
    v69 = v64->u.KeyNode.Signature - 26220;
    v70 = 8;
    if( (v69 & 0xFDFF) != 0 )
      v70 = 4;
    if( (unsigned __int64)(unsigned int)(v68 * v70) + 4 < 4 )
      goto LABEL_301;
    v71 = 8;
    if( ((v67 - 26220) & 0xFDFF) != 0 )
      v71 = 4;
    if( (unsigned __int64)(unsigned int)(v68 * v71) + 4 > v66 )
    {
LABEL_301:
      v18 = -1073741492;
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v85);
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
      v10 = v91;
      v49 = 880;
      goto LABEL_313;
    }
    if( !(_WORD)v68 )
    {
      v18 = -1073741492;
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v85);
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
      v10 = v91;
      v49 = 912;
      goto LABEL_313;
    }
    if( ((v67 - 26220) & 0xFCFF) != 0 || v67 == 26476 )
    {
      v18 = -1073741492;
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v85);
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
      v10 = v91;
      v49 = 944;
      goto LABEL_313;
    }
    HIDWORD(Point) = HIDWORD(v6);
    v72 = CmpCheckLeaf(HiveToCheck, v91, v65, *((unsigned int *)v63 + 1));
    v18 = v72;
    if( v72 == -2147483606 )
    {
      HiveLoadFailurea = 1;
LABEL_295:
      v61 += v65->Count;
      HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v85);
      v52 = (_CM_KEY_INDEX *)v78;
      if( ++v62 >= v78->u.KeyNode.Flags )
        goto LABEL_304;
      v50 = Bitmap;
      continue;
    }
    break;
  }
  if( v72 >= 0 )
    goto LABEL_295;
  if( v72 != -1073741492 )
    goto LABEL_349;
  HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v85);
  HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
  v10 = v91;
  v49 = 952;
LABEL_313:
  v78 = 0i64;
LABEL_314:
  LODWORD(Point) = v49;
  SetFailureLocation(v6, 1ui64, _CmpCheckKey, v18, Point);
  if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
  {
    LODWORD(Point) = 1040;
    goto LABEL_347;
  }
  LODWORD(Point) = 1008;
  SetFailureLocation(v6, 1ui64, _CmpCheckKey, v18, Point);
  if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
  {
    v18 = -1073741443;
    LODWORD(Point) = 1024;
    goto LABEL_347;
  }
  v13->u.KeyNode.SubKeyCounts[0] = 0;
  v73 = -1;
  v13->u.KeyNode.SubKeyLists[0] = -1;
  v17 = 1;
  HiveToCheck->BaseBlock->BootType |= 4u;
LABEL_309:
  v74 = v13->u.KeyNode.SubKeyLists[1] != -1 || v13->u.KeyNode.SubKeyCounts[1];
  if( (v10 & 0x40000) != 0 && v74 )
  {
    LODWORD(Point) = 1040;
    goto LABEL_346;
  }
  v75 = (v10 & 2) != 0;
  if( (v10 & 0xD) != 0 && v74 )
    v75 = 1;
  if( (v10 & 8) != 0 && HiveToCheck->Version < 4 || v75 )
  {
    if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
    {
      v18 = -1073741443;
      LODWORD(Point) = 1056;
      goto LABEL_347;
    }
    v13->u.KeyNode.SubKeyCounts[1] = 0;
    if( (v10 & 4) != 0 && HiveToCheck->Version >= 4 )
      v73 = -1163005939;
    v13->u.KeyNode.SubKeyLists[1] = v73;
  }
  v18 = v17 != 0 ? 0x8000002A : 0;
LABEL_349:
  if( v78 )
    HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
LABEL_356:
  if( v13 )
    HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v88);
  return v18;
}

Referenced by:

CmpCheckRegistry2