HvCheckHive

INT64 __fastcall HvCheckHive(INT64 a1, INT64 a2, INT64 a3, INT64 r9_0, INT64 a5, INT64 arg28){
  unsigned int *v6; 
  INT64 a7; 
  unsigned int v8; 
  INT64 a6; 
  unsigned int v10; 
  INT64 v11; 
  unsigned int v12; 
  _BYTE *CellMap; 
  __int64 FreeBin; 
  __int64 v15; 
  INT64 v16; 
  RTL_BITMAP *v17; 
  _DWORD *v18; 
  INT64 v19; 
  int v20; 
  unsigned int v21; 
  INT64 v23; 
  _DWORD *v24; 
  INT64 v25; 
  PRTL_BITMAP BitMapHeader; 
  int a4; 
  INT64 v29; 
  v29 = r9_0;
  a4 = 0;
  v6 = (unsigned int *)(a1 + 272);
  a7 = arg28;
  v8 = 0;
  a6 = a5;
  v10 = 0;
  v11 = a1;
  while( 2 )
  {
    v12 = *v6;
    while( v8 < v12 )
    {
      CellMap = (_BYTE *)HvpGetCellMap(v11, v8);
      if( !CellMap )
      {
        v21 = -1073741492;
        if( a7 )
        {
          LODWORD(BitMapHeader) = 0;
          SetFailureLocation(a7, 0i64, 16i64, 3221225804i64, (INT64)BitMapHeader);
          *(_DWORD *)(a7 + 296) = v10;
          *(_DWORD *)(a7 + 300) = v8;
        }
        return v21;
      }
      FreeBin = HvpMapEntryGetFreeBin(CellMap);
      if( FreeBin )
      {
        v23 = *(unsigned int *)(FreeBin + 16);
        v8 += v23;
        if( a6 )
        {
          HvAddToLayoutStats(a6, v23);
          HvMoveLayoutStats(v24);
        }
      }
      else
      {
        v18 = (_DWORD *)(*(_QWORD *)(v15 + 8) & 0xFFFFFFFFFFFFFFF0ui64);
        v19 = (unsigned int)v18[2];
        if( (unsigned int)v19 > v12 - v8
          || (unsigned int)v19 < 0x20
          || (v19 & 0xFFF) != 0
          || *v18 != 1852400232
          || v18[1] != v8 )
        {
          v25 = 3221225804i64;
          v21 = -1073741492;
          if( !a7 )
            return v21;
          LODWORD(BitMapHeader) = 32;
          goto LABEL_23;
        }
        v20 = HvCheckBin(v19, v18, v16, &a4, v17, a6, a7);
        v21 = v20;
        if( v20 < 0 )
        {
          if( !a7 )
            return v21;
          LODWORD(BitMapHeader) = 48;
          v25 = (unsigned int)v20;
LABEL_23:
          SetFailureLocation(a7, 0i64, 16i64, v25, (INT64)BitMapHeader);
          *(_DWORD *)(a7 + 296) = v10;
          *(_DWORD *)(a7 + 300) = v8;
          *(_QWORD *)(a7 + 304) = v18;
          return v21;
        }
        v8 += v18[2];
      }
      v11 = a1;
    }
    ++v10;
    v6 += 158;
    v8 = 0x80000000;
    if( v10 <= 1 )
      continue;
    return 0;
  }
}

Referenced by:

CmCheckRegistry