EtwpGetTrackingLockSlotForThread
signed __int64 __fastcall EtwpGetTrackingLockSlotForThread(__int64 a1, int a2){
_ETHREAD *CurrentThread;
signed __int64 ReservedForSynchTracking;
int v6;
VOID **PoolWithTag;
signed __int64 v8;
signed __int64 v10;
int v11;
int v12;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (CurrentThread->CrossThreadFlags & 1) != 0 )
return 0i64;
ReservedForSynchTracking = (signed __int64)CurrentThread->ReservedForSynchTracking;
v6 = EtwpEthreadSyncTrackingSequence;
if( !ReservedForSynchTracking )
{
PoolWithTag = ExAllocatePoolWithTag(0x204ui64, 0x200ui64, 1918133586i64);
v8 = (signed __int64)PoolWithTag;
if( PoolWithTag )
{
memset(PoolWithTag, 0i64, 0x200u);
*(_QWORD *)(v8 + 16) = a1;
*(_DWORD *)(v8 + 28) = a2;
*(_DWORD *)(v8 + 40) = v6;
ReservedForSynchTracking = _InterlockedCompareExchange64(
(volatile signed __int64 *)&CurrentThread->ReservedForSynchTracking,
v8,
0i64);
if( !ReservedForSynchTracking )
return v8;
ExFreePoolWithTag((PVOID)v8, 0);
goto LABEL_7;
}
return 0i64;
}
LABEL_7:
v10 = 0i64;
v11 = 0;
while( 1 )
{
v12 = *(_DWORD *)(ReservedForSynchTracking + 28);
if( v12 == a2
&& *(_QWORD *)(ReservedForSynchTracking + 16) == a1
&& *(_DWORD *)(ReservedForSynchTracking + 40) == v6 )
{
return ReservedForSynchTracking;
}
if( !v10 )
{
if( v12 )
{
if( *(_DWORD *)(ReservedForSynchTracking + 40) < v6 )
{
v10 = ReservedForSynchTracking;
LABEL_18:
ReservedForSynchTracking = v10;
if( v10 )
{
*(_QWORD *)(v10 + 16) = a1;
*(_DWORD *)(v10 + 28) = a2;
*(_QWORD *)(v10 + 32) = 0i64;
*(_QWORD *)v10 = 0i64;
*(_QWORD *)(v10 + 8) = 0i64;
*(_DWORD *)(v10 + 24) = 0;
*(_DWORD *)(v10 + 40) = v6;
*(_DWORD *)(v10 + 44) = 0;
}
return ReservedForSynchTracking;
}
}
else
{
v10 = ReservedForSynchTracking;
}
}
ReservedForSynchTracking += 64i64;
if( (unsigned int)++v11 >= 8 )
goto LABEL_18;
}
}Referenced by:
PerfLogExecutiveResourceAcquire
PerfLogExecutiveResourceRelease
PerfLogExecutiveResourceSetOwnerPointer
PerfLogExecutiveResourceWait