HvFoldBackDirtyData

VOID __stdcall HvFoldBackDirtyData(_HHIVE *Hive){
  unsigned __int64 v1; 
  __int64 HvBinHeadersUse; 
  _CMSI_RW_LOCK *p_WriterLock; 
  unsigned int v5; 
  v1 = 0i64;
  if( *(_QWORD *)&Hive[1].HvUsedCellsUse )
  {
    HvBinHeadersUse = Hive[1].HvBinHeadersUse;
    p_WriterLock = &Hive->WriterLock;
    ExAcquirePushLockExclusiveEx((UINT64)&Hive->WriterLock, 0i64);
    if( (_DWORD)HvBinHeadersUse )
    {
      v5 = 8;
      do
      {
        if( _bittest64(*(const signed __int64 **)&Hive[1].HvUsedCellsUse, v1) == 1 )
          HvpMarkDirty((INT64)Hive, v5, 1i64);
        ++v1;
        v5 += 512;
        --HvBinHeadersUse;
      }
      while( HvBinHeadersUse );
    }
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)p_WriterLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)p_WriterLock);
    KeAbPostRelease(p_WriterLock);
  }
  HvFreeDirtyData((INT64)Hive);
}

Referenced by:

CmpFlushHive