AlpcpConnectPort

INT64 __fastcall AlpcpConnectPort(
        VOID **PortHandle,
        _UNICODE_STRING *ConnectionPortName,
        _OBJECT_ATTRIBUTES *ConnectionPortObjectAttributes,
        _OBJECT_ATTRIBUTES *ClientPortObjectAttributes,
        _ALPC_PORT_ATTRIBUTES *PortAttributes,
        INT64 Flags,
        VOID *ServerSecurityRequirements,
        VOID *RequiredServerSid,
        _PORT_MESSAGE *ConnectionMessage,
        UINT64 *BufferLength,
        _ALPC_MESSAGE_ATTRIBUTES *OutMessageAttributes,
        _ALPC_MESSAGE_ATTRIBUTES *InMessageAttributes,
        _LARGE_INTEGER *Timeout){
  UINT8 v14; 
  PVOID *v15; 
  _ETHREAD *CurrentThread; 
  INT8 v17; 
  unsigned int v18; 
  __int64 v19; 
  _ALPC_PORT_ATTRIBUTES *v20; 
  UINT64 v21; 
  PADAPTER_OBJECT v22; 
  int v23; 
  INT64 ProbeMode; 
  CHAR CapturedServerSid; 
  int v27; 
  PADAPTER_OBJECT DmaAdapter[3]; 
  HANDLE Handle; 
  CHAR WaitMode[8]; 
  PVOID CapturedSecurityDescriptor; 
  _OBJECT_ATTRIBUTES *v32; 
  _OBJECT_ATTRIBUTES *ConnectionPortObjectAttributesa; 
  _UNICODE_STRING *ConnectionPortNamea; 
  _LARGE_INTEGER *v35; 
  _ALPC_MESSAGE_ATTRIBUTES *ReceiveMessageAttributes; 
  _ALPC_MESSAGE_ATTRIBUTES *SendMessageAttributes; 
  UINT64 *v38; 
  VOID **v39; 
  _ALPC_PORT_ATTRIBUTES result; 
  v32 = ClientPortObjectAttributes;
  ConnectionPortObjectAttributesa = ConnectionPortObjectAttributes;
  ConnectionPortNamea = ConnectionPortName;
  v39 = PortHandle;
  DmaAdapter[1] = (PADAPTER_OBJECT)ServerSecurityRequirements;
  DmaAdapter[2] = (PADAPTER_OBJECT)RequiredServerSid;
  v38 = BufferLength;
  SendMessageAttributes = OutMessageAttributes;
  ReceiveMessageAttributes = InMessageAttributes;
  v35 = Timeout;
  DmaAdapter[0] = 0i64;
  Handle = 0i64;
  memset((INT64)&result, 0i64);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v17 = *((_BYTE *)KeGetCurrentThread() + 562);
  v18 = Flags & 0xFFFF0000;
  *(_QWORD *)WaitMode = RequiredServerSid;
  CapturedSecurityDescriptor = ServerSecurityRequirements;
  if( !v17 )
  {
    if( PortAttributes )
      result = *PortAttributes;
    goto LABEL_15;
  }
  v19 = (__int64)PortHandle;
  if( (unsigned __int64)PortHandle >= 0x7FFFFFFF0000i64 )
    v19 = 0x7FFFFFFF0000i64;
  *(_QWORD *)v19 = *(_QWORD *)v19;
  if( PortAttributes )
  {
    v20 = PortAttributes;
    if( (unsigned __int64)PortAttributes >= 0x7FFFFFFF0000i64 )
      v20 = (_ALPC_PORT_ATTRIBUTES *)0x7FFFFFFF0000i64;
    result = *v20;
  }
  if( !RequiredServerSid || (v27 = SeCaptureSid(RequiredServerSid, v17, v14, v15), v27 >= 0) )
  {
    if( !ServerSecurityRequirements
      || (v27 = SeCaptureSecurityDescriptor(ServerSecurityRequirements, v17, PagedPool, 0, &CapturedSecurityDescriptor),
          v27 >= 0) )
    {
LABEL_15:
      v27 = AlpcpCreateClientPort(
              &Handle,
              (_ALPC_PORT **)DmaAdapter,
              v18,
              ConnectionPortNamea,
              ConnectionPortObjectAttributesa,
              v32,
              (_ALPC_PORT_ATTRIBUTES *)((unsigned __int64)&result & -(__int64)(PortAttributes != 0i64)),
              CapturedSecurityDescriptor,
              *(VOID **)WaitMode,
              0i64,
              0);
      if( v27 >= 0 )
      {
        LOBYTE(ProbeMode) = v17;
        v21 = v18;
        v22 = DmaAdapter[0];
        v23 = AlpcpProcessConnectionRequest(
                (_ALPC_PORT *)DmaAdapter[0],
                v21,
                ConnectionMessage,
                v38,
                SendMessageAttributes,
                ReceiveMessageAttributes,
                v35,
                ProbeMode,
                CapturedServerSid);
        v27 = v23;
        if( v23 == -1073741759 && (*(_DWORD *)&v22[26].Version & 0x100) != 0 )
          *PortHandle = v22[3].DmaOperations;
        if( !v23 )
          *PortHandle = Handle;
        HalPutDmaAdapter(v22);
        if( v23 )
          NtClose(Handle);
      }
    }
  }
  if( *(_QWORD *)WaitMode && *(VOID **)WaitMode != RequiredServerSid )
    SeReleaseSid(*(PVOID *)WaitMode, v17, 1u);
  if( CapturedSecurityDescriptor && CapturedSecurityDescriptor != ServerSecurityRequirements )
    SeReleaseSecurityDescriptor(CapturedSecurityDescriptor, v17, 0);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return(unsigned int)v27;
}

Referenced by:

NtAlpcConnectPort
NtAlpcConnectPortEx