NtAlpcOpenSenderProcess

NTSTATUS __stdcall NtAlpcOpenSenderProcess(
        VOID **ProcessHandle,
        VOID *PortHandle,
        _PORT_MESSAGE *PortMessage,
        UINT64 Flags,
        UINT64 DesiredAccess,
        _OBJECT_ATTRIBUTES *ObjectAttributes){
  unsigned int v6; 
  _ETHREAD *CurrentThread; 
  char PreviousMode; 
  NTSTATUS v11; 
  _KALPC_MESSAGE **v12; 
  __int64 v13; 
  _ADAPTER_OBJECT *v14; 
  _KALPC_MESSAGE *v15; 
  _ETHREAD *WaitingThread; 
  _EPROCESS *Process; 
  _ALPC_PORT *OwnerPort; 
  _EX_PUSH_LOCK *p_PortObjectLock; 
  _ADAPTER_OBJECT *v21; 
  PVOID Object; 
  _KALPC_MESSAGE *Message; 
  VOID *v24; 
  PORT_MESSAGE CapturedMessage[4]; 
  UINT64 MessageId[2]; 
  UINT64 CallbackId; 
  _OBJECT_ATTRIBUTES v28; 

  v6 = Flags;
  *(_OWORD *)CapturedMessage = 0i64;
  *(_OWORD *)MessageId = 0i64;
  CallbackId = 0i64;
  v24 = 0i64;
  Message = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  Object = 0i64;
  v11 = ObReferenceObjectByHandle(PortHandle, 0x20000ui64, AlpcPortObjectType, PreviousMode, &Object, 0i64);
  if( v11 < 0 )
    goto LABEL_15;
  if( PreviousMode )
  {
    v13 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)ProcessHandle < 0x7FFFFFFF0000i64 )
      v13 = (__int64)ProcessHandle;
    *(_QWORD *)v13 = *(_QWORD *)v13;
    AlpcpProbeAndCaptureMessageHeader((PORT_MESSAGE *)&PortMessage->u1.DataLength, CapturedMessage, v6);
    if( ObjectAttributes < (_OBJECT_ATTRIBUTES *)v12 )
      v12 = (_KALPC_MESSAGE **)ObjectAttributes;
    v28 = *(_OBJECT_ATTRIBUTES *)v12;
  }
  else
  {
    *(_OWORD *)CapturedMessage = *(_OWORD *)&PortMessage->u1.DataLength;
    *($AC85415C5E9358ADF84901D7BAB4BA30 *)MessageId = *($AC85415C5E9358ADF84901D7BAB4BA30 *)((char *)&PortMessage->8 + 8);
    CallbackId = PortMessage->ClientViewSize;
    v28 = *ObjectAttributes;
  }
  v14 = (_ADAPTER_OBJECT *)Object;
  v11 = AlpcpLookupMessage((_ALPC_PORT *)Object, LODWORD(MessageId[1]), (unsigned int)CallbackId, v12);
  if( v11 < 0 )
  {
    HalPutDmaAdapter(v14);
    goto LABEL_15;
  }
  v15 = Message;
  if( (Message->u1.State & 0x80u) != 0 )
  {
    AlpcpUnlockMessage(Message);
    HalPutDmaAdapter(v14);
    v11 = -1073740029;
    goto LABEL_15;
  }
  WaitingThread = Message->WaitingThread;
  if( WaitingThread )
  {
    if( RtlCompareMemory(&WaitingThread->Cid, &CapturedMessage[2], 16) != (_SIZE_T *)16 )
    {
      AlpcpUnlockMessage(v15);
      HalPutDmaAdapter(v14);
      v11 = -1073741813;
      goto LABEL_15;
    }
    Process = WaitingThread->Tcb.Process;
    ObfReferenceObjectWithTag(Process, 0x63706C41ui64);
    goto LABEL_13;
  }
  OwnerPort = Message->OwnerPort;
  if( !OwnerPort )
  {
    AlpcpUnlockMessage(Message);
    v21 = v14;
    goto LABEL_28;
  }
  p_PortObjectLock = &OwnerPort->PortObjectLock;
  ExAcquirePushLockSharedEx(&OwnerPort->PortObjectLock, 0i64);
  if( (OwnerPort->u1.State & 0x40) == 0 )
  {
    Process = OwnerPort->OwnerProcess;
    if( Process->UniqueProcessId == *(void **)&CapturedMessage[2] )
    {
      ObfReferenceObjectWithTag(Process, 0x63706C41ui64);
      if( _InterlockedCompareExchange64(&p_PortObjectLock->_bf_0, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(p_PortObjectLock);
      KeAbPostRelease(p_PortObjectLock);
      v15 = Message;
      v14 = (_ADAPTER_OBJECT *)Object;
LABEL_13:
      AlpcpUnlockMessage(v15);
      v11 = PsOpenProcess(&v24, DesiredAccess, (__int64)&v28, &CapturedMessage[2], 0, PreviousMode);
      ObfDereferenceObjectWithTag(Process, 0x63706C41ui64);
      HalPutDmaAdapter(v14);
      if( v11 >= 0 )
        *ProcessHandle = v24;
      goto LABEL_15;
    }
    if( _InterlockedCompareExchange64(&p_PortObjectLock->_bf_0, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(p_PortObjectLock);
    KeAbPostRelease(p_PortObjectLock);
    AlpcpUnlockMessage(Message);
    v21 = (_ADAPTER_OBJECT *)Object;
LABEL_28:
    HalPutDmaAdapter(v21);
    v11 = -1073741790;
    goto LABEL_15;
  }
  if( _InterlockedCompareExchange64(&p_PortObjectLock->_bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(&OwnerPort->PortObjectLock);
  KeAbPostRelease(&OwnerPort->PortObjectLock);
  AlpcpUnlockMessage(Message);
  HalPutDmaAdapter((PADAPTER_OBJECT)Object);
  v11 = -1073741769;
LABEL_15:
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v11;
}

Referenced by:

No references.