PopDispatchPowerSettingCallbacks
VOID __stdcall PopDispatchPowerSettingCallbacks(UINT64 Flags){
INT64 v1;
__int64 v2;
PVOID *v3;
__int64 v4;
__int64 *v5;
__int64 *v6;
__int64 v7;
__int64 *v8;
char v9;
PVOID *v10;
char v11;
_QWORD *v12;
__int64 v13;
PVOID *v15;
PopIncrementPowerSettingPendingUpdates(0);
LOBYTE(v1) = 1;
PopDecrementPowerSettingPendingUpdates(v1);
v2 = dword_140C23D0C;
ExAcquireFastMutex(&PopSettingLock);
v3 = (PVOID *)PopPowerSettings;
if( PopPowerSettings != &PopPowerSettings )
{
v4 = v2;
while( 1 )
{
v5 = (__int64 *)(v3 + 2);
v6 = (__int64 *)v3[2];
while( v6 != v5 )
{
if( *((_BYTE *)v6 + 104) )
{
v6 = (__int64 *)*v6;
}
else
{
*((_BYTE *)v6 + 104) = 1;
v7 = (__int64)v3[v4 + 8];
if( v6[9] != v7 )
PopCallPowerSettingCallback(v6, v7);
v8 = (__int64 *)*v6;
*((_BYTE *)v6 + 104) = 0;
if( *((_BYTE *)v6 + 33) || *((_BYTE *)v6 + 32) )
PopUnregisterPowerSettingCallback(v6);
v6 = v8;
}
}
v9 = 0;
if( (__int64 *)*v5 == v5 && !*((_DWORD *)v3 + 14) && !*((_DWORD *)v3 + 15) )
{
v11 = 1;
v12 = v3 + 8;
v13 = 3i64;
do
{
v9 = 0;
if( *v12++ == 0i64 )
v9 = v11;
v11 = v9;
--v13;
}
while( v13 );
}
v10 = (PVOID *)*v3;
if( v9 )
{
if( v10[1] != v3 || (v15 = (PVOID *)v3[1], *v15 != v3) )
__fastfail(3u);
*v15 = v10;
v10[1] = v15;
ExFreePoolWithTag(v3, 0x74655350u);
}
if( v10 == &PopPowerSettings )
break;
v3 = v10;
}
}
KeReleaseGuardedMutex(&PopSettingLock);
PopDecrementPowerSettingPendingUpdates(0i64);
}Referenced by:
No references.