HvpEnlistFreeCells

UINT8 __stdcall HvpEnlistFreeCells(_HHIVE *Hive, _HBIN *Bin, UINT64 BinOffset){
  int v3; 
  char v4; 
  unsigned int Size; 
  unsigned int v6; 
  int v7; 
  size_t *v10; 
  size_t v11; 
  unsigned int v12; 
  UINT64 Point; 
  _HIVE_LOAD_FAILURE *HiveLoadFailure; 
  int v16; 

  v16 = v3;
  Hive->HvBinHeadersUse += 32;
  v4 = 0;
  Size = Bin->Size;
  v6 = 32;
  v7 = BinOffset;
  HiveLoadFailure = (_HIVE_LOAD_FAILURE *)Hive->HiveLoadFailure;
  if( Size <= 0x20 )
    return 0;
  do
  {
    v10 = (unsigned int *)((char *)&Bin->Signature + v6);
    v11 = *v10;
    if( (*v10 & 0x80000000) != 0 )
      v11 = -v11;
    if( v11 + v6 < v6 || v11 + v6 > Size || (v11 & 7) != 0 || !v11 )
    {
      if( (v3 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
      {
        LODWORD(Point) = 0;
        SetFailureLocation(HiveLoadFailure, 0i64, _HvpEnlistFreeCells, 3221225804i64, Point);
        return 76;
      }
      v12 = v6 + v7;
      v11 = Size - v6;
      if( !HvpMarkDirty((ULONG_PTR)Hive, v6 + v7, Size - v6, CmHiveDirtyNormal) )
      {
        LODWORD(Point) = 16;
        SetFailureLocation(HiveLoadFailure, 0i64, _HvpEnlistFreeCells, 3221225626i64, Point);
        return -102;
      }
      memset((char *)Bin + v6, 0i64, v11);
      *v10 = v11;
      v4 = 1;
      LODWORD(Point) = 32;
      Hive->BaseBlock->BootType |= 4u;
      SetFailureLocation(HiveLoadFailure, 1ui64, _HvpEnlistFreeCells, 1073741833i64, Point);
    }
    else
    {
      v12 = v6 + v7;
      if( (*v10 & 0x80000000) != 0 )
      {
        Hive->HvUsedCellsUse += v11;
        goto LABEL_10;
      }
    }
    Hive->HvFreeCellsUse += v11;
    HvpEnlistFreeCell(Hive, v12, v11, 0, Point);
    v3 = v16;
LABEL_10:
    Size = Bin->Size;
    v6 += v11;
  }
  while( v6 < Size );
  if( !v4 )
    return 0;
  return 9;
}

Referenced by:

HvpBuildMapForMemoryBackedHive
HvpRemapAndEnlistHiveBins