AlpcpCancelMessagesByRequestor

INT64 __fastcall AlpcpCancelMessagesByRequestor(
        _ALPC_PORT *RequestorPort,
        _ALPC_PORT *QueuePort,
        _LIST_ENTRY *SearchQueue,
        UINT64 SearchQueueType,
        _LIST_ENTRY *CanceledQueue){
  int v5; 
  _ALPC_PORT *v6; 
  unsigned int v7; 
  _BOOL8 v10; 
  __int64 v11; 
  _LIST_ENTRY *Flink; 
  unsigned int v13; 
  volatile INT64 *v14; 
  UINT64 v16; 
  int v17; 
  int Blink; 
  _LIST_ENTRY *v19; 
  int v20; 
  _LIST_ENTRY *v21; 
  _LIST_ENTRY *v22; 
  volatile INT64 *v23; 
  __int64 v24; 
  _LIST_ENTRY *i; 
  ULONG_PTR BugCheckParameter2; 
  int v28; 
  v5 = *((_DWORD *)QueuePort + 104) & 6;
  v6 = RequestorPort;
  v7 = SearchQueueType;
  if( (*((_DWORD *)RequestorPort + 104) & 6) == 4 )
  {
    v10 = v5 != 4;
    goto LABEL_3;
  }
  if( v5 == 2 )
  {
    LODWORD(v10) = 0;
LABEL_3:
    if( !v10 )
      goto LABEL_5;
  }
  if( (_DWORD)SearchQueueType == 3 )
  {
    v28 = 1;
LABEL_16:
    v11 = 176i64;
    goto LABEL_7;
  }
LABEL_5:
  v28 = 0;
  if( (unsigned int)SearchQueueType <= 2 )
  {
    v11 = 136i64;
    goto LABEL_7;
  }
  if( (_DWORD)SearchQueueType == 3 )
    goto LABEL_16;
  v11 = 200i64;
LABEL_7:
  ExAcquirePushLockExclusiveEx((UINT64)QueuePort + v11, 0i64);
  Flink = SearchQueue->Flink;
  v13 = 0;
  while( Flink != SearchQueue )
  {
    BugCheckParameter2 = (ULONG_PTR)Flink;
    if( (_ALPC_PORT *)Flink[1].Blink == v6 || ((__int64)Flink[2].Blink & 0x8000) != 0 )
    {
      AlpcpReferenceBlob(Flink);
      if( !AlpcpTryLockForCachedReferenceBlob(Flink) )
      {
        if( v7 <= 2 )
        {
          v23 = (volatile INT64 *)((char *)QueuePort + 136);
        }
        else if( v7 == 3 )
        {
          v23 = (volatile INT64 *)((char *)QueuePort + 176);
        }
        else
        {
          v23 = (volatile INT64 *)((char *)QueuePort + 200);
        }
        if( (_InterlockedExchangeAdd64(v23, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock(v23);
        KeAbPostRelease((PVOID)v23);
        v13 = 1;
        AlpcpLockForCachedReferenceBlob(Flink);
        if( v7 <= 2 )
        {
          v24 = 136i64;
        }
        else
        {
          v24 = 176i64;
          if( v7 != 3 )
            v24 = 200i64;
        }
        ExAcquirePushLockExclusiveEx((UINT64)QueuePort + v24, 0i64);
        v6 = RequestorPort;
        if( (_ALPC_PORT *)Flink[1].Blink == RequestorPort )
        {
          for( i = SearchQueue->Flink; i != SearchQueue; i = i->Flink )
          {
            if( i == Flink )
            {
              v17 = 1;
              goto LABEL_30;
            }
          }
        }
        --WORD1(Flink[-2].Flink);
        AlpcpUnlockMessage((ULONG_PTR)Flink);
        Flink = SearchQueue->Flink;
        continue;
      }
      if( (_ALPC_PORT *)Flink[1].Blink == v6 )
      {
        v17 = 0;
LABEL_30:
        if( Flink[4].Flink )
          goto LABEL_35;
        Blink = (int)Flink[2].Blink;
        if( (Blink & 0x80u) != 0 )
          goto LABEL_35;
        v19 = Flink[2].Flink;
        v20 = Blink | 0x80;
        BYTE4(Flink[15].Flink) = 0;
        WORD2(Flink[15].Flink) |= 0xCu;
        LODWORD(Flink[2].Blink) = v20;
        LODWORD(Flink[15].Flink) = 2621440;
        if( v19 )
        {
          if( (_LIST_ENTRY *)_InterlockedExchange64((volatile __int64 *)&v19[82].Blink, 0i64) == Flink )
          {
            KeReleaseSemaphoreEx((KSEMAPHORE *)&Flink[2].Flink[72].Blink, 1i64, 1i64, v16);
            Flink[2].Flink = 0i64;
            WORD1(Flink[-2].Flink) -= 3;
            goto LABEL_35;
          }
        }
        else if( (v20 & 0x200) == 0 )
        {
          Flink[5].Blink = CanceledQueue->Blink;
          Flink[5].Flink = CanceledQueue;
          CanceledQueue->Blink->Flink = Flink + 5;
          CanceledQueue->Blink = Flink + 5;
LABEL_35:
          AlpcpReleaseMessageAttributesOnCancel((__int64)Flink, v28);
          LODWORD(Flink[2].Blink) |= 0x200u;
          WORD2(Flink[15].Flink) &= ~0x2000u;
          AlpcpClearOwnerPortMessage((__int64)Flink);
          AlpcpTransferQuotaMessage((__int64)Flink);
          v21 = Flink[13].Flink;
          if( v21 )
          {
            PsReleaseProcessWakeCounter(v21, LODWORD(Flink[16].Blink));
            Flink[13].Flink = 0i64;
          }
          v22 = Flink[13].Blink;
          if( v22 )
          {
            PsReleaseProcessWakeCounter(v22, LODWORD(Flink[16].Blink));
            Flink[13].Blink = 0i64;
          }
          if( v17 )
            Flink = SearchQueue->Flink;
          else
            Flink = Flink->Flink;
          AlpcpUnlockMessage(BugCheckParameter2);
          v6 = RequestorPort;
          continue;
        }
        --WORD1(Flink[-2].Flink);
        goto LABEL_35;
      }
      --WORD1(Flink[-2].Flink);
      AlpcpUnlockMessage((ULONG_PTR)Flink);
    }
    Flink = Flink->Flink;
  }
  if( v7 > 2 )
  {
    if( v7 == 3 )
      v14 = (volatile INT64 *)((char *)QueuePort + 176);
    else
      v14 = (volatile INT64 *)((char *)QueuePort + 200);
  }
  else
  {
    v14 = (volatile INT64 *)((char *)QueuePort + 136);
  }
  if( (_InterlockedExchangeAdd64(v14, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v14);
  KeAbPostRelease((PVOID)v14);
  return v13;
}

Referenced by:

AlpcpDisconnectPort