AlpcpReceiveDirectMessagePort

INT64 __fastcall AlpcpReceiveDirectMessagePort(INT64 *a1, INT64 a2, INT64 a3, UINT64 *a4, INT64 a5){
  INT64 result; 
  INT64 v7; 
  __int64 v8; 
  unsigned int v9; 
  int v10; 
  int v11; 
  volatile signed __int64 *v12; 
  int v13; 
  volatile signed __int64 *v14; 
  volatile signed __int64 *v15; 
  unsigned int v16; 
  int v17; 
  volatile INT64 *v18; 
  UINT64 v19; 
  __int64 BugCheckParameter2[2]; 
  BugCheckParameter2[0] = 0i64;
  if( !(_DWORD)a2 )
    return 3221225485i64;
  v7 = *a1;
  result = AlpcpLookupMessage(*a1, a2, a3, (INT64)a4, (UINT64 *)BugCheckParameter2);
  if( (int)result >= 0 )
  {
    v8 = BugCheckParameter2[0];
    if( v7 != *(_QWORD *)(BugCheckParameter2[0] + 16) )
    {
      v9 = -1073740030;
LABEL_12:
      AlpcpUnlockMessage(BugCheckParameter2[0]);
      return v9;
    }
    v10 = *(_DWORD *)(BugCheckParameter2[0] + 40);
    if( (v10 & 0x10000) == 0 || (v11 = 1, v7 != *(_QWORD *)(BugCheckParameter2[0] + 64)) )
      v11 = 0;
    if( (v10 & 7) != 4 && !v11 )
    {
      v9 = -1073741811;
      goto LABEL_12;
    }
    v12 = (volatile signed __int64 *)(v7 + 352);
    ExAcquirePushLockSharedEx(v7 + 352, 0i64);
    v13 = *(_DWORD *)(v7 + 416);
    if( (v13 & 0x40) != 0 )
    {
      AlpcpUnlockMessage(v8);
      if( _InterlockedCompareExchange64(v12, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared((INT64 *)(v7 + 352));
      KeAbPostRelease((PVOID)(v7 + 352));
      return 3221227264i64;
    }
    if( (v13 & 0x10) != 0 )
    {
      AlpcpUnlockMessage(v8);
      if( _InterlockedCompareExchange64(v12, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared((INT64 *)(v7 + 352));
      KeAbPostRelease((PVOID)(v7 + 352));
      return 3221225537i64;
    }
    v14 = (volatile signed __int64 *)(v7 + 136);
    if( v11 )
    {
      ExAcquirePushLockExclusiveEx(v7 + 136, 0i64);
      *(_DWORD *)(v8 + 40) &= ~0x10000u;
      v15 = (volatile signed __int64 *)(v7 + 200);
      **(_QWORD **)(v8 + 88) = *(_QWORD *)(v8 + 80);
      *(_QWORD *)(*(_QWORD *)(v8 + 80) + 8i64) = *(_QWORD *)(v8 + 88);
      --*(_DWORD *)(v7 + 464);
    }
    else
    {
      v15 = (volatile signed __int64 *)(v7 + 200);
      ExAcquirePushLockExclusiveEx(v7 + 200, 0i64);
      --*(_DWORD *)(v7 + 460);
      *(_DWORD *)(v8 + 40) &= 0xFFFFFFF8;
      *(_QWORD *)(v8 + 16) = 0i64;
      **(_QWORD **)(v8 + 8) = *(_QWORD *)v8;
      *(_QWORD *)(*(_QWORD *)v8 + 8i64) = *(_QWORD *)(v8 + 8);
    }
    if( !v11 )
    {
      v16 = (*(_QWORD *)(v8 + 136) != 0i64 ? 0x80000000 : 0) | 0x40000000;
      if( !*(_QWORD *)(v8 + 144) )
        v16 = *(_QWORD *)(v8 + 136) != 0i64 ? 0x80000000 : 0;
      v17 = v16 | 0x10000000;
      if( !*(_QWORD *)(v8 + 152) )
        v17 = v16;
      if( (v17 & (unsigned int)a5) != 0 )
      {
        *(_WORD *)(v8 + 244) |= 0x2000u;
        AlpcpInsertMessagePendingQueue(v7, v8);
        goto LABEL_31;
      }
      *(_WORD *)(v8 + 244) &= ~0x2000u;
    }
    --*(_WORD *)(v8 - 30);
    if( v11 )
    {
      if( (_InterlockedExchangeAdd64(v14, 0xFFFFFFFFFFFFFFFFui64) & 6) != 2 )
        goto LABEL_34;
      v18 = (volatile INT64 *)(v7 + 136);
      goto LABEL_33;
    }
LABEL_31:
    v14 = v15;
    if( (_InterlockedExchangeAdd64(v15, 0xFFFFFFFFFFFFFFFFui64) & 6) != 2 )
    {
LABEL_34:
      KeAbPostRelease((PVOID)v14);
      if( _InterlockedCompareExchange64(v12, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared((INT64 *)(v7 + 352));
      KeAbPostRelease((PVOID)(v7 + 352));
      v19 = BugCheckParameter2[0];
      if( AlpcpLogEnabled )
        AlpcpLogReceiveMessage(BugCheckParameter2[0]);
      *a4 = v19;
      return 0i64;
    }
    v18 = v15;
LABEL_33:
    ExfTryToWakePushLock(v18);
    goto LABEL_34;
  }
  return result;
}

Referenced by:

AlpcpReceiveMessage