AlpcpCaptureAttributes

INT64 __fastcall AlpcpCaptureAttributes(INT64 rcx0, INT64 a2, INT64 *a3, INT64 a4, INT64 result){
  int v7; 
  INT64 v8; 
  __int64 v9; 
  __int64 v10; 
  int v11; 
  UINT64 v12; 
  int v13; 
  int v14; 
  int v15; 
  int v16; 
  int v17; 
  unsigned int v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  unsigned int v21; 
  unsigned int v22; 
  int v23; 
  int v24; 
  __int64 v25; 
  _ETHREAD *CurrentThread; 
  __int64 WorkOnBehalfThread; 
  struct _DMA_ADAPTER *v28; 
  __int64 v29; 
  _ETHREAD *v30; 
  __int64 v32; 
  signed int v33; 
  __int64 v34; 
  __int64 v35; 
  __int64 v36; 
  __int64 v37; 
  signed int v38; 
  __int64 v39; 
  __int64 v40; 
  __int64 v41; 
  __int64 v42; 
  __int64 v43; 
  __int64 v44; 
  __int64 v45; 
  __int64 v46; 
  INT64 v47; 
  _ALPC_WORK_ON_BEHALF_TICKET Ticket; 
  v7 = a2;
  v8 = result;
  memset(result, 0i64);
  *(_QWORD *)v8 = *(_QWORD *)(a4 + 104);
  *(_QWORD *)(v8 + 8) = *(_QWORD *)(a4 + 112);
  if( !a3 )
    return 0i64;
  if( !*((_BYTE *)KeGetCurrentThread() + 562) )
  {
    v11 = *(_DWORD *)a3;
    v23 = *((_DWORD *)a3 + 1);
    goto LABEL_48;
  }
  v10 = (__int64)a3;
  if( (unsigned __int64)a3 >= 0x7FFFFFFF0000i64 )
    v10 = 0x7FFFFFFF0000i64;
  v11 = *(_DWORD *)v10;
  v12 = 8i64;
  if( (v7 & 0xC0000000) == 0x80000000 )
  {
    if( v11 < 0 )
      LODWORD(v12) = 20;
    v21 = v12 + 16;
    if( (v11 & 0x40000000) == 0 )
      v21 = v12;
    v22 = v21 + 20;
    if( (v11 & 0x20000000) == 0 )
      v22 = v21;
    v18 = v22 + 16;
    if( (v11 & 0x10000000) == 0 )
      v18 = v22;
    if( (v11 & 0x8000000) != 0 )
      v18 += 24;
    v12 = 4i64;
  }
  else
  {
    v13 = 8;
    if( v11 < 0 )
      v13 = 32;
    v14 = v13 + 32;
    if( (v11 & 0x40000000) == 0 )
      v14 = v13;
    v15 = v14 + 32;
    if( (v11 & 0x20000000) == 0 )
      v15 = v14;
    v16 = v15 + 24;
    if( (v11 & 0x10000000) == 0 )
      v16 = v15;
    v17 = v16 + 24;
    if( (v11 & 0x8000000) == 0 )
      v17 = v16;
    v18 = v17 + 8;
    if( (v11 & 0x4000000) == 0 )
      v18 = v17;
  }
  v19 = v18 + 8;
  if( (v11 & 0x2000000) == 0 )
    v19 = v18;
  v20 = v19 - 1;
  if( (v11 & 0xA0000000) != 0 )
  {
    v9 = (__int64)a3;
    if( v20 <= 0xFFE )
    {
      if( (((_DWORD)v12 - 1) & (unsigned int)a3) == 0 )
      {
        if( (unsigned __int64)a3 >= 0x7FFFFFFF0000i64 )
          v9 = 0x7FFFFFFF0000i64;
        *(_BYTE *)v9 = *(_BYTE *)v9;
        *(_BYTE *)(v9 + (unsigned int)v19 - 1) = *(_BYTE *)(v9 + (unsigned int)v19 - 1);
        goto LABEL_47;
      }
LABEL_46:
      ExRaiseDatatypeMisalignment();
    }
    ProbeForWrite(a3, (unsigned int)v19, v12);
  }
  else
  {
    v9 = (unsigned int)v19;
    if( v20 > 0xFFFE )
    {
      if( (_DWORD)v19 )
      {
        if( (((_DWORD)v12 - 1) & (unsigned int)a3) == 0 )
        {
          if( (unsigned __int64)a3 + (unsigned int)v19 > 0x7FFFFFFF0000i64
            || (INT64 *)((char *)a3 + (unsigned int)v19) < a3 )
          {
            MEMORY[0x7FFFFFFF0000] = 0;
          }
          goto LABEL_47;
        }
        goto LABEL_46;
      }
    }
    else if( (((_DWORD)v12 - 1) & (unsigned int)a3) != 0 )
    {
      goto LABEL_46;
    }
  }
LABEL_47:
  v23 = *((_DWORD *)a3 + 1);
LABEL_48:
  if( (~v11 & v23) == 0 )
  {
    v24 = 0;
    if( v7 < 0 )
    {
      if( v23 >= 0 || (v24 = AlpcpCaptureSecurityAttribute32(rcx0, (INT64)(a3 + 1), v8), v24 >= 0) )
      {
        if( (v23 & 0x40000000) == 0
          || (v24 = AlpcpCaptureViewAttribute32(
                      rcx0,
                      (INT64 *)((char *)a3 + (((__int64)(v11 & 0xFFFFFFFF80000000ui64) >> 63) & 0xC) + 8),
                      a4,
                      v8),
              v24 >= 0) )
        {
          if( (v23 & 0x20000000) == 0 )
            goto LABEL_124;
          v32 = (((int)(v11 & 0xC0000000) >> 31) & 0xC) + 24i64;
          if( (v11 & 0x40000000) == 0 )
            v32 = (((int)(v11 & 0xC0000000) >> 31) & 0xC) + 8i64;
          v24 = AlpcpCaptureContextAttribute32(rcx0, (INT64 *)((char *)a3 + v32), a4, (_QWORD *)v8);
          if( v24 >= 0 )
          {
LABEL_124:
            if( (v23 & 0x10000000) == 0 )
              goto LABEL_125;
            v45 = (((int)(v11 & 0xE0000000) >> 31) & 0xC) + 24i64;
            if( (v11 & 0x40000000) == 0 )
              v45 = (((int)(v11 & 0xE0000000) >> 31) & 0xC) + 8i64;
            v46 = v45 + 20;
            if( (v11 & 0x20000000) == 0 )
              v46 = v45;
            v24 = AlpcpCaptureHandleAttribute32((INT64)a3 + v46, v8);
            if( v24 >= 0 )
            {
LABEL_125:
              if( (v23 & 0x4000000) == 0 )
                goto LABEL_89;
              v33 = v11 & 0xF8000000;
              v34 = ((v33 >> 31) & 0xC) + 24i64;
              if( (v33 & 0x40000000) == 0 )
                v34 = ((v33 >> 31) & 0xC) + 8i64;
              v35 = v34 + 20;
              if( (v33 & 0x20000000) == 0 )
                v35 = v34;
              v36 = v35 + 16;
              if( (v33 & 0x10000000) == 0 )
                v36 = v35;
              v37 = v36 + 24;
              if( (v33 & 0x8000000) == 0 )
                v37 = v36;
              LODWORD(v47) = v23;
              v24 = AlpcpCaptureDirectAttribute32((UINT64 *)((char *)a3 + v37), (VOID *)v9, v8, (unsigned int)v7, v47);
              if( v24 >= 0 )
              {
LABEL_89:
                if( (v23 & 0x2000000) != 0 )
                  v24 = AlpcpCaptureWorkOnBehalfAttribute(v8);
              }
            }
          }
        }
      }
    }
    else if( v23 >= 0 || (v24 = AlpcpCaptureSecurityAttribute(rcx0, (INT64)(a3 + 1), v8), v24 >= 0) )
    {
      if( (v23 & 0x40000000) == 0
        || (v24 = AlpcpCaptureViewAttribute(
                    rcx0,
                    (__int128 *)((char *)a3 + (((__int64)(v11 & 0xFFFFFFFF80000000ui64) >> 63) & 0x18) + 8),
                    a4,
                    v8),
            v24 >= 0) )
      {
        if( (v23 & 0x20000000) == 0 )
          goto LABEL_56;
        v25 = (((int)(v11 & 0xC0000000) >> 31) & 0x18) + 40i64;
        if( (v11 & 0x40000000) == 0 )
          v25 = (((int)(v11 & 0xC0000000) >> 31) & 0x18) + 8i64;
        v24 = AlpcpCaptureContextAttribute(rcx0, (__int64)a3 + v25, a4, (_QWORD *)v8);
        if( v24 >= 0 )
        {
LABEL_56:
          if( (v23 & 0x10000000) == 0 )
            goto LABEL_58;
          v43 = (((int)(v11 & 0xE0000000) >> 31) & 0x18) + 40i64;
          if( (v11 & 0x40000000) == 0 )
            v43 = (((int)(v11 & 0xE0000000) >> 31) & 0x18) + 8i64;
          v44 = v43 + 32;
          if( (v11 & 0x20000000) == 0 )
            v44 = v43;
          v24 = AlpcpCaptureHandleAttribute((__int128 *)((char *)a3 + v44), v8);
          if( v24 >= 0 )
          {
LABEL_58:
            if( (v23 & 0x4000000) == 0 )
              goto LABEL_126;
            v38 = v11 & 0xF8000000;
            v39 = ((v38 >> 31) & 0x18) + 40i64;
            if( (v38 & 0x40000000) == 0 )
              v39 = ((v38 >> 31) & 0x18) + 8i64;
            v40 = v39 + 32;
            if( (v38 & 0x20000000) == 0 )
              v40 = v39;
            v41 = v40 + 24;
            if( (v38 & 0x10000000) == 0 )
              v41 = v40;
            v42 = v41 + 24;
            if( (v38 & 0x8000000) == 0 )
              v42 = v41;
            v24 = AlpcpCaptureDirectAttribute((unsigned __int64 *)((char *)a3 + v42), (void *)v9, v8, v7, v23);
            if( v24 >= 0 )
            {
LABEL_126:
              if( (v23 & 0x2000000) != 0 )
              {
                LODWORD(result) = 0;
                Ticket = 0i64;
                CurrentThread = (_ETHREAD *)KeGetCurrentThread();
                WorkOnBehalfThread = PsGetWorkOnBehalfThread((__int64)CurrentThread, &result);
                v28 = (struct _DMA_ADAPTER *)WorkOnBehalfThread;
                if( WorkOnBehalfThread )
                {
                  v30 = (_ETHREAD *)WorkOnBehalfThread;
                }
                else
                {
                  IoThreadToProcess(CurrentThread);
                  if( !*(_QWORD *)(v29 + 2392) && !PoEnergyEstimationEnabled() )
                  {
LABEL_64:
                    if( (_DWORD)result )
                      HalPutDmaAdapter(v28);
                    *(_ALPC_WORK_ON_BEHALF_TICKET *)(v8 + 64) = Ticket;
                    return 0;
                  }
                  v30 = CurrentThread;
                }
                PsEncodeThreadWorkOnBehalfTicket(v30, &Ticket);
                goto LABEL_64;
              }
            }
          }
        }
      }
    }
    if( v24 < 0 )
      AlpcpReleaseAttributes((_QWORD *)v8);
    return(unsigned int)v24;
  }
  return 3221225485i64;
}

Referenced by:

AlpcpAcceptConnectPort
AlpcpFormatConnectionRequest
AlpcpSendMessage