CmpUnblockHiveWrites

__int64 __fastcall CmpUnblockHiveWrites(volatile signed __int64 *P, int a2, volatile signed __int32 *a3){
  volatile signed __int32 *v5; 
  volatile signed __int64 *v6; 
  char v7; 
  __int64 result; 
  __int64 *i; 
  volatile INT64 *v10; 
  v5 = (volatile signed __int32 *)P;
  if( P )
  {
    v6 = P + 9;
    v7 = _InterlockedExchangeAdd64(P + 9, 0xFFFFFFFFFFFFFFFFui64);
    if( (v7 & 2) != 0 && (v7 & 4) == 0 )
      ExfTryToWakePushLock(P + 9);
    KeAbPostRelease((PVOID)v6);
  }
  else
  {
    for( i = CmpGetNextHive(0i64); ; i = CmpGetNextHive(v5) )
    {
      v5 = (volatile signed __int32 *)i;
      if( !a2 || (a2 & (_DWORD)i[519]) == a2 || i == (__int64 *)CmpMasterHive )
      {
        v10 = i + 9;
        if( (_InterlockedExchangeAdd64(i + 9, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock(v10);
        KeAbPostRelease((PVOID)v10);
        if( _InterlockedExchangeAdd(v5 + 1068, 0xFFFFFFFF) == 1 )
          CmpDeleteHive((PVOID)v5);
      }
      if( v5 == a3 )
        break;
    }
  }
  result = (unsigned int)_InterlockedDecrement(v5 + 1068);
  if( !(_DWORD)result )
    return CmpDeleteHive((PVOID)v5);
  return result;
}

Referenced by:

CmpVEExecuteOpenLogic
CmpVEExecuteRealStoreParseLogic
CmpVEExecuteVirtualStoreParseLogic