PopEtInit
NTSTATUS __stdcall PopEtInit(){
NTSTATUS v0;
VOID **PoolWithTag;
VOID **v2;
__int64 v3;
__int64 v4;
INT64 v5;
__int64 v6;
struct _PO_PROCESS_ENERGY_CONTEXT *EnergyContext;
_EPROCESS *i;
_LIST_ENTRY *NextProcess;
_LIST_ENTRY *v10;
_LIST_ENTRY *Blink;
int v12;
_UNICODE_STRING DestinationString;
_OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
v0 = 0;
DestinationString = 0i64;
if( *(&stru_140C23628 + 6120) )
{
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x3B8ui64, 1413836624i64);
PopEtGlobals = (__int64)PoolWithTag;
v2 = PoolWithTag;
if( PoolWithTag )
{
memset(PoolWithTag, 0i64, 0x3B8u);
*((_OWORD *)v2 + 1) = 0i64;
v2[2] = 0i64;
v2[1] = v2;
*v2 = v2;
*(_OWORD *)(v2 + 5) = 0i64;
v2[5] = 0i64;
v2[11] = PopEtInternerAllocate;
v2[12] = PopEtInternerFree;
v2[13] = PopEtInternerLock;
v2[14] = PopEtInternerUnlock;
v2[15] = PopEtInternerEntryInitialize;
RtlInternTableInitialize((INT64)(v2 + 7), (INT64)(v2 + 11));
PoEnergyContextInitialize(v2 + 16);
*(_QWORD *)(*(_QWORD *)&PsIdleProcess + 2280i64) = v3;
PopEtInitializeBuiltinAppId((INT64)(v2 + 96), (INT64)L"Default");
PopEtInitializeBuiltinAppId((INT64)(v2 + 106), (INT64)L"Overflow");
PopEtInitializeBuiltinAppId((INT64)(v2 + 86), (INT64)L"IsrDpc");
v5 = (INT64)(v2 + 76);
*(_QWORD *)(*(_QWORD *)(v4 + 2280) + 448i64) = v6;
PopEtInitializeBuiltinAppId(v5, (INT64)L"System");
EnergyContext = PsInitialSystemProcess->EnergyContext;
if( EnergyContext )
*((_QWORD *)EnergyContext + 56) = v5;
for( i = 0i64; ; i = (_EPROCESS *)v10 )
{
NextProcess = PsGetNextProcess(i);
v10 = NextProcess;
if( !NextProcess )
break;
Blink = NextProcess[142].Blink;
if( Blink )
{
if( !Blink[28].Flink )
{
Blink[28].Flink = (_LIST_ENTRY *)(PopEtGlobals + 768);
PoEnergyContextStart((ULONG_PTR)NextProcess);
}
}
}
RtlInitUnicodeString(&DestinationString, L"EnergyTracker");
memset(&ObjectTypeInitializer, 0i64, sizeof(ObjectTypeInitializer));
ObjectTypeInitializer._bf_0 |= 4u;
ObjectTypeInitializer.CloseProcedure = (void(__fastcall *)(_EPROCESS *, void *, unsigned __int64, unsigned __int64))PopEtEnergyTrackerClose;
ObjectTypeInitializer.Length = 120;
ObjectTypeInitializer.DeleteProcedure = (void(__fastcall *)(void *))PopEtEnergyTrackerDelete;
ObjectTypeInitializer.PoolType = PagedPool;
ObjectTypeInitializer.DefaultPagedPoolCharge = 640;
ObjectTypeInitializer.InvalidAttributes = 402;
ObjectTypeInitializer.ValidAccessMask = 2031617;
v12 = ObCreateObjectType(&DestinationString, &ObjectTypeInitializer, 0i64, (_OBJECT_TYPE **)(PopEtGlobals + 32));
if( v12 >= 0 )
return 0;
return v12;
}
else
{
return -1073741670;
}
}
return v0;
}Referenced by:
PoInitSystem