NtAlpcOpenSenderProcess

INT64 __fastcall NtAlpcOpenSenderProcess(
        VOID **ProcessHandle,
        VOID *PortHandle,
        _PORT_MESSAGE *PortMessage,
        UINT64 Flags,
        UINT64 DesiredAccess,
        _OBJECT_ATTRIBUTES *ObjectAttributes){
  unsigned int v6; 
  _ETHREAD *CurrentThread; 
  KPROCESSOR_MODE v10; 
  int v11; 
  _OBJECT_ATTRIBUTES *v12; 
  __int64 v13; 
  struct _DMA_ADAPTER *v14; 
  ULONG_PTR v15; 
  __int64 v16; 
  _QWORD *v17; 
  __int64 v19; 
  INT64 *v20; 
  struct _DMA_ADAPTER *v21; 
  PVOID Object; 
  ULONG_PTR BugCheckParameter2; 
  PVOID ProcessHandlea; 
  __int128 Source2; 
  INT64 v26[2]; 
  INT64 v27; 
  OBJECT_ATTRIBUTES v28; 
  v6 = Flags;
  Source2 = 0i64;
  *(_OWORD *)v26 = 0i64;
  v27 = 0i64;
  ProcessHandlea = 0i64;
  BugCheckParameter2 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v10 = *((_BYTE *)KeGetCurrentThread() + 562);
  Object = 0i64;
  v11 = ObReferenceObjectByHandle(PortHandle, 0x20000u, AlpcPortObjectType, v10, &Object, 0i64);
  if( v11 < 0 )
    goto LABEL_15;
  if( v10 )
  {
    v13 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)ProcessHandle < 0x7FFFFFFF0000i64 )
      v13 = (__int64)ProcessHandle;
    *(_QWORD *)v13 = *(_QWORD *)v13;
    AlpcpProbeAndCaptureMessageHeader(PortMessage, (_PORT_MESSAGE *)&Source2, v6);
    if( ObjectAttributes < v12 )
      v12 = ObjectAttributes;
    v28 = *v12;
  }
  else
  {
    Source2 = *(_OWORD *)PortMessage;
    *(_OWORD *)v26 = *((_OWORD *)PortMessage + 1);
    v27 = *((_QWORD *)PortMessage + 4);
    v28 = *ObjectAttributes;
  }
  v14 = (struct _DMA_ADAPTER *)Object;
  v11 = AlpcpLookupMessage((INT64)Object, LODWORD(v26[1]), (unsigned int)v27, (INT64)v12, &BugCheckParameter2);
  if( v11 < 0 )
  {
    HalPutDmaAdapter(v14);
    goto LABEL_15;
  }
  v15 = BugCheckParameter2;
  if( (*(_DWORD *)(BugCheckParameter2 + 40) & 0x80u) != 0 )
  {
    AlpcpUnlockMessage(BugCheckParameter2);
    HalPutDmaAdapter(v14);
    v11 = -1073740029;
    goto LABEL_15;
  }
  v16 = *(_QWORD *)(BugCheckParameter2 + 32);
  if( v16 )
  {
    if( RtlCompareMemory((VOID *)(v16 + 1144), (char *)&Source2 + 8, 0x10ui64) != 16 )
    {
      AlpcpUnlockMessage(v15);
      HalPutDmaAdapter(v14);
      v11 = -1073741813;
      goto LABEL_15;
    }
    v17 = *(_QWORD **)(v16 + 544);
    ObfReferenceObjectWithTag(v17, 0x63706C41u);
    goto LABEL_13;
  }
  v19 = *(_QWORD *)(BugCheckParameter2 + 24);
  if( !v19 )
  {
    AlpcpUnlockMessage(BugCheckParameter2);
    v21 = v14;
    goto LABEL_28;
  }
  v20 = (INT64 *)(v19 + 352);
  ExAcquirePushLockSharedEx(v19 + 352, 0i64);
  if( (*(_DWORD *)(v19 + 416) & 0x40) == 0 )
  {
    v17 = *(_QWORD **)(v19 + 24);
    if( v17[136] == *((_QWORD *)&Source2 + 1) )
    {
      ObfReferenceObjectWithTag(v17, 0x63706C41u);
      if( _InterlockedCompareExchange64(v20, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(v20);
      KeAbPostRelease(v20);
      v15 = BugCheckParameter2;
      v14 = (struct _DMA_ADAPTER *)Object;
LABEL_13:
      AlpcpUnlockMessage(v15);
      v11 = PsOpenProcess(
              &ProcessHandlea,
              (unsigned int)DesiredAccess,
              &v28,
              (CLIENT_ID *)((char *)&Source2 + 8),
              0,
              v10);
      ObfDereferenceObjectWithTag(v17, 0x63706C41ui64);
      HalPutDmaAdapter(v14);
      if( v11 >= 0 )
        *ProcessHandle = ProcessHandlea;
      goto LABEL_15;
    }
    if( _InterlockedCompareExchange64(v20, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(v20);
    KeAbPostRelease(v20);
    AlpcpUnlockMessage(BugCheckParameter2);
    v21 = (struct _DMA_ADAPTER *)Object;
LABEL_28:
    HalPutDmaAdapter(v21);
    v11 = -1073741790;
    goto LABEL_15;
  }
  if( _InterlockedCompareExchange64(v20, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((INT64 *)(v19 + 352));
  KeAbPostRelease((PVOID)(v19 + 352));
  AlpcpUnlockMessage(BugCheckParameter2);
  HalPutDmaAdapter((PADAPTER_OBJECT)Object);
  v11 = -1073741769;
LABEL_15:
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return(unsigned int)v11;
}

Referenced by:

No references.