AlpcpExposeAttributes

CHAR __fastcall AlpcpExposeAttributes(INT64 a1, INT64 a2, INT64 a3, INT64 a4, INT64 a5){
  INT64 v5; 
  __int64 v6; 
  _DWORD *v7; 
  __int64 v8; 
  INT64 v10; 
  int v11; 
  int v12; 
  __int64 v13; 
  __int64 v14; 
  int v15; 
  int v16; 
  __int64 v17; 
  int v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  void *v25; 
  _DWORD *v26; 
  int v27; 
  __int64 v28; 
  int v29; 
  int v30; 
  __int64 v31; 
  __int64 v32; 
  int v33; 
  __int64 v34; 
  __int64 v35; 
  __int64 v36; 
  int v37; 
  __int64 v38; 
  __int64 v39; 
  __int64 v40; 
  __int64 v41; 
  __int64 v42; 
  __int64 v43; 
  INT64 v45; 
  v5 = a5;
  LOBYTE(v6) = 0;
  *(_DWORD *)(a5 + 4) = 0;
  v7 = (_DWORD *)(a5 + 4);
  v8 = (int)a4;
  v10 = a1;
  if( (int)a2 < 0 )
  {
    if( (int)a4 < 0 && *(_QWORD *)(a3 + 136) )
    {
      *(_DWORD *)(a5 + 8) = 0;
      v6 = *(_QWORD *)(a3 + 136);
      a1 = *(unsigned int *)(v6 + 8);
      *(_DWORD *)(a5 + 16) = a1;
      *v7 |= 0x80000000;
    }
    v29 = a4 & 0x40000000;
    if( (a4 & 0x40000000) != 0 )
      LOBYTE(v6) = AlpcpExposeViewAttribute32(
                     a1,
                     a3,
                     (_DWORD *)(a5 + (((__int64)(int)a4 >> 63) & 0xC) + 8),
                     (_DWORD *)(a5 + 4));
    v30 = v8 & 0x20000000;
    if( (v8 & 0x20000000) != 0 )
    {
      v31 = ((v8 >> 63) & 0xC) + 24;
      if( !v29 )
        v31 = ((v8 >> 63) & 0xC) + 8;
      LOBYTE(v6) = AlpcpExposeContextAttribute32(v10, a3, (_DWORD *)(a5 + v31), (_DWORD *)(a5 + 4));
    }
    v32 = (v8 >> 63) & 0xC;
    v33 = v8 & 0x10000000;
    if( (v8 & 0x10000000) != 0 )
    {
      v34 = v32 + 24;
      if( !v29 )
        v34 = v32 + 8;
      v35 = v34 + 20;
      if( !v30 )
        v35 = v34;
      LOBYTE(v6) = AlpcpExposeHandleAttribute32(
                     (struct _DMA_ADAPTER *)v10,
                     a3,
                     (_DWORD *)(a5 + v35),
                     (_DWORD *)(a5 + 4));
      v33 = v8 & 0x10000000;
    }
    v36 = v32 + 8;
    v37 = v8 & 0x8000000;
    if( (v8 & 0x8000000) != 0 )
    {
      v38 = v36 + 16;
      if( !v29 )
        v38 = v36;
      v39 = v38 + 20;
      if( !v30 )
        v39 = v38;
      v40 = v39 + 16;
      if( !v33 )
        v40 = v39;
      LOBYTE(v6) = AlpcpExposeTokenAttribute(v10, a3, (_QWORD *)(a5 + v40), (_DWORD *)(a5 + 4));
      v37 = v8 & 0x8000000;
    }
    if( (v8 & 0x2000000) != 0 )
    {
      v41 = v36 + 16;
      if( !v29 )
        v41 = v36;
      v42 = v41 + 20;
      if( !v30 )
        v42 = v41;
      v43 = v42 + 16;
      if( (v8 & 0x10000000) == 0 )
        v43 = v42;
      v24 = v43 + 24;
      if( !v37 )
        v24 = v43;
      goto LABEL_44;
    }
  }
  else
  {
    if( (int)a4 < 0 && *(_QWORD *)(a3 + 136) )
    {
      *(_DWORD *)(a5 + 8) = 0;
      v6 = *(_QWORD *)(a3 + 136);
      *(_QWORD *)(a5 + 24) = *(_QWORD *)(v6 + 8);
      *v7 |= 0x80000000;
    }
    v11 = a4 & 0x40000000;
    if( (a4 & 0x40000000) != 0 )
    {
      v45 = a5 + (((__int64)(int)a4 >> 63) & 0x18) + 8;
      v6 = *(_QWORD *)(a3 + 144);
      if( v6 )
      {
        v25 = *(void **)(v6 + 16);
        AlpcpReferenceBlob(v25);
        v26 = *(_DWORD **)(*(_QWORD *)(a3 + 144) + 16i64);
        AlpcpLockForCachedReferenceBlob(v26);
        v27 = v26[12];
        AlpcpUnlockBlob(v26);
        AlpcpDereferenceBlobEx(v25, 1i64);
        v28 = *(_QWORD *)(a3 + 144);
        *(_OWORD *)v45 = 0i64;
        *(_OWORD *)(v45 + 16) = 0i64;
        *(_QWORD *)(v45 + 16) = *(_QWORD *)(v28 + 40);
        v6 = *(_QWORD *)(v28 + 48);
        *(_QWORD *)(v45 + 24) = v6;
        if( (v27 & 1) != 0 )
          *(_DWORD *)v45 = 0x40000;
        *v7 |= 0x40000000u;
        v5 = a5;
      }
    }
    v12 = v8 & 0x20000000;
    if( (v8 & 0x20000000) != 0 )
    {
      v13 = ((v8 >> 63) & 0x18) + 40;
      if( !v11 )
        v13 = ((v8 >> 63) & 0x18) + 8;
      if( *(_QWORD *)(a3 + 56) == v10 || *(_QWORD *)(a3 + 64) == v10 )
        v14 = *(_QWORD *)(a3 + 128);
      else
        v14 = *(_QWORD *)(a3 + 120);
      *(_QWORD *)(v13 + v5) = v14;
      if( *(_QWORD *)(a3 + 56) == v10 || *(_QWORD *)(a3 + 64) == v10 )
        v15 = *(_DWORD *)(a3 + 72);
      else
        v15 = *(_DWORD *)(a3 + 44);
      *(_DWORD *)(v13 + v5 + 16) = v15;
      if( (*(_DWORD *)(v10 + 416) & 6) == 4 )
        v6 = *(_QWORD *)(a3 + 104);
      else
        v6 = *(_QWORD *)(a3 + 112);
      *(_QWORD *)(v13 + v5 + 8) = v6;
      *(_DWORD *)(v13 + v5 + 20) = *(_DWORD *)(a3 + 264);
      LODWORD(v6) = *(_DWORD *)(a3 + 272);
      *(_DWORD *)(v13 + v5 + 24) = v6;
      if( a5 != -4 && *(_QWORD *)(v13 + v5) )
        *v7 |= 0x20000000u;
    }
    v16 = v8 & 0x10000000;
    if( (v8 & 0x10000000) != 0 )
    {
      v17 = ((v8 >> 63) & 0x18) + 40;
      if( !v11 )
        v17 = ((v8 >> 63) & 0x18) + 8;
      if( v12 )
        v17 += 32i64;
      LOBYTE(v6) = AlpcpExposeHandleAttribute(v10, a3, v17 + v5, v7);
      v16 = v8 & 0x10000000;
    }
    v18 = v8 & 0x8000000;
    if( (v8 & 0x8000000) != 0 )
    {
      v19 = ((v8 >> 63) & 0x18) + 40;
      if( !v11 )
        v19 = ((v8 >> 63) & 0x18) + 8;
      if( v12 )
        v19 += 32i64;
      v20 = v19 + 24;
      if( !v16 )
        v20 = v19;
      LOBYTE(v6) = AlpcpExposeTokenAttribute(v10, a3, (_QWORD *)(v5 + v20), v7);
      v18 = v8 & 0x8000000;
    }
    if( (v8 & 0x2000000) != 0 )
    {
      v21 = (v8 >> 63) & 0x18;
      v22 = v21 + 40;
      if( !v11 )
        v22 = v21 + 8;
      if( v12 )
        v22 += 32i64;
      v23 = v22 + 24;
      if( (v8 & 0x10000000) == 0 )
        v23 = v22;
      v24 = v23 + 24;
      if( !v18 )
        v24 = v23;
LABEL_44:
      LOBYTE(v6) = AlpcpExposeWorkOnBehalfAttribute(v10, a3, (_QWORD *)(v24 + v5), v7);
    }
  }
  return v6;
}

Referenced by:

AlpcpCompleteDispatchMessage
AlpcpProcessConnectionRequest
AlpcpProcessSynchronousRequest
AlpcpReceiveMessage