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.