PerfLogExecutiveResourceWait
VOID __stdcall PerfLogExecutiveResourceWait(UINT64 Action, VOID *LockAddress, UINT64 RecursionCount){
unsigned int v3;
int v5;
struct _KPRCB *CurrentPrcb;
unsigned __int64 v7;
__int16 Group;
unsigned __int8 GroupIndex;
signed __int64 TrackingLockSlotForThread;
__int64 v11;
int v12;
__int64 v13[3];
unsigned int v14;
unsigned int CurrentRunTime;
VOID *v16;
int v17;
int v18;
__int64 v19[2];
v3 = RecursionCount;
v5 = Action;
CurrentPrcb = KeGetCurrentPrcb();
v7 = __rdtsc();
Group = CurrentPrcb->Group;
GroupIndex = CurrentPrcb->GroupIndex;
++CurrentPrcb->SynchCounters.ExEtwSynchTrackingNotificationsCount;
LOWORD(v12) = Group;
HIWORD(v12) = GroupIndex;
TrackingLockSlotForThread = EtwpGetTrackingLockSlotForThread((__int64)LockAddress, (unsigned int)Action & 0xFFFF0000);
if( TrackingLockSlotForThread )
{
++CurrentPrcb->SynchCounters.ExEtwSynchTrackingNotificationsAccountedCount;
if( ((v5 - 65572) & 0xFFFFFFDF) != 0 )
{
if( ((v5 - 66084) & 0xFFFFFFDF) == 0 )
{
if( *(_DWORD *)(TrackingLockSlotForThread + 32) == 4
&& *(_WORD *)(TrackingLockSlotForThread + 24) == Group
&& *(_BYTE *)(TrackingLockSlotForThread + 26) == GroupIndex )
{
v11 = v7 - *(_QWORD *)TrackingLockSlotForThread;
}
else
{
v11 = 0i64;
}
if( !(v3 % EtwpExecutiveResourceTimeout) )
{
v13[0] = 0i64;
v17 = v5;
v16 = LockAddress;
v14 = v3;
v13[1] = v11;
v13[2] = *(_QWORD *)TrackingLockSlotForThread;
v18 = 0;
v19[1] = 48i64;
CurrentRunTime = KeGetCurrentThread()[1].CurrentRunTime;
v19[0] = (__int64)v13;
EtwTraceKernelEvent((__int64)v19, 1u, 0x20020000u, 0x52Bu, 0x1501802u);
}
}
}
else
{
*(_DWORD *)(TrackingLockSlotForThread + 24) = v12;
*(_DWORD *)(TrackingLockSlotForThread + 32) = 4;
*(_QWORD *)TrackingLockSlotForThread = v7;
}
}
}Referenced by:
ExAcquireSharedWaitForExclusive