EtwpCCSwapTrace
struct _KPRCB *__fastcall EtwpCCSwapTrace(__int64 a1, __int64 a2, unsigned int a3, struct _KPRCB **a4){
struct _KPRCB *result;
unsigned int v5;
__int64 v8;
__int64 v9;
unsigned int *v10;
struct _KPRCB *v11;
_DWORD *v12;
__int64 v13;
unsigned int v14;
unsigned int v15;
char v16;
unsigned int v17;
int v18;
char v19;
int v20;
unsigned int v21;
char v22;
unsigned int v23;
struct _KPRCB *v24;
unsigned int v25;
unsigned int LowPart;
__int64 Src;
result = KeGetCurrentPrcb();
v5 = 0;
Src = 0i64;
v8 = a3;
v9 = *((_QWORD *)result + 4197);
v10 = *(unsigned int **)(v9 + 8i64 * a3 + 296);
if( v10 )
{
v11 = *a4;
v12 = v10 + 6;
if( *v10 )
{
v13 = (__int64)v11 - *((_QWORD *)v10 + 1);
}
else
{
LowPart = KUSER_SHARED_DATA.TickCount.LowPart;
*((_QWORD *)v10 + 1) = v11;
*((_QWORD *)v10 + 2) = v11;
v10[1] = LowPart;
*v10 = 104;
memset((INT64)(v10 + 6), 0i64);
v13 = 0i64;
}
v14 = *(_DWORD *)(a1 + 1152);
v15 = 0;
if( v14 )
{
while( *v12 != v14 )
{
if( !*v12 )
{
v10[v15 + 6] = v14;
*((_BYTE *)v10 + v15 + 88) = *(_BYTE *)(a1 + 563);
break;
}
++v15;
++v12;
if( v15 >= 0x10 )
break;
}
}
if( v15 == 16
|| KUSER_SHARED_DATA.TickCount.LowPart - v10[1] > 0x1F4
|| (unsigned __int64)*v10 + 8 > 0x400
|| v13 > 0x40000000
|| *(_BYTE *)(v9 + v8 + 288) )
{
EtwpCCSwapFlush();
v24 = *a4;
v25 = KUSER_SHARED_DATA.TickCount.LowPart;
*((_QWORD *)v10 + 1) = *a4;
*((_QWORD *)v10 + 2) = v24;
v10[1] = v25;
*v10 = 104;
memset((INT64)(v10 + 6), 0i64);
*(_BYTE *)(v9 + v8 + 288) = 0;
v13 = 0i64;
v10[6] = v14;
v15 = 0;
}
if( v14 )
{
if( *(_DWORD *)(a2 + 1152) )
v5 = KUSER_SHARED_DATA.TickCount.LowPart - *(_DWORD *)(a2 + 436);
v16 = *(_BYTE *)(a1 + 195);
v17 = v16 - *((char *)v10 + v15 + 88);
if( v5 > 1 || v17 > 7 || v13 >= 0x20000 )
{
LODWORD(Src) = (4 * v13) | 3;
if( v5 >= 0x1FFFF )
v5 = 0x1FFFF;
v22 = *(_BYTE *)(a1 + 388);
HIDWORD(Src) = (WORD2(Src) ^ ((unsigned __int8)v15 ^ BYTE4(Src)) & 0xF) & 0x3FF | (((32 * v5) | v16 & 0x1F) << 10);
if( v22 == 5 )
v23 = (WORD2(Src) ^ (unsigned __int16)(16 * *(unsigned __int8 *)(a1 + 643))) & 0x3F0 ^ HIDWORD(Src);
else
v23 = (16 * *(unsigned __int8 *)(a1 + 388) - 369) & 0x3F0 | HIDWORD(Src) & 0xFFFFFC0F;
HIDWORD(Src) = v23;
v21 = 8;
}
else
{
v18 = v17 & 7 | ((_DWORD)v13 << 9);
v19 = *(_BYTE *)(a1 + 388);
LODWORD(Src) = (4 * (v15 & 0xF | (16 * v18))) | 2;
if( v19 == 5 )
v20 = ((unsigned __int16)Src ^ (unsigned __int16)(*(unsigned __int8 *)(a1 + 643) << 9)) & 0x7E00 ^ Src;
else
v20 = ((*(unsigned __int8 *)(a1 + 388) << 9) - 11777) & 0x7E00 | Src & 0xFFFF81FF;
LODWORD(Src) = v20;
v21 = 4;
}
}
else if( v13 >= 0x4000 )
{
v21 = 4;
LODWORD(Src) = (4 * v13) | 1;
}
else
{
v21 = 2;
LOWORD(Src) = 4 * v13;
}
memmove((UINT8 *)v10 + *v10, (UINT8 *)&Src, v21);
*v10 += v21;
result = *a4;
*((_QWORD *)v10 + 1) = *a4;
}
return result;
}Referenced by:
EtwpLogContextSwapEvent