PopEtInit
INT64 __stdcall PopEtInit(){
unsigned int v0;
_OWORD *PoolWithTag;
_OWORD *v2;
__int64 v3;
__int64 v4;
INT64 v5;
__int64 v6;
__int64 v7;
void *i;
_QWORD *NextProcess;
WCHAR v10;
_QWORD *v11;
__int64 v12;
int v13;
struct _UNICODE_STRING DestinationString;
__int16 result;
char result_2;
int v18;
int v19;
int v20;
int v21;
VOID(__fastcall *v22)(INT64, INT64, INT64, INT64);
INT64(__fastcall *v23)(INT64);
v0 = 0;
DestinationString = 0i64;
if( PopEnergyEstimationEnabled )
{
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x3B8ui64, 0x54456F50ui64);
PopEtGlobals = (__int64)PoolWithTag;
v2 = PoolWithTag;
if( PoolWithTag )
{
memset((INT64)PoolWithTag, 0i64);
v2[1] = 0i64;
*((_QWORD *)v2 + 2) = 0i64;
*((_QWORD *)v2 + 1) = v2;
*(_QWORD *)v2 = v2;
*(_OWORD *)((char *)v2 + 40) = 0i64;
*((_QWORD *)v2 + 5) = 0i64;
*((_QWORD *)v2 + 11) = PopEtInternerAllocate;
*((_QWORD *)v2 + 12) = PopEtInternerFree;
*((_QWORD *)v2 + 13) = PopEtInternerLock;
*((_QWORD *)v2 + 14) = PopEtInternerUnlock;
*((_QWORD *)v2 + 15) = PopEtInternerEntryInitialize;
RtlInternTableInitialize((INT64)v2 + 56, (INT64)v2 + 88);
PoEnergyContextInitialize((_QWORD *)v2 + 16);
*((_QWORD *)PsIdleProcess + 285) = v3;
PopEtInitializeBuiltinAppId((INT64)(v2 + 48), (INT64)L"Default");
PopEtInitializeBuiltinAppId((INT64)(v2 + 53), (INT64)L"Overflow");
PopEtInitializeBuiltinAppId((INT64)(v2 + 43), (INT64)L"IsrDpc");
v5 = (INT64)(v2 + 38);
*(_QWORD *)(*(_QWORD *)(v4 + 2280) + 448i64) = v6;
PopEtInitializeBuiltinAppId(v5, (INT64)L"System");
v7 = *((_QWORD *)PsInitialSystemProcess + 285);
if( v7 )
*(_QWORD *)(v7 + 448) = v5;
for( i = 0i64; ; i = v11 )
{
NextProcess = (_QWORD *)PsGetNextProcess(i);
v11 = NextProcess;
if( !NextProcess )
break;
v12 = NextProcess[285];
if( v12 )
{
if( !*(_QWORD *)(v12 + 448) )
{
*(_QWORD *)(v12 + 448) = PopEtGlobals + 768;
PoEnergyContextStart(NextProcess);
}
}
}
RtlInitUnicodeString(&DestinationString, L"EnergyTracker", v10);
memset((INT64)&result, 0i64);
result_2 |= 4u;
v22 = PopEtEnergyTrackerClose;
result = 120;
v23 = PopEtEnergyTrackerDelete;
v20 = 1;
v21 = 640;
v18 = 402;
v19 = 2031617;
v13 = ObCreateObjectType(&DestinationString, (__int64)&result, 0i64, PopEtGlobals + 32);
if( v13 >= 0 )
return 0;
return(unsigned int)v13;
}
else
{
return(unsigned int)-1073741670;
}
}
return v0;
}Referenced by:
PoInitSystem