PopDispatchPowerSettingCallbacks
VOID __stdcall PopDispatchPowerSettingCallbacks(_IRP *Irp, UINT8 CallerAcquiredMutex){
__int64 v2;
_LIST_ENTRY *Flink;
__int64 v4;
_LIST_ENTRY *v5;
__int64 v6;
__int64 v7;
__int64 v8;
char v9;
_LIST_ENTRY *v10;
char v11;
_LIST_ENTRY *v12;
__int64 v13;
bool v14;
_LIST_ENTRY *Blink;
PopIncrementPowerSettingPendingUpdates(0);
PopDecrementPowerSettingPendingUpdates(1u);
v2 = *(&stru_140C23628 + 441);
ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C23628 + 3000));
Flink = PopPowerSettings.Flink;
if( PopPowerSettings.Flink != &PopPowerSettings )
{
v4 = v2;
while( 1 )
{
v5 = Flink + 1;
v6 = (__int64)Flink[1].Flink;
while( (_LIST_ENTRY *)v6 != v5 )
{
if( *(_BYTE *)(v6 + 104) )
{
v6 = *(_QWORD *)v6;
}
else
{
*(_BYTE *)(v6 + 104) = 1;
v7 = *((_QWORD *)&Flink[4].Flink + v4);
if( *(_QWORD *)(v6 + 72) != v7 )
PopCallPowerSettingCallback(v6, v7);
v8 = *(_QWORD *)v6;
*(_BYTE *)(v6 + 104) = 0;
if( *(_BYTE *)(v6 + 33) || *(_BYTE *)(v6 + 32) )
PopUnregisterPowerSettingCallback((_POP_POWER_SETTING_REGISTRATION *)v6);
v6 = v8;
}
}
v9 = 0;
if( v5->Flink == v5 && !LODWORD(Flink[3].Blink) && !HIDWORD(Flink[3].Blink) )
{
v11 = 1;
v12 = Flink + 4;
v13 = 3i64;
do
{
v9 = 0;
v14 = v12->Flink == 0i64;
v12 = (_LIST_ENTRY *)((char *)v12 + 8);
if( v14 )
v9 = v11;
v11 = v9;
--v13;
}
while( v13 );
}
v10 = Flink->Flink;
if( v9 )
{
if( v10->Blink != Flink || (Blink = Flink->Blink, Blink->Flink != Flink) )
__fastfail(3u);
Blink->Flink = v10;
v10->Blink = Blink;
ExFreePoolWithTag(Flink, 0x74655350u);
}
if( v10 == &PopPowerSettings )
break;
Flink = v10;
}
}
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C23628 + 3000));
PopDecrementPowerSettingPendingUpdates(0);
}Referenced by:
No references.