AlpcpReceiveLegacyMessage

INT64 __fastcall AlpcpReceiveLegacyMessage(
        _ALPC_DISPATCH_CONTEXT *DispatchContext,
        _PORT_MESSAGE *ReceiveMessage,
        _LARGE_INTEGER *Timeout,
        VOID **PortContext,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  _ETHREAD *CurrentThread; 
  unsigned __int8 v11; 
  _ALPC_PORT *v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  struct _DMA_ADAPTER *v16; 
  unsigned int v17; 
  ULONG_PTR v18; 
  char *v19; 
  struct _DMA_ADAPTER **v21; 
  UINT64 ReceiveAttributes; 
  _ALPC_PORT *PortObject; 
  ULONG_PTR BugCheckParameter2; 
  LONGLONG v25; 
  struct _DMA_ADAPTER *v26; 
  _ALPC_PORT *v27; 
  _ETHREAD *v28; 
  _ALPC_DISPATCH_CONTEXT *DispatchContexta; 
  DispatchContexta = DispatchContext;
  BugCheckParameter2 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v28 = CurrentThread;
  v11 = *((_BYTE *)CurrentThread + 562);
  v25 = 0i64;
  v12 = DispatchContext->PortObject;
  PortObject = DispatchContext->PortObject;
  v27 = DispatchContext->PortObject;
  if( v11 )
  {
    if( Timeout )
    {
      v15 = 0x7FFFFFFF0000i64;
      if( (unsigned __int64)Timeout < 0x7FFFFFFF0000i64 )
        v15 = (__int64)Timeout;
      v25 = *(_QWORD *)v15;
      Timeout = (_LARGE_INTEGER *)&v25;
    }
    if( ReceiveMessage )
    {
      v13 = (__int64)ReceiveMessage;
      if( ((unsigned __int8)ReceiveMessage & 3) != 0 )
        ExRaiseDatatypeMisalignment();
      if( (unsigned __int64)ReceiveMessage >= 0x7FFFFFFF0000i64 )
        v13 = 0x7FFFFFFF0000i64;
      *(_BYTE *)v13 = *(_BYTE *)v13;
      *(_BYTE *)(v13 + 39) = *(_BYTE *)(v13 + 39);
    }
    if( PortContext )
    {
      v14 = (__int64)PortContext;
      if( (unsigned __int64)PortContext >= 0x7FFFFFFF0000i64 )
        v14 = 0x7FFFFFFF0000i64;
      *(_QWORD *)v14 = *(_QWORD *)v14;
    }
    DispatchContext = DispatchContexta;
  }
  else
  {
    v11 = (*((_DWORD *)CurrentThread + 29) & 0x400) != 0;
  }
  v16 = 0i64;
  v26 = 0i64;
  if( (*((_BYTE *)v12 + 416) & 6) == 6 )
  {
    v21 = (struct _DMA_ADAPTER **)*((_QWORD *)v12 + 2);
    ExAcquirePushLockSharedEx((UINT64)(v21 - 2), 0i64);
    v16 = *v21;
    v26 = v16;
    if( v16 && ObReferenceObjectSafe(v16) )
    {
      if( _InterlockedCompareExchange64((volatile signed __int64 *)v21 - 2, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared((INT64 *)v21 - 2);
      KeAbPostRelease(v21 - 2);
      PortObject = (_ALPC_PORT *)v16;
      v27 = (_ALPC_PORT *)v16;
      DispatchContext = DispatchContexta;
      DispatchContexta->PortObject = (_ALPC_PORT *)v16;
      goto LABEL_18;
    }
    if( _InterlockedCompareExchange64((volatile signed __int64 *)v21 - 2, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((INT64 *)v21 - 2);
    KeAbPostRelease(v21 - 2);
    return 3221225527i64;
  }
  else
  {
LABEL_18:
    while( 1 )
    {
      LODWORD(ReceiveAttributes) = 0;
      v17 = AlpcpReceiveMessagePort(
              DispatchContext,
              v11,
              Timeout,
              (_KALPC_MESSAGE **)&BugCheckParameter2,
              ReceiveAttributes);
      if( v17 )
        break;
      v18 = BugCheckParameter2;
      if( (*(_DWORD *)(BugCheckParameter2 + 40) & 0x80u) == 0 )
      {
        *(_QWORD *)(BugCheckParameter2 + 200) = v28;
        if( ReceiveMessage )
        {
          *(_OWORD *)ReceiveMessage = *(_OWORD *)(v18 + 240);
          *((_OWORD *)ReceiveMessage + 1) = *(_OWORD *)(v18 + 256);
          *((_QWORD *)ReceiveMessage + 4) = *(_QWORD *)(v18 + 272);
          if( (*((_DWORD *)PortObject + 64) & 0x1000) != 0 )
            *((_WORD *)ReceiveMessage + 2) &= 0xC00Fu;
          v19 = (char *)ReceiveMessage + 40;
          if( *(_QWORD *)(v18 + 176) )
            AlpcpGetDataFromUserVaSafe(v18, v19);
          else
            AlpcpReadMessageData(v18, v19);
        }
        if( PortContext )
          *PortContext = *(VOID **)(v18 + 120);
        if( ReceiveMessage )
        {
          AlpcpUnlockMessage(v18);
        }
        else
        {
          *(_QWORD *)(v18 + 200) = 0i64;
          AlpcpCancelMessage(PortObject, (_KALPC_MESSAGE *)v18, 0x10000ui64);
        }
        break;
      }
      if( *(_ALPC_PORT **)(BugCheckParameter2 + 64) == PortObject )
      {
        *(_QWORD *)(BugCheckParameter2 + 64) = 0i64;
        *(_QWORD *)(v18 + 56) = 0i64;
      }
      AlpcpCancelMessage(PortObject, (_KALPC_MESSAGE *)v18, 0x10000ui64);
      BugCheckParameter2 = 0i64;
      DispatchContext = DispatchContexta;
    }
    if( v16 )
      HalPutDmaAdapter(v16);
    return v17;
  }
}

Referenced by:

NtReplyWaitReceivePortEx