PpmEventTraceProcessorIdle
VOID __stdcall PpmEventTraceProcessorIdle(_KPRCB *Prcb){
_PPM_IDLE_STATES *IdleStates;
int Type;
unsigned int ProcessorIdleCount;
ULONG v5;
size_t v6;
VOID **PoolWithTag;
_EVENT_DATA_DESCRIPTOR *UserData;
unsigned int v9;
_EVENT_DATA_DESCRIPTOR *v10;
__int64 v11;
_EVENT_DATA_DESCRIPTOR *v12;
const wchar_t *Buffer;
__int64 v14;
int MaximumLength;
__int16 Group;
unsigned int v17;
int v18;
if( PpmEtwRegistered && EtwEventEnabled(PpmEtwHandle, &PPM_ETW_CURRENT_IDLE_RUNDOWN) )
{
IdleStates = Prcb->PowerState.IdleStates;
if( IdleStates )
{
ProcessorIdleCount = IdleStates->ProcessorIdleCount;
v17 = ProcessorIdleCount;
Type = IdleStates->Type;
}
else
{
v17 = 0;
Type = 0;
ProcessorIdleCount = 0;
}
v18 = Type;
v5 = 2 * ProcessorIdleCount + 4;
v6 = 16 * v5 + 37 * ProcessorIdleCount;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v6, 1699565648i64);
UserData = (_EVENT_DATA_DESCRIPTOR *)PoolWithTag;
if( PoolWithTag )
{
memset(PoolWithTag, 0i64, v6);
Group = Prcb->Group;
v9 = 0;
UserData->Reserved = 0;
UserData[1].Reserved = 0;
UserData[2].Reserved = 0;
UserData[3].Reserved = 0;
UserData->Ptr = (unsigned __int64)&Group;
UserData[1].Ptr = (unsigned __int64)&Prcb->GroupIndex;
UserData[2].Ptr = (unsigned __int64)&v18;
v10 = &UserData[v5];
UserData[3].Ptr = (unsigned __int64)&v17;
UserData->Size = 2;
UserData[1].Size = 1;
UserData[2].Size = 4;
for( UserData[3].Size = 4; v9 < v17; UserData[v14].Reserved = 0 )
{
v11 = v9;
v12 = &UserData[2 * v9 + 4];
LODWORD(v10->Ptr) = IdleStates->State[v11].Latency;
HIDWORD(v10->Ptr) = IdleStates->State[v11].BreakEvenDuration;
LOBYTE(v10->Size) = IdleStates->State[v11].StateType;
*(unsigned int *)((char *)&v10->Size + 1) = IdleStates->State[v11].InterruptsEnabled;
*(unsigned int *)((char *)&v10->Reserved + 1) = IdleStates->State[v11].Interruptible;
*(_DWORD *)((char *)&v10[1].Ptr + 1) = IdleStates->State[v11].ContextRetained;
*(_DWORD *)((char *)&v10[1].Ptr + 5) = IdleStates->State[v11].CacheCoherent;
*(unsigned int *)((char *)&v10[1].Size + 1) = IdleStates->State[v11].WakesSpuriously;
*(unsigned int *)((char *)&v10[1].Reserved + 1) = IdleStates->State[v11].PlatformOnly;
*(_DWORD *)((char *)&v10[2].Ptr + 1) = IdleStates->State[v11].NoCState;
v12->Reserved = 0;
v12->Ptr = (unsigned __int64)v10;
v12->Size = 37;
Buffer = IdleStates->State[v11].Name.Buffer;
v14 = 2 * v9 + 5;
if( Buffer )
{
MaximumLength = IdleStates->State[v11].Name.MaximumLength;
}
else
{
MaximumLength = 28;
Buffer = L"";
}
UserData[2 * v9 + 5].Ptr = (unsigned __int64)Buffer;
v10 = (_EVENT_DATA_DESCRIPTOR *)((char *)v10 + 37);
UserData[2 * v9++ + 5].Size = MaximumLength;
}
EtwWrite(PpmEtwHandle, &PPM_ETW_CURRENT_IDLE_RUNDOWN, 0, v5, UserData);
ExFreePoolWithTag(UserData, 0x654D5050u);
}
}
}Referenced by:
PpmEventTraceControlCallback