EtwpCovSampSampleBufferReserve

INT64 __fastcall EtwpCovSampSampleBufferReserve(INT64 a1, INT16 a2, INT64 *a3){
  INT64 v4; 
  __int64 v5; 
  unsigned int v6; 
  unsigned int v7; 
  INT64 v8; 
  __int64 v9; 
  INT64 v10; 
  __int64 v11; 
  int v12; 
  struct SLIST_ENTRY *v13; 
  unsigned __int16 v15; 
  v4 = 0i64;
  v5 = (*(_QWORD *)(a1 + 8) >> 4) & 0x1FFi64;
  v6 = ((unsigned int)*(_QWORD *)(a1 + 8) >> 13) & 0x3FFFF;
  _BitScanReverse(&v7, v6);
  v8 = 0i64;
  v9 = *(_QWORD *)(*(_QWORD *)(*((_QWORD *)KeGetCurrentPrcb() + 4198) + 8i64 * (v7 - 2)) + 8i64 * (v6 ^ (1 << v7)) + 8)
     + 8 * v5;
  v15 = 7 - ((a2 + 7) & 7) + a2 + 8;
  while( EtwpCovSampTryAcquireBufferLock((PKSPIN_LOCK)v9) )
  {
    v10 = *(_QWORD *)(v9 + 8);
    if( v10 )
      goto LABEL_7;
    if( v8 )
    {
      if( !*(_DWORD *)(v9 + 120) )
      {
        KxReleaseSpinLock((UINT64 *)v9);
        __writecr8(0i64);
        break;
      }
      *(_QWORD *)(v9 + 8) = v8;
      v10 = v8;
      v8 = 0i64;
LABEL_7:
      v11 = *(int *)(v10 + 60);
      v12 = v11 + v15;
      if( v12 <= *(_DWORD *)(v10 + 64) )
      {
        *(_DWORD *)(v10 + 60) = v12;
        ++*(_DWORD *)(v10 + 56);
        if( _InterlockedIncrement64((volatile signed __int64 *)(v10 + 48)) <= 1 )
          __fastfail(0xEu);
        KxReleaseSpinLock((UINT64 *)v9);
        __writecr8(0i64);
        v4 = v11 + v10 + 72;
        *(_WORD *)(v4 + 4) = v15;
        *(_DWORD *)v4 = v11;
        *a3 = v10;
        break;
      }
      *(_QWORD *)(v9 + 8) = 0i64;
      KxReleaseSpinLock((UINT64 *)v9);
      __writecr8(0i64);
      EtwpCovSampSampleBufferDecRef(a1, v10);
    }
    else
    {
      KxReleaseSpinLock((UINT64 *)v9);
      __writecr8(0i64);
      v13 = EtwpCovSampLookasidePop(a1, a1 + 512);
      v8 = (INT64)v13;
      if( !v13 )
      {
        _InterlockedIncrement((volatile signed __int32 *)(v9 + 316));
        return v4;
      }
      *((_DWORD *)&v13[3].Next + 3) = 0;
      *((_DWORD *)&v13[3].Next + 2) = 0;
      v13[3].Next = (_SLIST_ENTRY *)1;
    }
  }
  if( v8 )
    EtwpCovSampSampleBufferDecRef(a1, v8);
  return v4;
}

Referenced by:

EtwpCovSampCaptureBufferQueue