PfSnRemoveProcessTrace
_PFSN_TRACE_HEADER *__stdcall PfSnRemoveProcessTrace(_EPROCESS *Process){
__int64 v1;
_PFSN_TRACE_HEADER *v2;
unsigned int v3;
signed __int64 v4;
bool v5;
signed __int64 v6;
unsigned __int64 v7;
unsigned __int64 v9;
v1 = _InterlockedExchange64((volatile __int64 *)&Process->PrefetchTrace, 0i64);
v2 = (_PFSN_TRACE_HEADER *)(v1 & 0xFFFFFFFFFFFFFFF0ui64);
v3 = v1 & 0xF;
if( v3 )
{
_m_prefetchw(v2 + 90);
v4 = *((_QWORD *)v2 + 45);
if( (v4 & 1) != 0 )
{
LABEL_6:
v9 = v4 & 0xFFFFFFFFFFFFFFFEui64;
if( _InterlockedExchangeAdd64((volatile signed __int64 *)v9, -(__int64)v3) == v3
&& !_interlockedbittestandreset((volatile signed __int32 *)(v9 + 32), 0) )
{
KeSetEvent((PRKEVENT)(v9 + 8), 0, 0);
}
}
else
{
while( 1 )
{
v6 = _InterlockedCompareExchange64((volatile signed __int64 *)v2 + 45, v4 - 2 * v3, v4);
v5 = v4 == v6;
v4 = v6;
if( v5 )
break;
if( (v6 & 1) != 0 )
goto LABEL_6;
}
}
}
v7 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&qword_140C50190);
KxReleaseSpinLock(&qword_140C50190);
__writecr8(v7);
return v2;
}Referenced by:
PfSnDeactivateTrace