PpmWmiGetAllData
NTSTATUS __stdcall PpmWmiGetAllData(
PROCESSOR_POWER_STATE *PpmState,
_GUID *GuidPtr,
UINT64 BufferSize,
VOID *Buffer,
UINT64 *Size,
UINT8 GetAllData){
unsigned int v8;
__int64 v9;
__int64 v11;
_ETHREAD *CurrentThread;
char v13;
_PROC_PERF_DOMAIN *Domain;
__int64 v15;
size_t v16;
unsigned __int64 v17;
__int64 v18;
unsigned int v19;
int v20;
NTSTATUS v21;
_DWORD *v22;
__int64 v23;
__int64 v24;
__int64 v25;
unsigned __int64 v26;
_PPM_IDLE_STATES *IdleStates;
unsigned int ProcessorIdleCount;
__int64 v29;
unsigned int *v30;
__int64 v31;
__int64 v32;
NTSTATUS result;
v8 = BufferSize;
v9 = PPM_IDLESTATES_DATA_GUID;
v11 = PPM_IDLESTATES_DATA_GUID - *(_QWORD *)&GuidPtr->Data1;
if( !v11 )
v11 = 0xE710D47A1ACF1686ui64 - *(_QWORD *)GuidPtr->Data4;
if( v11 )
{
v13 = 0;
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v13 = 1;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&stru_140C23628 + 123, 0i64);
v9 = PPM_IDLESTATES_DATA_GUID;
}
Domain = PpmState->CheckContext.Domain;
v15 = PPM_PERFSTATES_DATA_GUID - *(_QWORD *)&GuidPtr->Data1;
if( PPM_PERFSTATES_DATA_GUID == *(_QWORD *)&GuidPtr->Data1 )
v15 = 0x26018D33012BAAB4i64 - *(_QWORD *)GuidPtr->Data4;
if( v15 || !Domain )
{
v17 = v9 - *(_QWORD *)&GuidPtr->Data1;
if( !v17 )
v17 = 0xE710D47A1ACF1686ui64 - *(_QWORD *)GuidPtr->Data4;
if( v17 || !PpmState->IdleStates )
{
v18 = PPM_PERFMON_PERFSTATE_GUID - *(_QWORD *)&GuidPtr->Data1;
if( PPM_PERFMON_PERFSTATE_GUID == *(_QWORD *)&GuidPtr->Data1 )
v18 = 0x9E75876A060BA1B0ui64 - *(_QWORD *)GuidPtr->Data4;
if( v18 || !Domain )
{
v21 = -1073741808;
v20 = 0;
goto LABEL_48;
}
v16 = 12;
}
else
{
v16 = 32 * PpmState->IdleStates->ProcessorIdleCount + 56;
}
}
else
{
v16 = 80;
}
v19 = GetAllData != 0 ? 72 : 64;
v20 = v19 + v16;
if( v8 >= v19 + v16 )
{
v22 = (char *)Buffer + v19;
*(_DWORD *)Buffer = v20;
if( GetAllData )
{
v23 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
*((_DWORD *)Buffer + 11) |= 0x10u;
*((_QWORD *)Buffer + 2) = v23;
*((_DWORD *)Buffer + 13) = 1;
*((_DWORD *)Buffer + 12) = v19;
}
else
{
*((_DWORD *)Buffer + 14) = v19;
}
*((_DWORD *)Buffer + 15) = v16;
memset(v22, 0i64, v16);
v24 = *(_QWORD *)&GuidPtr->Data1;
v25 = PPM_PERFSTATES_DATA_GUID - *(_QWORD *)&GuidPtr->Data1;
if( PPM_PERFSTATES_DATA_GUID == *(_QWORD *)&GuidPtr->Data1 )
v25 = 0x26018D33012BAAB4i64 - *(_QWORD *)GuidPtr->Data4;
if( v25 || !Domain )
{
v26 = PPM_IDLESTATES_DATA_GUID - v24;
if( PPM_IDLESTATES_DATA_GUID == v24 )
v26 = 0xE710D47A1ACF1686ui64 - *(_QWORD *)GuidPtr->Data4;
if( v26 || !PpmState->IdleStates )
{
v32 = PPM_PERFMON_PERFSTATE_GUID - *(_QWORD *)&GuidPtr->Data1;
if( PPM_PERFMON_PERFSTATE_GUID == *(_QWORD *)&GuidPtr->Data1 )
v32 = 0x9E75876A060BA1B0ui64 - *(_QWORD *)GuidPtr->Data4;
if( !v32 && Domain )
PpmPerfGetCurrentState(
(_KPRCB *)&PpmState[-64],
(UINT64 *)v22,
0i64,
(UINT64 *)v22 + 1,
(UINT64 *)(v22 + 1),
0i64);
}
else
{
v22[1] = PpmState->IdleStates->ProcessorIdleCount;
v22[2] = PpmState->IdleStates->TargetState;
v22[3] = PpmState->IdleStates->OldState;
*((_QWORD *)v22 + 2) = PpmState[-64].PerfFeedback.StallTime;
IdleStates = PpmState->IdleStates;
ProcessorIdleCount = PpmState->IdleStates->ProcessorIdleCount;
if( ProcessorIdleCount )
{
v29 = 0i64;
v30 = v22 + 8;
v31 = ProcessorIdleCount;
do
{
v29 += 248i64;
*(v30 - 2) = *(_DWORD *)((char *)&PpmState->IdleStates->CoordinatedTracing + v29) / 0xAu;
*(v30 - 1) = *(unsigned int *)((char *)&PpmState->IdleStates->ProcessorMenu.Count + v29);
*v30 = IdleStates->PrepareInfo.Constraints.TimeCheck;
v30 += 8;
*((_BYTE *)v30 - 28) = IdleStates->PrepareInfo.Constraints.PromotePercent;
*((_BYTE *)v30 - 27) = IdleStates->PrepareInfo.Constraints.DemotePercent;
*((_BYTE *)v30 - 26) = *((_BYTE *)&PpmState->IdleStates->CoordinatedSelection.Selection + v29);
*((_QWORD *)v30 - 3) = *(unsigned int *)((char *)&PpmState->IdleStates->ProcessorMenu.Count + v29 + 4);
*(v30 - 4) = 1;
--v31;
}
while( v31 );
}
}
}
else
{
*v22 = 0;
v22[1] = Domain->NominalFrequency;
*((_QWORD *)v22 + 1) = 0i64;
*((_QWORD *)v22 + 2) = 0i64;
*((_BYTE *)v22 + 28) = 100;
*((_BYTE *)v22 + 29) = Domain->Coordination;
v22[8] = *(_DWORD *)(2736i64 * *(&stru_140C23628 + 441) + *(&stru_140C00F40 + 365) + 60);
*((_QWORD *)v22 + 5) = Domain->Members.Bitmap[0];
v22[16] = 1;
}
}
else
{
if( v8 < 0x38 )
{
v21 = -1073741789;
goto LABEL_48;
}
*((_DWORD *)Buffer + 12) = v20;
v20 = 56;
*((_DWORD *)Buffer + 11) = 32;
}
v21 = 0;
LABEL_48:
if( v13 )
PopReleaseRwLock((_POP_RW_LOCK *)((char *)&stru_140C23628 + 984));
result = v21;
if( v21 < 0 )
v20 = 0;
*(_DWORD *)Size = v20;
return result;
}Referenced by:
PpmWmiDispatch