PfTTraceListAdd

void __fastcall PfTTraceListAdd(__int64 a1){
  UINT64 v2; 
  _BOOL4 v3; 
  char *v4; 
  char *v5; 
  __int64 *v6; 
  _LIST_ENTRY FreeList; 

  FreeList.Blink = &FreeList;
  FreeList.Flink = &FreeList;
  ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C4DB30 + 0x2000));
  v2 = *(&stru_140C4DB30 + 2043);
  v3 = *(&stru_140C4DB30 + 2042) < *(&stru_140C4DB30 + 2043);
  if( *(_DWORD *)(a1 + 28) == 1 )
  {
    v5 = (char *)&stru_140C4DB30 + 8152;
    v2 = *(&stru_140C4DB30 + 2045);
    v4 = (char *)&stru_140C4DB30 + 8176;
    if( *(&stru_140C4DB30 + 2044) + 1 == *(&stru_140C4DB30 + 2045) )
      ++HIDWORD(xmmword_140C4FC10);
  }
  else
  {
    v4 = (char *)&stru_140C4DB30 + 8168;
    v5 = (char *)&stru_140C4DB30 + 8136;
    if( *(&stru_140C4DB30 + 2042) + 1 == *(&stru_140C4DB30 + 2043) )
      ++DWORD2(xmmword_140C4FC10);
    *(&stru_140C4DB30 + 2046) = 1;
  }
  v6 = (__int64 *)*((_QWORD *)v5 + 1);
  if( (char *)*v6 != v5 )
    __fastfail(3u);
  *(_QWORD *)a1 = v5;
  *(_QWORD *)(a1 + 8) = v6;
  *v6 = a1;
  *((_QWORD *)v5 + 1) = a1;
  if( ++*(_DWORD *)v4 > (unsigned int)v2 )
    PfTTraceListTrim(*(PF_TRACE_TYPE *)(a1 + 28), v2, &FreeList);
  if( v5 == (char *)&stru_140C4DB30 + 8136 && *(char **)v5 == v5 )
    *(&stru_140C4DB30 + 2046) = 0;
  if( v3 && *(&stru_140C4DB30 + 2042) >= *(&stru_140C4DB30 + 2043) )
    PfTAccessTracingCleanup(
      (_PFP_TRACING_GLOBALS *)&stru_140C4DB30 + 1908,
      (_PF_KERNEL_GLOBALS *)v2,
      PfpTraceStopTraceListFull);
  KeSetEvent(Event, 0, 0);
  KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C4DB30 + 0x2000));
  PfTTraceListFree(&FreeList);
}

Referenced by:

PfTGenerateTrace
PfpSectInfoHandleFullBuffer