AlpcpReturnMessageOnInsufficientBuffer

INT64 __fastcall AlpcpReturnMessageOnInsufficientBuffer(_ALPC_PORT *PortObject, _KALPC_MESSAGE *Message){
  _OWORD *v2; 
  INT64 *v3; 
  INT64 v6; 
  int v7; 
  v3 = (INT64 *)((char *)PortObject + 352);
  *v2 = 0i64;
  v2[1] = 0i64;
  v6 = (INT64)v2;
  ExAcquirePushLockSharedEx((UINT64)PortObject + 352, 0i64);
  v7 = *((_DWORD *)PortObject + 104) & 0x40;
  if( *((_ALPC_PORT **)Message + 8) == PortObject )
  {
    if( v7 )
    {
      *((_QWORD *)Message + 8) = 0i64;
      *((_QWORD *)Message + 7) = 0i64;
    }
    else
    {
      ++*((_WORD *)Message - 15);
      AlpcpInsertMessageCanceledQueue((INT64)PortObject, (INT64)Message);
    }
LABEL_12:
    if( _InterlockedCompareExchange64(v3, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(v3);
    KeAbPostRelease(v3);
    AlpcpExposeContextAttribute((INT64)PortObject, (INT64)Message, v6, 0i64);
    return 3221225507i64;
  }
  if( !v7 )
  {
    if( *((_QWORD *)Message + 2) )
      AlpcpRemoveMessageFromPendingQueue(Message);
    ++*((_WORD *)Message - 15);
    AlpcpInsertMessageLargeMessageQueue((INT64)PortObject, (INT64)Message);
    goto LABEL_12;
  }
  if( _InterlockedCompareExchange64(v3, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(v3);
  KeAbPostRelease(v3);
  return 3221227264i64;
}

Referenced by:

AlpcpProcessSynchronousRequest
AlpcpReceiveMessage