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