EtwpRealtimeInjectEtwBuffer
NTSTATUS __stdcall EtwpRealtimeInjectEtwBuffer(
_WMI_LOGGER_CONTEXT *LoggerContext,
_ETW_REALTIME_CONSUMER *Prc,
_WMI_BUFFER_HEADER *Buffer){
_WMI_LOGGER_CONTEXT *v6;
volatile signed __int32 *UserBufferListHead;
_DWORD *v8;
signed __int64 v9;
signed __int64 v10;
int v11;
unsigned int v13;
int UserBufferSpace;
_WMI_BUFFER_HEADER *UserBuffer;
__int64 v16;
_ETW_REALTIME_CONSUMER *Prca;
_WMI_BUFFER_HEADER *v18;
__int64 v19;
_KAPC_STATE ApcState;
Prca = Prc;
v18 = Buffer;
memset(&ApcState, 0, sizeof(ApcState));
UserBuffer = 0i64;
if( *((_WORD *)Buffer + 27) == 6 )
{
v13 = Prc->EmptyBuffersCount + 1;
Prc->EmptyBuffersCount = v13;
if( (LoggerContext->LoggerMode & 0x10000000) != 0 || v13 > 2 )
return 0;
}
else
{
Prc->EmptyBuffersCount = 0;
}
if( !ExAcquireRundownProtection(&Prc->ProcessObject->RundownProtect) )
return -1073741558;
KiStackAttachProcess(Prc->ProcessObject, 0i64, &ApcState);
*Prc->EventsLostCount = LoggerContext->EventsLost;
*Prc->BuffersLostCount = LoggerContext->RealTimeBuffersLost;
v6 = (_WMI_LOGGER_CONTEXT *)(4 * LoggerContext->MaximumBuffers);
if( *Prc->UserBufferCount < (unsigned int)v6 )
{
UserBufferSpace = EtwpFindUserBufferSpace(
v6,
Prc,
(_WMI_BUFFER_HEADER **)*((unsigned int *)Buffer + 12),
&UserBuffer);
if( UserBufferSpace >= 0 )
{
memmove(UserBuffer, Buffer, *((_DWORD *)Buffer + 12));
UserBufferListHead = (volatile signed __int32 *)Prc->UserBufferListHead;
v8 = (_DWORD *)((char *)UserBuffer + 32);
if( (Prc->Flags & 0x10) != 0 )
{
v19 = (__int64)UserBuffer + 32;
LODWORD(v9) = *UserBufferListHead;
do
{
*v8 = v9;
v11 = v9;
LODWORD(v9) = _InterlockedCompareExchange(UserBufferListHead, (signed __int32)v8, v9);
}
while( (_DWORD)v9 != v11 );
v9 = (unsigned int)v9;
}
else
{
_m_prefetchw((const void *)UserBufferListHead);
v9 = *(_QWORD *)UserBufferListHead;
do
{
*(_QWORD *)v8 = v9;
v10 = v9;
v9 = _InterlockedCompareExchange64((volatile signed __int64 *)UserBufferListHead, (signed __int64)v8, v9);
}
while( v9 != v10 );
}
v16 = v9;
_InterlockedIncrement((volatile signed __int32 *)Prc->UserBufferCount);
if( !v16 )
KeSetEvent(Prc->DataAvailableEvent, 0, 0);
}
}
else
{
UserBufferSpace = -1073741764;
}
KiUnstackDetachProcess(&ApcState, 0i64);
ExReleaseRundownProtection(&Prc->ProcessObject->RundownProtect);
return UserBufferSpace;
}Referenced by:
EtwpRealtimeDeliverBuffer
EtwpRealtimeNotifyConsumers