EtwGetProcessorBuffer

NTSTATUS __stdcall EtwGetProcessorBuffer(UINT64 LoggerId, UINT64 ProcessorNumber, _ETW_BUFFER_INFORMATION *BufferInfo){
  NTSTATUS v3; 
  __int64 v6; 
  __int64 v7; 
  _ETW_BUFFER_INFORMATION *v8; 
  unsigned int v9; 

  v3 = 0;
  if( !*(&ExBootDevicesRemovedEvent + 1440) )
    return -1073741823;
  if( (unsigned int)LoggerId >= *(_DWORD *)(EtwpHostSiloState + 16) )
  {
    v6 = 1i64;
  }
  else
  {
    _mm_lfence();
    v6 = *(_QWORD *)(*(_QWORD *)(EtwpHostSiloState + 456) + 8i64 * (unsigned int)LoggerId);
  }
  if( (v6 & 1) != 0 )
    return -1073741816;
  if( *(_DWORD *)(v6 + 316) == 1 )
    return -1073741811;
  if( (*(_DWORD *)(v6 + 12) & 0x10000000) != 0 )
    v7 = *(_QWORD *)(v6 + 144);
  else
    v7 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(*(_QWORD *)(v6 + 1080) + 4136i64)
                               + ((unsigned __int64)(unsigned int)ProcessorNumber << 6))
                   + 8i64 * (unsigned int)LoggerId);
  v8 = (_ETW_BUFFER_INFORMATION *)(v7 & 0xFFFFFFFFFFFFFFF0ui64);
  if( !v8 )
    return -1073741823;
  BufferInfo[2] = *v8;
  v9 = v8[2];
  *(_QWORD *)BufferInfo = v8;
  if( v9 <= *v8 )
    BufferInfo[3] = v8[2];
  else
    BufferInfo[3] = v8[1];
  return v3;
}

Referenced by:

KiSaveCurrentEtwTraceBuffer