AlpcpFlushQueue

VOID __fastcall AlpcpFlushQueue(INT64 a1, UINT64 *a2, UINT64 a3){
  unsigned int v4; 
  __int64 v6; 
  ULONG_PTR v7; 
  volatile INT64 *v8; 
  volatile INT64 *v9; 
  __int64 v10; 
  v4 = a3;
  if( (unsigned int)a3 <= 2 )
  {
    v6 = 136i64;
  }
  else
  {
    v6 = 176i64;
    if( (_DWORD)a3 != 3 )
      v6 = 200i64;
  }
  ExAcquirePushLockExclusiveEx(v6 + a1, 0i64);
  while( 1 )
  {
    v7 = *a2;
    if( (UINT64 *)*a2 == a2 )
      break;
    AlpcpReferenceBlob((PVOID)*a2);
    if( v4 > 2 )
    {
      if( v4 == 3 )
        v9 = (volatile INT64 *)(a1 + 176);
      else
        v9 = (volatile INT64 *)(a1 + 200);
    }
    else
    {
      v9 = (volatile INT64 *)(a1 + 136);
    }
    if( (_InterlockedExchangeAdd64(v9, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(v9);
    KeAbPostRelease((PVOID)v9);
    AlpcpLockForCachedReferenceBlob((PVOID)v7);
    --*(_WORD *)(v7 - 30);
    if( *(_QWORD *)(v7 + 16) == a1 )
      AlpcpCancelMessage((_ALPC_PORT *)a1, (_KALPC_MESSAGE *)v7, 0x10000ui64);
    else
      AlpcpUnlockMessage(v7);
    if( v4 > 2 )
    {
      v10 = 176i64;
      if( v4 != 3 )
        v10 = 200i64;
    }
    else
    {
      v10 = 136i64;
    }
    ExAcquirePushLockExclusiveEx(v10 + a1, 0i64);
  }
  if( v4 > 2 )
  {
    if( v4 == 3 )
      v8 = (volatile INT64 *)(a1 + 176);
    else
      v8 = (volatile INT64 *)(a1 + 200);
  }
  else
  {
    v8 = (volatile INT64 *)(a1 + 136);
  }
  if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v8);
  KeAbPostRelease((PVOID)v8);
}

Referenced by:

AlpcpFlushMessagesPort