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