AlpcpDispatchReplyToPort

INT64 __fastcall AlpcpDispatchReplyToPort(INT64 a1){
  ULONG_PTR v2; 
  __int64 v3; 
  __int64 v4; 
  __int64 *v5; 
  INT64 *v6; 
  UINT64 v7; 
  __int64 v8; 
  __int64 v9; 
  NTSTATUS v10; 
  _ETHREAD *CurrentThread; 
  __int16 v13; 
  int v14; 
  __int16 v15; 
  unsigned int v16; 
  int v17[22]; 
  int v18; 
  _ALPC_PORT *PortObject; 
  v2 = *(_QWORD *)(a1 + 8);
  v3 = *(_QWORD *)a1;
  v18 = *(_DWORD *)(a1 + 48);
  *(_QWORD *)(a1 + 32) = 0i64;
  *(_QWORD *)(a1 + 24) = 0i64;
  *(_QWORD *)(a1 + 40) = 0i64;
  v4 = *(_QWORD *)(v2 + 24);
  PortObject = (_ALPC_PORT *)v3;
  if( ((*(_DWORD *)(v4 + 416) >> 1) & 3) == 1 )
  {
    v5 = *(__int64 **)(v3 + 16);
    v6 = v5 - 2;
    ExAcquirePushLockSharedEx((UINT64)(v5 - 2), 0i64);
    v8 = *v5;
    v9 = *v5;
    if( v3 == v4 )
      goto LABEL_7;
  }
  else
  {
    v5 = *(__int64 **)(v4 + 16);
    v6 = v5 - 2;
    v7 = (UINT64)(v5 - 2);
    if( ((*(_DWORD *)(v4 + 416) >> 1) & 3) == 2 )
    {
      ExAcquirePushLockSharedEx(v7, 0i64);
      v8 = v5[2];
      v9 = v8;
      goto LABEL_7;
    }
    ExAcquirePushLockSharedEx(v7, 0i64);
    v8 = *v5;
  }
  v9 = v5[1];
LABEL_7:
  if( (*(_DWORD *)(v3 + 416) & 0x20) != 0 && (*(_DWORD *)(v3 + 256) & 0x1000) == 0
    || (*(_DWORD *)(v4 + 416) & 0x20) != 0 && (*(_DWORD *)(v4 + 256) & 0x1000) == 0 )
  {
    if( _InterlockedCompareExchange64(v6, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(v6);
    KeAbPostRelease(v6);
    v10 = -1073741769;
LABEL_22:
    AlpcpCancelMessage(PortObject, (_KALPC_MESSAGE *)v2, 0x10000ui64);
    return(unsigned int)v10;
  }
  if( (unsigned __int64)*(unsigned __int16 *)(a1 + 52) <= *(_QWORD *)(v8 + 272) )
  {
    v10 = AlpcpReferenceReplyTargetPorts((PADAPTER_OBJECT)v8, (PADAPTER_OBJECT)v9);
    if( v10 < 0 )
    {
      if( _InterlockedCompareExchange64(v6, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(v6);
      KeAbPostRelease(v6);
      goto LABEL_22;
    }
    *(_QWORD *)(v2 + 200) = 0i64;
    if( *(_WORD *)(a1 + 54) == 11 )
    {
      ExAcquirePushLockExclusiveEx(v4 + 352, 0i64);
      *(_DWORD *)(v4 + 416) &= ~8u;
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v4 + 352), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(v4 + 352));
      KeAbPostRelease((PVOID)(v4 + 352));
    }
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    *(_WORD *)(v2 + 242) = *(_WORD *)(a1 + 52);
    *(_WORD *)(v2 + 240) = *(_WORD *)(a1 + 52) - 40;
    v13 = *(_WORD *)(a1 + 54);
    *(_WORD *)(v2 + 244) = v13;
    *(_WORD *)(v2 + 246) = *(_WORD *)(a1 + 56);
    v14 = *(_DWORD *)(v2 + 40);
    *(_OWORD *)(v2 + 248) = *(_OWORD *)((char *)CurrentThread + 1144);
    if( (v18 & 0x10000) != 0 )
    {
      v15 = v13 & 0xDFFF;
      v16 = v14 | 0x200;
    }
    else
    {
      v15 = v13 | 0x2000;
      v16 = v14 & 0xFFFFFDFF;
    }
    *(_DWORD *)(v2 + 40) = v16;
    *(_WORD *)(v2 + 244) = v15;
    *(_DWORD *)(v2 + 40) |= 0x8000u;
    _InterlockedOr(v17, 0);
    AlpcpClearOwnerPortMessage(v2);
    AlpcpSetOwnerPortMessage(v2, PortObject);
    *(_DWORD *)(v2 + 44) = _InterlockedIncrement((volatile signed __int32 *)(v9 + 400));
    *(_QWORD *)(v2 + 120) = *(_QWORD *)(v9 + 56);
    HalPutDmaAdapter((PADAPTER_OBJECT)v9);
    if( *(_QWORD *)(v2 + 16) )
      AlpcpRemoveMessageFromPendingQueue((_KALPC_MESSAGE *)v2);
    ExAcquirePushLockSharedEx(v8 + 352, 0i64);
    if( (v18 & 0x20000) != 0 )
    {
      *(_DWORD *)(v2 + 40) &= ~0x100u;
      *(_WORD *)(v2 - 30) += 2;
      *(_QWORD *)(v2 + 32) = CurrentThread;
      _InterlockedExchange64((volatile __int64 *)CurrentThread + 165, v2);
    }
    *(_QWORD *)(a1 + 32) = v8;
    *(_QWORD *)(a1 + 16) = v5;
    if( (*(_BYTE *)(v2 + 160) & 1) != 0 )
      *(_DWORD *)(a1 + 48) |= 8u;
    AlpcpCompleteDispatchMessage(a1);
    return 0i64;
  }
  else
  {
    if( _InterlockedCompareExchange64(v6, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(v6);
    KeAbPostRelease(v6);
    AlpcpUnlockMessage(v2);
    return 3221225507i64;
  }
}

Referenced by:

AlpcpDispatchMessage
AlpcpSendMessage