EtwpLogContextSwapEvent
VOID __fastcall EtwpLogContextSwapEvent(INT64 rcx0, INT64 rdx0, INT64 a3){
unsigned int v3;
bool v4;
__int64 v5;
int v9;
__int64 v10;
__int64 v11;
INT64 v12;
int v13;
LARGE_INTEGER LoggerTimeStamp;
unsigned int v15;
int v16;
int v17;
INT64 v18;
unsigned int v19;
__int64 v20;
INT64 v21;
struct _KPRCB *CurrentPrcb;
__int64 v23;
__int64 v24;
__int64 v25;
unsigned int v26;
__int64 v27;
unsigned int v28;
__int64 v29;
INT64 a1[2];
__int64 v31;
INT64 a2;
v3 = *(_DWORD *)(rcx0 + 4224);
a2 = 0i64;
v4 = !_BitScanForward((unsigned int *)&v5, v3);
*(_OWORD *)a1 = 0i64;
v31 = 0i64;
v9 = 0;
while( !v4 )
{
v3 &= v3 - 1;
v10 = 32i64 * (unsigned int)v5;
v11 = v10 + rcx0 + 4260;
if( !v11 || (*(_DWORD *)(v11 + 4) & 4) == 0 )
goto LABEL_14;
if( (unsigned int)*(unsigned __int8 *)(rcx0 + 2 * v5 + 4208) >= *(_DWORD *)(rcx0 + 16) )
{
v12 = 1i64;
}
else
{
_mm_lfence();
v12 = *(_QWORD *)(*(_QWORD *)(rcx0 + 456) + 8i64 * *(unsigned __int8 *)(rcx0 + 2 * v5 + 4208));
}
if( (v12 & 1) != 0 )
goto LABEL_14;
if( (*(_DWORD *)(v10 + rcx0 + 4264) & 0x100) != 0 )
{
v13 = 1 << *(_DWORD *)(v12 + 216);
if( (~v9 & v13) != 0 )
{
LoggerTimeStamp = EtwpGetLoggerTimeStamp(v12);
v15 = *(_DWORD *)(v12 + 216);
a2 = LoggerTimeStamp.QuadPart;
EtwpCCSwapTrace(rdx0, a3, v15, (struct _KPRCB **)&a2);
v9 |= v13;
}
LABEL_10:
if( a3 )
{
v16 = *(_DWORD *)(v12 + 832);
if( (v16 & 0x80u) != 0 && _bittest((const signed __int32 *)(*(_QWORD *)(v12 + 984) + 164i64), 4u) )
{
EtwpStackTraceDispatcher(v12, &a2, a3, 0x405A04u);
v16 = *(_DWORD *)(v12 + 832);
}
if( (v16 & 0x8000) != 0 )
{
v26 = 0;
if( *(_DWORD *)(*(_QWORD *)(v12 + 1008) + 8i64) )
{
while( 1 )
{
v27 = *(_QWORD *)(v12 + 1008);
if( *(_WORD *)(v27 + 2i64 * v26 + 12) == 1316 )
break;
if( ++v26 >= *(_DWORD *)(v27 + 8) )
goto LABEL_13;
}
EtwpTraceLastBranchRecord((UINT64 *)v12, &a2, (_ETHREAD *)a3, 4217348i64);
}
}
LABEL_13:
if( (*(_DWORD *)(v12 + 832) & 0x4000000) != 0 )
{
v28 = 0;
if( *(_DWORD *)(*(_QWORD *)(v12 + 1016) + 24i64) )
{
while( 1 )
{
v29 = *(_QWORD *)(v12 + 1016);
if( *(_WORD *)(v29 + 2i64 * v28 + 28) == 1316 )
break;
if( ++v28 >= *(_DWORD *)(v29 + 24) )
goto LABEL_14;
}
EtwpTraceProcessorTrace((VOID **)v12, (UINT64)&a2);
}
}
}
goto LABEL_14;
}
v17 = *(_DWORD *)(v12 + 832);
if( (v17 & 0xC00) == 0 )
goto LABEL_24;
if( (v17 & 0x400) != 0 )
{
v18 = EtwpReserveWithPebsIndex((UINT64 *)v12, 1316, 24i64, (INT64)a1, &a2, 23044);
goto LABEL_26;
}
if( (v17 & 0x800) != 0 && (v19 = 0, *(_DWORD *)(*(_QWORD *)(v12 + 1000) + 8i64)) )
{
while( 1 )
{
v20 = *(_QWORD *)(v12 + 1000);
if( *(_WORD *)(v20 + 2i64 * v19 + 12) == 1316 )
break;
if( ++v19 >= *(_DWORD *)(v20 + 8) )
goto LABEL_24;
}
v18 = EtwpReserveWithPmcCounters(v12, 1316, 24i64, (INT64)a1, &a2, 23044);
}
else
{
LABEL_24:
v21 = EtwpReserveTraceBuffer((UINT64 *)v12, 40i64, (INT64)a1, &a2, 23044);
if( !v21 )
goto LABEL_14;
v18 = v21 + 16;
*(_QWORD *)(v21 + 8) = a2;
*(_DWORD *)v21 = -1072627708;
*(_DWORD *)(v21 + 4) = 86245416;
}
LABEL_26:
if( v18 )
{
*(_OWORD *)v18 = 0i64;
*(_QWORD *)(v18 + 16) = 0i64;
if( rdx0 )
{
*(_DWORD *)(v18 + 4) = *(_DWORD *)(rdx0 + 1152);
*(_BYTE *)(v18 + 9) = *(_BYTE *)(rdx0 + 195);
*(_BYTE *)(v18 + 12) = *(_BYTE *)(rdx0 + 643);
*(_BYTE *)(v18 + 13) ^= (*(_BYTE *)(v18 + 13) ^ *(_BYTE *)(rdx0 + 391)) & 1;
*(_BYTE *)(v18 + 14) = *(_BYTE *)(rdx0 + 388);
*(_BYTE *)(v18 + 15) = *(_BYTE *)(rdx0 + 588);
*(_BYTE *)(v18 + 13) ^= (*(_BYTE *)(v18 + 13) ^ (2 * *(_BYTE *)(rdx0 + 512))) & 0xE;
*(_DWORD *)(v18 + 20) = (*(_QWORD *)(rdx0 + 32) - *(_QWORD *)(rdx0 + 72)) >> 10;
CurrentPrcb = KeGetCurrentPrcb();
if( rdx0 == *((_QWORD *)CurrentPrcb + 3) )
{
v23 = *((_QWORD *)CurrentPrcb + 4096);
if( v23 )
*(_BYTE *)(v18 + 10) = *(_BYTE *)(v23 + 20);
}
else
{
v24 = *(_QWORD *)(rdx0 + 104);
if( v24 )
{
v25 = v24 + *((unsigned int *)CurrentPrcb + 54);
while( 1 )
{
LODWORD(v24) = *(_DWORD *)(v25 + 116);
if( (unsigned int)v24 > 0xFF )
break;
if( !(_BYTE)v24 )
{
v25 = *(_QWORD *)(v25 + 408);
if( v25 )
continue;
}
goto LABEL_39;
}
LOBYTE(v24) = -1;
}
LABEL_39:
*(_BYTE *)(v18 + 10) = v24;
}
}
if( a3 )
{
*(_DWORD *)v18 = *(_DWORD *)(a3 + 1152);
*(_BYTE *)(v18 + 8) = *(_BYTE *)(a3 + 195);
*(_BYTE *)(v18 + 11) = *(_BYTE *)(a3 + 564);
*(_BYTE *)(v18 + 13) ^= (*(_BYTE *)(v18 + 13) ^ (16 * *(_BYTE *)(a3 + 512))) & 0x70;
*(_DWORD *)(v18 + 16) = KUSER_SHARED_DATA.TickCount.LowPart - *(_DWORD *)(a3 + 436);
}
EtwpReleaseTraceBuffer(a1);
goto LABEL_10;
}
LABEL_14:
v4 = !_BitScanForward((unsigned int *)&v5, v3);
}
}Referenced by:
EtwTraceContextSwap