HvFoldBackDirtyData

VOID __stdcall HvFoldBackDirtyData(_HHIVE *Hive){
  unsigned __int64 v1; 
  __int64 HvBinHeadersUse; 
  _EX_PUSH_LOCK *p_WriterLock; 
  unsigned int v5; 

  v1 = 0i64;
  if( *(_QWORD *)&Hive[1].HvUsedCellsUse )
  {
    HvBinHeadersUse = Hive[1].HvBinHeadersUse;
    p_WriterLock = (_EX_PUSH_LOCK *)&Hive->WriterLock;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&Hive->WriterLock, 0i64);
    if( (_DWORD)HvBinHeadersUse )
    {
      v5 = 8;
      do
      {
        if( _bittest64(*(const signed __int64 **)&Hive[1].HvUsedCellsUse, v1) == 1 )
          HvpMarkDirty((ULONG_PTR)Hive, v5, 1ui64, CmHiveDirtyNormal);
        ++v1;
        v5 += 512;
        --HvBinHeadersUse;
      }
      while( HvBinHeadersUse );
    }
    if( (_InterlockedExchangeAdd64(&p_WriterLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(p_WriterLock);
    KeAbPostRelease(p_WriterLock);
  }
  HvFreeDirtyData(Hive);
}

Referenced by:

CmpFlushHive