EtwQueryProcessTelemetryCoverage
UINT8 __stdcall EtwQueryProcessTelemetryCoverage(ERESOURCE *Resource, UINT8 Wait){
unsigned int v2;
unsigned int *v3;
unsigned int *v4;
unsigned int v5;
UINT8 *v6;
_ETHREAD *CurrentThread;
INT64 v8;
unsigned int v9;
__int64 *v10;
__int64 *i;
__int64 v12;
unsigned int v13;
__int64 v14;
__int64 *j;
unsigned int v16;
__int64 v17;
UINT8 v19;
v4 = v3;
v5 = v2;
v6 = (UINT8 *)Wait;
if( Resource == *((ERESOURCE **)KeGetCurrentThread() + 23) )
{
if( EtwpCoverageContext )
{
if( EtwpCoverageUserIsAdmin() )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)&EtwpCoverageLock, 0i64);
EtwpCoverageLockOwner = (__int64)KeGetCurrentThread();
v8 = EtwpCoverageContext;
v9 = *(_DWORD *)(*(_QWORD *)(EtwpCoverageContext + 16) + 16i64);
v10 = (__int64 *)(EtwpCoverageContext + 48);
for( i = *(__int64 **)(EtwpCoverageContext + 48); i != v10; i = (__int64 *)*i )
v9 = *((_DWORD *)i + 6) - (_DWORD)i + v9 - 40;
if( v4 )
*v4 = v9;
v12 = *(_QWORD *)(v8 + 16);
v13 = *(_DWORD *)(v12 + 16);
if( v5 < v13 )
v13 = v5;
if( v13 )
{
v14 = v13;
memmove(v6, (UINT8 *)v12, v13);
v6 += v14;
}
if( v5 < v9 )
{
v19 = 5;
}
else
{
for( j = (__int64 *)*v10; j != v10; j = (__int64 *)*j )
{
v16 = *((_DWORD *)j + 6) - (_DWORD)j - 40;
if( *((_DWORD *)j + 6) - (_DWORD)j != 40 )
{
v17 = v16;
memmove(v6, (UINT8 *)j + 40, v16);
v6 += v17;
}
}
v19 = 0;
}
}
else
{
v19 = 34;
}
}
else
{
v19 = -73;
}
}
else
{
v19 = -69;
}
if( (struct _KTHREAD *)EtwpCoverageLockOwner == KeGetCurrentThread() )
{
EtwpCoverageLockOwner = 0i64;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&EtwpCoverageLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&EtwpCoverageLock);
KeAbPostRelease(&EtwpCoverageLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
return v19;
}Referenced by:
NtQueryInformationProcess