AlpcpCancelMessage

INT64 __fastcall AlpcpCancelMessage(_ALPC_PORT *PortObject, _KALPC_MESSAGE *Message, UINT64 Flags){
  int v3; 
  INT64 v5; 
  int v7; 
  int v8; 
  INT64 v9; 
  unsigned __int64 v10; 
  int v11; 
  BOOL v12; 
  INT64 *v13; 
  INT64 *v14; 
  INT64 *v15; 
  int v16; 
  INT64 *v17; 
  int v18; 
  unsigned int v19; 
  UINT64 v20; 
  void *v21; 
  void *v22; 
  __int64 v23; 
  int v24; 
  volatile INT64 *v25; 
  int v26; 
  int v28[8]; 
  int v29; 
  int v30; 
  INT64 v31; 
  int v32; 
  v32 = Flags;
  v3 = *((_DWORD *)Message + 10);
  v5 = *((_QWORD *)Message + 2);
  v31 = v5;
  v7 = v3 & 7;
  v8 = v3 & 0x80;
  v30 = v7;
  v9 = 0i64;
  v10 = 0i64;
  if( ((*((_DWORD *)PortObject + 104) >> 1) & 3) != 1 )
  {
    v11 = v3 & 0x78;
    v12 = 0;
    if( ((*((_DWORD *)PortObject + 104) >> 1) & 3) == 2 )
    {
      LOBYTE(v12) = v11 == 16;
      if( v8 )
        goto LABEL_44;
      v15 = (INT64 *)*((_QWORD *)PortObject + 2);
      ExAcquirePushLockSharedEx((UINT64)(v15 - 2), 0i64);
      if( (*((_DWORD *)Message + 10) & 0x200) == 0 )
      {
        if( v11 == 16 )
        {
          v9 = *v15;
          v10 = v15[1];
        }
        else
        {
          v9 = (INT64)PortObject;
          v10 = (unsigned __int64)PortObject;
        }
        if( v9 )
          v9 &= -(__int64)(ObReferenceObjectSafe((PVOID)v9) != 0);
        if( v10 )
          v10 &= -(__int64)(ObReferenceObjectSafe((PVOID)v10) != 0);
      }
      if( _InterlockedCompareExchange64(v15 - 2, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(v15 - 2);
      v14 = v15 - 2;
    }
    else
    {
      LOBYTE(v12) = v11 == 8;
      if( v8 )
        goto LABEL_44;
      v13 = (INT64 *)*((_QWORD *)PortObject + 2);
      ExAcquirePushLockSharedEx((UINT64)(v13 - 2), 0i64);
      if( (*((_DWORD *)Message + 10) & 0x200) == 0 )
      {
        if( v11 == 8 )
        {
          v9 = v13[2];
          v10 = v9;
        }
        else
        {
          v9 = *v13;
          v10 = v13[1];
        }
        if( v9 )
          v9 &= -(__int64)(ObReferenceObjectSafe((PVOID)v9) != 0);
        if( v10 )
          v10 &= -(__int64)(ObReferenceObjectSafe((PVOID)v10) != 0);
      }
      if( _InterlockedCompareExchange64(v13 - 2, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(v13 - 2);
      v14 = v13 - 2;
    }
    KeAbPostRelease(v14);
    goto LABEL_42;
  }
  v16 = v3 & 0x78;
  v12 = v16 == 8;
  if( !v8 && v5 )
  {
    v17 = (INT64 *)*((_QWORD *)Message + 23);
    if( !v17 )
    {
LABEL_43:
      v5 = v31;
      goto LABEL_44;
    }
    ExAcquirePushLockSharedEx((UINT64)(v17 - 2), 0i64);
    if( (*((_DWORD *)Message + 10) & 0x200) == 0 )
    {
      if( v16 == 8 )
      {
        v9 = v17[2];
        v10 = v9;
      }
      else
      {
        v9 = *v17;
        v10 = v17[1];
      }
      if( v9 )
        v9 &= -(__int64)(ObReferenceObjectSafe((PVOID)v9) != 0);
      if( v10 )
        v10 &= -(__int64)(ObReferenceObjectSafe((PVOID)v10) != 0);
    }
    if( _InterlockedCompareExchange64(v17 - 2, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(v17 - 2);
    KeAbPostRelease(v17 - 2);
    v12 = v16 == 8;
LABEL_42:
    LOBYTE(Flags) = v32;
    v7 = v30;
    goto LABEL_43;
  }
LABEL_44:
  if( !v12 )
  {
    if( v5 && (v7 != 3 || (*((_DWORD *)Message + 10) & 0x2000) != 0) )
    {
      v18 = 0;
      v19 = 0;
    }
    else
    {
      v19 = 1073741870;
      v18 = 1;
    }
    if( (Flags & 1) != 0 && v18 )
      goto LABEL_90;
LABEL_59:
    *((_DWORD *)Message + 10) |= 0x80u;
    *((_BYTE *)Message + 244) = 0;
    *((_WORD *)Message + 122) |= 0xCu;
    *((_DWORD *)Message + 60) = 2621440;
    AlpcpReleaseMessageAttributesOnCancel((__int64)Message, v18);
    *((_DWORD *)Message + 10) |= 0x8200u;
    *((_WORD *)Message + 122) &= ~0x2000u;
    _InterlockedOr(v28, 0);
    AlpcpClearOwnerPortMessage((__int64)Message);
    AlpcpTransferQuotaMessage((__int64)Message);
    v21 = (void *)*((_QWORD *)Message + 26);
    if( v21 )
    {
      PsReleaseProcessWakeCounter(v21, *((unsigned int *)Message + 66));
      *((_QWORD *)Message + 26) = 0i64;
    }
    v22 = (void *)*((_QWORD *)Message + 27);
    if( v22 )
    {
      PsReleaseProcessWakeCounter(v22, *((unsigned int *)Message + 66));
      *((_QWORD *)Message + 27) = 0i64;
    }
    v23 = *((_QWORD *)Message + 4);
    if( v23 )
    {
      if( (_KALPC_MESSAGE *)_InterlockedExchange64((volatile __int64 *)(v23 + 1320), 0i64) == Message )
      {
        *((_WORD *)Message - 15) -= 2;
        *((_QWORD *)Message + 4) = 0i64;
        v29 = 2;
        KeReleaseSemaphoreEx((KSEMAPHORE *)(v23 + 1160), 1i64, 1i64, v20);
      }
    }
    else if( v9 && v10 )
    {
      if( !v12 && (v32 & 2) == 0 )
      {
LABEL_87:
        v26 = *((_DWORD *)Message + 10);
        if( (v26 & 0x2000) != 0 && (v26 & 7) == 3 )
          AlpcpRemoveMessageFromPendingQueue(Message);
        goto LABEL_90;
      }
      ExAcquirePushLockSharedEx(v9 + 352, 0i64);
      if( (*(_DWORD *)(v9 + 416) & 0x40) != 0 )
      {
        if( _InterlockedCompareExchange64((volatile signed __int64 *)(v9 + 352), 0i64, 17i64) != 17 )
          ExfReleasePushLockShared((INT64 *)(v9 + 352));
        KeAbPostRelease((PVOID)(v9 + 352));
      }
      else
      {
        ++*((_WORD *)Message - 15);
        *((_QWORD *)Message + 8) = v9;
        *((_QWORD *)Message + 7) = v10;
        *((_DWORD *)Message + 18) = _InterlockedIncrement((volatile signed __int32 *)(v10 + 400));
        *((_QWORD *)Message + 16) = *(_QWORD *)(v10 + 56);
        AlpcpInsertMessageCanceledQueue(v9, (INT64)Message);
        AlpcpSignalPortAndUnlock(v9);
      }
      v5 = v31;
    }
    if( v12 && (v32 & 0x10000) != 0 && v5 )
    {
      v24 = *((_DWORD *)Message + 10) & 7;
      if( v24 == 3 )
      {
        AlpcpRemoveMessageFromPendingQueue(Message);
      }
      else
      {
        if( v24 == 4 )
        {
          v25 = (volatile INT64 *)(v5 + 200);
          ExAcquirePushLockExclusiveEx(v5 + 200, 0i64);
          --*(_DWORD *)(v5 + 460);
          *((_DWORD *)Message + 10) &= 0xFFFFFFF8;
          *((_QWORD *)Message + 2) = 0i64;
          **((_QWORD **)Message + 1) = *(_QWORD *)Message;
          *(_QWORD *)(*(_QWORD *)Message + 8i64) = *((_QWORD *)Message + 1);
        }
        else
        {
          v25 = (volatile INT64 *)(v5 + 136);
          ExAcquirePushLockExclusiveEx(v5 + 136, 0i64);
          AlpcpRemoveMessagePort(v5, (INT64)Message);
        }
        if( (_InterlockedExchangeAdd64(v25, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock(v25);
        KeAbPostRelease((PVOID)v25);
        --*((_WORD *)Message - 15);
      }
    }
    goto LABEL_87;
  }
  if( !v5 || v7 != 3 || (v18 = 1, (*((_DWORD *)Message + 10) & 0x2000) != 0) )
    v18 = 0;
  v19 = 259;
  if( (Flags & 1) == 0 || v18 )
    goto LABEL_59;
LABEL_90:
  *((_DWORD *)Message + 10) &= ~0x8000u;
  AlpcpUnlockMessage((ULONG_PTR)Message);
  if( v9 )
    HalPutDmaAdapter((PADAPTER_OBJECT)v9);
  if( v10 )
    HalPutDmaAdapter((PADAPTER_OBJECT)v10);
  return v19;
}

Referenced by:

AlpcpAcceptConnectPort
AlpcpDispatchReplyToPort
AlpcpFlushMessagesByRequestor
AlpcpFlushQueue
AlpcpProcessSynchronousRequest
AlpcpReceiveLegacyMessage
AlpcpReceiveMessage
AlpcpReceiveSynchronousReply
AlpcpReplyLegacySynchronousRequest
AlpcpSendMessage
NtAlpcCancelMessage