HvCheckBin

__int64 __fastcall HvCheckBin(
        __int64 a1,
        _HBIN *a2,
        __int64 a3,
        _DWORD *a4,
        _RTL_BITMAP *BitMapHeader,
        _HIVE_LAYOUT_STATS_MOVE *Stats,
        _HIVE_LOAD_FAILURE *HiveLoadFailure){
  _HIVE_LOAD_FAILURE *v7; 
  unsigned int v8; 
  unsigned int v10; 
  unsigned int v11; 
  int v12; 
  _HBIN *v13; 
  __int64 Size; 
  __int64 Signature; 
  __int64 v16; 
  _HBIN *v17; 
  char v19; 
  UINT64 v20; 
  _HIVE_LAYOUT_STATS_MOVE *v21; 
  _HIVE_LOAD_FAILURE *v22; 
  UINT64 Point; 
  unsigned int v24; 
  _DWORD *v25; 

  v25 = a4;
  v7 = HiveLoadFailure;
  v8 = 0;
  v24 = 0;
  v10 = 0;
  v11 = 0;
  v12 = 0;
  if( HiveLoadFailure )
    HiveLoadFailure->CheckBin.Bin = a2;
  v13 = a2 + 1;
  Size = a2->Size;
  if( v13 >= (_HBIN *)((char *)a2 + Size) )
  {
LABEL_14:
    if( v11 + v10 + 32i64 == (unsigned int)Size )
    {
      if( v13 == (_HBIN *)((char *)a2 + (unsigned int)Size) )
      {
        if( a4 )
          *a4 += v12;
        return v8;
      }
      LODWORD(Point) = 112;
    }
    else
    {
      LODWORD(Point) = 96;
    }
    v8 = -1073741492;
    SetFailureLocation(v7, 0i64, _HvCheckBin, 3221225804i64, Point);
    return v8;
  }
  while( 1 )
  {
    Signature = (int)v13->Signature;
    if( (int)Signature >= 0 )
      break;
    v16 = (unsigned int)-(int)Signature;
    if( (unsigned int)v16 > (unsigned int)Size
      || (v17 = (_HBIN *)((char *)v13 + v16), (char *)v13 + v16 > (char *)a2 + (unsigned int)Size) )
    {
      v22 = HiveLoadFailure;
      v8 = -1073741492;
      if( !HiveLoadFailure )
        return v8;
      LODWORD(Point) = 32;
      goto LABEL_39;
    }
    v11 -= Signature;
    v12 = v12 - Signature - 4;
    if( v11 > (unsigned int)Size )
    {
      v22 = HiveLoadFailure;
      v8 = -1073741492;
      if( !HiveLoadFailure )
        return v8;
      LODWORD(Point) = 48;
      goto LABEL_39;
    }
    if( Stats && (unsigned int)v16 >= 0x54ui64 && LOWORD(v13->FileOffset) == 27502 )
    {
      v19 = v13->Reserved1[1];
      if( (v19 & 2) != 0 )
      {
        HvMoveLayoutStats(Stats + 2);
        HvMoveLayoutStats(Stats + 1);
        *(_QWORD *)&Stats[3].MoveOutSpace = 0i64;
      }
      else
      {
        v20 = (unsigned int)(8 * v13->TimeStamp.anonymous_0.HighPart + 40 - Signature);
        if( (v19 & 1) != 0 )
        {
          HvAddToLayoutStats(Stats + 2, v20);
          HvMoveLayoutStats(Stats + 1);
          if( !Stats[3].MoveOutSpace )
            Stats[3].MoveOutSpace = a2->FileOffset;
          Stats[3].MoveOutAllocs = 0;
        }
        else
        {
          HvAddToLayoutStats(Stats + 1, v20);
          if( !Stats[3].MoveOutAllocs )
            Stats[3].MoveOutAllocs = a2->FileOffset;
        }
      }
    }
    if( BitMapHeader )
    {
      RtlSetBits(BitMapHeader, ((unsigned int)v13 + a2->FileOffset - (_DWORD)a2) >> 3, 1ui64);
      v10 = v24;
    }
LABEL_12:
    v13 = v17;
    LODWORD(Size) = a2->Size;
    if( v17 >= (_HBIN *)((char *)a2 + (unsigned int)Size) )
    {
      a4 = v25;
      v7 = HiveLoadFailure;
      goto LABEL_14;
    }
  }
  if( (unsigned int)Signature <= (unsigned int)Size
    && (char *)v13 + Signature <= (char *)a2 + (unsigned int)Size
    && (_DWORD)Signature )
  {
    v10 += Signature;
    v24 = v10;
    if( v10 <= (unsigned int)Size )
    {
      if( Stats )
      {
        HvAddToLayoutStats(Stats, (unsigned int)Signature);
        HvMoveLayoutStats(v21);
      }
      v17 = (_HBIN *)((char *)v13 + (int)v13->Signature);
      goto LABEL_12;
    }
    v22 = HiveLoadFailure;
    v8 = -1073741492;
    if( HiveLoadFailure )
    {
      LODWORD(Point) = 80;
LABEL_39:
      SetFailureLocation(v22, 0i64, _HvCheckBin, 3221225804i64, Point);
      HiveLoadFailure->CheckBin.CellPoint = (_HCELL *)v13;
      return v8;
    }
    return v8;
  }
  if( HiveLoadFailure )
  {
    LODWORD(Point) = 64;
    SetFailureLocation(HiveLoadFailure, 0i64, _HvCheckBin, 3221225804i64, Point);
    HiveLoadFailure->CheckBin.CellPoint = (_HCELL *)v13;
  }
  return 60i64;
}

Referenced by:

HvCheckHive