PfSnTraceGetLogEntry

INT64 __fastcall PfSnTraceGetLogEntry(INT64 a1, UINT64 a2, _QWORD *a3){
  unsigned int v4; 
  __int64 v6; 
  int v7; 
  unsigned int v8; 
  UINT64 v10; 
  CHAR *v11; 
  unsigned __int8 v12; 
  unsigned __int64 v13; 
  CHAR **v14; 
  v4 = a2;
  if( (int)a2 + _InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 344), a2) > *(_DWORD *)(a1 + 340) )
  {
    _InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 344), -(int)a2);
    if( !_InterlockedCompareExchange((volatile signed __int32 *)(a1 + 400), 3, 0) )
      ExQueueWorkItem((WORK_QUEUE_ITEM *)(a1 + 368), DelayedWorkQueue);
    return(unsigned int)-1073741431;
  }
  else
  {
    v6 = *(_QWORD *)(a1 + 96);
    v7 = a2 + _InterlockedExchangeAdd((volatile signed __int32 *)(v6 + 16), a2);
    v8 = 0;
    while( v7 > 0 )
    {
      if( v7 <= *(_DWORD *)(v6 + 20) )
      {
        *a3 = v6 + 16i64 * (int)(v7 - v4) + 24;
        return v8;
      }
      _InterlockedExchangeAdd((volatile signed __int32 *)(v6 + 16), -v4);
      v11 = PfSnTraceBufferAllocate();
      if( !v11 )
      {
        v8 = -1073741670;
        goto LABEL_19;
      }
      KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 128), v10);
      v13 = v12;
      if( *(_QWORD *)(a1 + 96) == v6 )
      {
        v14 = *(CHAR ***)(a1 + 112);
        if( *v14 != (CHAR *)(a1 + 104) )
          __fastfail(3u);
        *((_QWORD *)v11 + 1) = v14;
        *(_QWORD *)v11 = a1 + 104;
        *v14 = v11;
        *(_QWORD *)(a1 + 112) = v11;
        ++*(_DWORD *)(a1 + 120);
        *(_QWORD *)(a1 + 96) = v11;
        KxReleaseSpinLock((UINT64 *)(a1 + 128));
        __writecr8(v13);
      }
      else
      {
        KxReleaseSpinLock((UINT64 *)(a1 + 128));
        __writecr8(v13);
        ExFreePoolWithTag(v11, 0);
      }
      v6 = *(_QWORD *)(a1 + 96);
      v7 = v4 + _InterlockedExchangeAdd((volatile signed __int32 *)(v6 + 16), v4);
    }
    v8 = -1073741675;
LABEL_19:
    _InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 344), -v4);
  }
  return v8;
}

Referenced by:

MiCompleteProtoPteFault
PfSnCheckLogSequenceNumber
PfSnLogHelper
PfSnLogIdentifier
PfSnLogPageFaultCommon
PfSnLogStreamDelete
PfSnTraceTimerRoutine