EtwSendTraceBuffer
UINT64 __fastcall EtwSendTraceBuffer(UINT64 *a1, INT64 a2, INT64 r8_0){
__int64 v3;
unsigned int v4;
unsigned int v5;
__int64 v6;
unsigned int v7;
INT64 v10;
INT64 v11;
int v12;
bool v13;
signed __int64 v14;
CHAR a3;
__int64 v16;
v4 = 0;
v5 = (unsigned __int16)a1;
a3 = 0;
v6 = v3;
v7 = r8_0;
if( (unsigned int)(unsigned __int16)a1 >= *(_DWORD *)(PsGetCurrentServerSiloGlobals()[108] + 16) )
return 3221225480i64;
v10 = EtwpOpenLogger(v5, EtwpHostSiloState, 0, &a3);
v11 = v10;
if( !v10 )
return 3221226134i64;
if( *(_DWORD *)(v10 + 336) )
{
if( (*(_DWORD *)(v10 + 12) & 0x40000) != 0 )
{
if( v7 )
_InterlockedExchangeAdd((volatile signed __int32 *)(v10 + 256), v7);
v12 = *(_DWORD *)(a2 + 48);
*(_DWORD *)(a2 + 4) = v12;
v13 = (*(_BYTE *)(a2 + 52) & 0x20) == 0;
*(_DWORD *)(a2 + 8) = *(_DWORD *)a2 + v12;
*(_DWORD *)(a2 + 44) = 3;
*(_WORD *)(a2 + 54) = 5;
if( v13 )
*(_WORD *)(a2 + 40) = *(unsigned __int8 *)(a2 + 40);
*(_QWORD *)(a2 + 64) = v16;
*(_QWORD *)(a2 + 56) = v6;
*(LARGE_INTEGER *)(a2 + 16) = EtwpGetLoggerTimeStamp(v10);
do
{
v14 = *(_QWORD *)(v11 + 144);
*(_QWORD *)(a2 + 32) = v14;
}
while( v14 != _InterlockedCompareExchange64((volatile signed __int64 *)(v11 + 144), a2, v14) );
if( !v14 )
{
if( ObGetCurrentIrql() > 2u )
{
if( !_interlockedbittestandset((volatile signed __int32 *)(v11 + 836), 8u) )
KeInsertQueueDpc((PRKDPC)(v11 + 584), 0i64, 0i64);
}
else
{
KeSetEvent((PRKEVENT)(v11 + 496), 0);
}
}
}
else
{
v4 = -1073741816;
}
}
else
{
v4 = -1073741054;
}
EtwpCloseLogger(v5, EtwpHostSiloState, a3);
return v4;
}Referenced by:
VslpFlushBufferArray