PerfLogExecutiveResourceAcquire
VOID __stdcall PerfLogExecutiveResourceAcquire(
UINT64 Action,
VOID *LockAddress,
UINT64 RecursionCount,
UINT64 ContentionCount){
int v4;
unsigned int v5;
int v6;
struct _KPRCB *CurrentPrcb;
__int16 Group;
unsigned __int64 v9;
unsigned __int8 GroupIndex;
signed __int64 TrackingLockSlotForThread;
bool v12;
int v13;
v4 = ContentionCount;
v5 = RecursionCount;
v6 = Action;
CurrentPrcb = KeGetCurrentPrcb();
Group = CurrentPrcb->Group;
v9 = __rdtsc();
GroupIndex = CurrentPrcb->GroupIndex;
++CurrentPrcb->SynchCounters.ExEtwSynchTrackingNotificationsCount;
LOWORD(v13) = Group;
HIWORD(v13) = GroupIndex;
TrackingLockSlotForThread = EtwpGetTrackingLockSlotForThread((__int64)LockAddress, (unsigned int)Action & 0xFFFF0000);
if( TrackingLockSlotForThread )
{
++CurrentPrcb->SynchCounters.ExEtwSynchTrackingNotificationsAccountedCount;
if( ((v6 - 65569) & 0xFFFFFFDF) != 0 )
{
if( ((v6 - 65585) & 0xFFFFFFDF) != 0 )
return;
if( *(_DWORD *)(TrackingLockSlotForThread + 32) )
{
if( *(_DWORD *)(TrackingLockSlotForThread + 36) >= v5 )
{
LABEL_16:
*(_DWORD *)(TrackingLockSlotForThread + 32) = 1;
return;
}
LABEL_15:
*(_DWORD *)(TrackingLockSlotForThread + 36) = v5;
goto LABEL_16;
}
*(_QWORD *)(TrackingLockSlotForThread + 8) = 2i64;
}
else
{
v12 = *(_DWORD *)(TrackingLockSlotForThread + 32) == 4;
*(_QWORD *)(TrackingLockSlotForThread + 8) = v9;
if( !v12 )
{
*(_QWORD *)TrackingLockSlotForThread = 0i64;
goto LABEL_14;
}
if( *(_WORD *)(TrackingLockSlotForThread + 24) == Group
&& *(_BYTE *)(TrackingLockSlotForThread + 26) == GroupIndex )
{
*(_QWORD *)TrackingLockSlotForThread = v9 - *(_QWORD *)TrackingLockSlotForThread;
goto LABEL_14;
}
}
*(_QWORD *)TrackingLockSlotForThread = 1i64;
LABEL_14:
*(_DWORD *)(TrackingLockSlotForThread + 24) = v13;
*(_DWORD *)(TrackingLockSlotForThread + 44) = v4;
goto LABEL_15;
}
}Referenced by:
ExAcquireSharedWaitForExclusive
ExpTryToAcquireResourceExclusiveLite