EtwpFindAndLockBufferForFlushing
_WMI_BUFFER_HEADER *__stdcall EtwpFindAndLockBufferForFlushing(
_WMI_LOGGER_CONTEXT *LoggerContext,
INT64 SequenceNumber){
_LIST_ENTRY *p_GlobalList;
_LIST_ENTRY *Flink;
bool v4;
_LIST_ENTRY **p_Blink;
_LIST_ENTRY *v6;
p_GlobalList = &LoggerContext->GlobalList;
Flink = LoggerContext->GlobalList.Flink;
v4 = Flink == &LoggerContext->GlobalList;
p_Blink = &Flink[-4].Blink;
if( v4 )
p_Blink = 0i64;
if( !p_Blink )
return(_WMI_BUFFER_HEADER *)p_Blink;
while( p_Blink[3] != (_LIST_ENTRY *)SequenceNumber )
{
v6 = p_Blink[7];
p_Blink = &v6[-4].Blink;
if( v6 == p_GlobalList )
p_Blink = 0i64;
if( !p_Blink )
return 0i64;
}
if( _InterlockedCompareExchange((volatile signed __int32 *)p_Blink + 11, 3, 0) )
return 0i64;
if( p_Blink[3] == (_LIST_ENTRY *)SequenceNumber )
return(_WMI_BUFFER_HEADER *)p_Blink;
_InterlockedExchange((volatile __int32 *)p_Blink + 11, 0);
return 0i64;
}Referenced by:
EtwpBufferingModeFlush