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.