EtwpCoverageReset
_ETHREAD *__fastcall EtwpCoverageReset(__int64 a1, char a2){
_ETHREAD *CurrentThread;
__int64 v5;
_ETHREAD *result;
int a2a;
if( *(_DWORD *)(*(_QWORD *)(a1 + 16) + 32i64) )
{
if( dword_140C0EF3C < KUSER_SHARED_DATA.TelemetryCoverageRound )
{
if( !dword_140C0EF38 )
dword_140C0EF38 = TelemetryCoverageStringHashInternal((_BYTE *)off_140C0EF30, &a2a);
EtwTelemetryCoverageReport((INT64)&off_140C0EF30);
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)&EtwpCoverageLock, 0i64);
EtwpCoverageLockOwner = (__int64)KeGetCurrentThread();
if( (a2 & 4) == 0 || (*(_DWORD *)(a1 + 36) & 1) != 0 )
{
if( (a2 & 1) != 0
|| (unsigned int)((KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24)
- *(_DWORD *)(a1 + 24) > 0x927C0 )
{
*(_DWORD *)(a1 + 36) &= ~1u;
EtwpCoverageFlushPending(a1);
memset(*(_QWORD *)(a1 + 16) + 52i64, 0i64);
EtwpCoverageFreeStringBuffers(a1, 1i64);
*(_DWORD *)(*(_QWORD *)a1 + 4i64) = 0;
**(_DWORD **)a1 = ++*(_DWORD *)(*(_QWORD *)(a1 + 16) + 24i64);
v5 = *(_QWORD *)(a1 + 16);
if( (*(_BYTE *)(v5 + 2) & 1) == 0 )
KUSER_SHARED_DATA.TelemetryCoverageRound = *(_DWORD *)(v5 + 24);
*(_DWORD *)(*(_QWORD *)(a1 + 16) + 20i64) = (KUSER_SHARED_DATA.TickCountQuad
* KUSER_SHARED_DATA.TickCountMultiplier) >> 24;
*(_DWORD *)(*(_QWORD *)a1 + 20i64) = *(_DWORD *)(*(_QWORD *)(a1 + 16) + 20i64);
*(_DWORD *)(*(_QWORD *)(a1 + 16) + 32i64) = 0;
}
else
{
*(_DWORD *)(a1 + 36) |= 1u;
}
}
}
result = (_ETHREAD *)KeGetCurrentThread();
if( (_ETHREAD *)EtwpCoverageLockOwner == result )
{
EtwpCoverageLockOwner = 0i64;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&EtwpCoverageLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&EtwpCoverageLock);
KeAbPostRelease(&EtwpCoverageLock);
return(_ETHREAD *)KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
return result;
}Referenced by:
EtwSetProcessTelemetryCoverage
EtwpCoverageResetWorkItemCallback