PopSetPowerSettingValue

NTSTATUS __stdcall PopSetPowerSettingValue(_LPCGUID SettingGuid, VOID *Src){
  int v2; 
  int v3; 
  size_t v4; 
  size_t v5; 
  unsigned int v6; 
  _GUID *v7; 
  _DWORD *v8; 
  VOID **v9; 
  char *v10; 
  _DWORD *v11; 
  NTSTATUS v12; 
  char v13; 
  __int64 v15; 
  __int64 *v16; 
  char v17; 
  __int64 i; 
  bool v19; 
  VOID **v20; 
  signed __int32 v21; 
  _POP_POWER_SETTING_CONFIGURATION *j; 
  VOID **v23; 
  _LIST_ENTRY *ListHead; 
  __int64 *v25; 
  _LIST_ENTRY *v26; 
  __int64 *v27; 
  __int64 *v28; 
  __int64 v29; 
  __int64 **v30; 
  __int64 **v31; 
  __int64 *v32; 
  _LIST_ENTRY *Blink; 
  VOID *MatchingChangeStamp; 
  UINT64 CheckStamp; 
  VOID *v36; 
  VOID *Context; 
  VOID **v38; 
  VOID **PoolWithTag; 
  _POP_POWER_SETTING_CONFIGURATION *PowerSettingConfiguration; 
  _GUID *v41; 
  int v42; 
  VOID *Srca; 

  v42 = v3;
  v41 = *(_GUID **)&SettingGuid;
  v5 = v4;
  v6 = (unsigned int)Src;
  *(_WORD *)((char *)&Context + 1) = 0;
  v7 = *(_GUID **)&SettingGuid;
  LOBYTE(v2) = 0;
  HIDWORD(Context) = v2;
  LODWORD(v38) = 0;
  v8 = 0i64;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, v4, 1952797520i64);
  v9 = PoolWithTag;
  if( !PoolWithTag )
    return -1073741670;
  PopIncrementPowerSettingPendingUpdates(0);
  memmove(PoolWithTag, Srca, v5);
  PopValidatePowerSettingData(v7, v5, PoolWithTag);
  LOBYTE(Context) = PopStateIsSessionSpecific(v7);
  ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C23628 + 3000));
  PowerSettingConfiguration = PopFindPowerSettingConfiguration(v7, v6);
  v10 = (char *)PowerSettingConfiguration;
  if( !PowerSettingConfiguration )
  {
    v23 = ExAllocatePoolWithTag(1ui64, 0x58ui64, 1952797520i64);
    PowerSettingConfiguration = (_POP_POWER_SETTING_CONFIGURATION *)v23;
    v10 = (char *)v23;
    if( !v23 )
    {
      v12 = -1073741670;
      v13 = 0;
      goto LABEL_6;
    }
    memset(v23, 0i64, 0x58u);
    *((_GUID *)v10 + 2) = *v7;
    ListHead = PopGetListHead(v7);
    v25 = (__int64 *)(v10 + 16);
    v26 = ListHead;
    *((_QWORD *)v10 + 3) = v10 + 16;
    *((_QWORD *)v10 + 2) = v10 + 16;
    if( !(_BYTE)Context )
    {
      v27 = (__int64 *)PopRegisteredPowerSettingCallbacks;
      while( v27 != &PopRegisteredPowerSettingCallbacks )
      {
        v28 = v27;
        v27 = (__int64 *)*v27;
        v29 = *(__int64 *)((char *)v28 + 36) - *(_QWORD *)&v7->Data1;
        if( !v29 )
          v29 = *(__int64 *)((char *)v28 + 44) - *(_QWORD *)v7->Data4;
        if( !v29 )
        {
          v30 = (__int64 **)v27[1];
          if( *v30 != v27 )
            goto LABEL_62;
          v31 = (__int64 **)v30[1];
          if( *v31 != (__int64 *)v30 )
            goto LABEL_62;
          v27[1] = (__int64)v31;
          *v31 = v27;
          v32 = (__int64 *)*((_QWORD *)v10 + 3);
          if( (__int64 *)*v32 != v25 )
            goto LABEL_62;
          *v30 = v25;
          v30[1] = v32;
          *v32 = (__int64)v30;
          *((_QWORD *)v10 + 3) = v30;
        }
      }
      v6 = -1;
    }
    *((_DWORD *)v10 + 12) = v6;
    Blink = v26->Blink;
    if( Blink->Flink != v26 )
LABEL_62:
      __fastfail(3u);
    *((_QWORD *)v10 + 1) = Blink;
    *(_QWORD *)v10 = v26;
    Blink->Flink = (_LIST_ENTRY *)v10;
    v26->Blink = (_LIST_ENTRY *)v10;
    BYTE1(Context) = 1;
    if( PopPopPowerSettingSetChangeNotification.Data[0] || PopPopPowerSettingSetChangeNotification.Data[1] )
      BYTE2(Context) = 1;
  }
  v11 = *(_DWORD **)&v10[8 * v42 + 64];
  if( PopArePowerSettingsEqual((__int64)v11, PoolWithTag, v5) )
  {
    LOBYTE(v2) = BYTE4(Context);
    v12 = 0;
  }
  else
  {
    v15 = v42;
    v16 = (__int64 *)(v10 + 64);
    v17 = 0;
    for( i = 0i64; i < 3; ++i )
    {
      if( i != v15 )
      {
        if( !v8 )
        {
          v19 = !PopArePowerSettingsEqual(*v16, PoolWithTag, v5);
          v15 = v42;
          if( !v19 )
          {
            v8 = (_DWORD *)*v16;
            ++*(_DWORD *)*v16;
          }
        }
        if( (_DWORD *)*v16 == v11 )
          v17 = 1;
      }
      ++v16;
    }
    v12 = 0;
    if( v8 )
    {
      v9 = PoolWithTag;
      v13 = 1;
    }
    else
    {
      v20 = ExAllocatePoolWithTag(1ui64, v5 + 12, 1952797520i64);
      v8 = v20;
      if( !v20 )
      {
        LOBYTE(v2) = BYTE4(Context);
        v12 = -1073741670;
        v9 = PoolWithTag;
        v7 = v41;
        v13 = 0;
        goto LABEL_6;
      }
      memset(v20, 0i64, v5 + 12);
      v13 = 1;
      v8[1] = v5;
      *v8 = 1;
      do
        v21 = _InterlockedIncrement((_DWORD *)&WheapErrorSourceTable + 238);
      while( !v21 );
      v9 = PoolWithTag;
      v8[2] = v21;
      memmove(v8 + 3, PoolWithTag, v5);
    }
    if( v11 )
    {
      if( !v17 )
      {
        for( j = (_POP_POWER_SETTING_CONFIGURATION *)*((_QWORD *)PowerSettingConfiguration + 2);
              j != PowerSettingConfiguration + 4;
              j = *(_POP_POWER_SETTING_CONFIGURATION **)j )
        {
          if( *((_DWORD **)j + 9) == v11 )
            *((_QWORD *)j + 9) = 0i64;
        }
      }
      v19 = (*v11)-- == 1;
      if( v19 )
        ExFreePoolWithTag(v11, 0x74655350u);
    }
    LOBYTE(v2) = BYTE4(Context);
    *(_QWORD *)&PowerSettingConfiguration[2 * v42 + 16] = v8;
    if( *(&stru_140C23628 + 441) == v42 && !(_BYTE)Context )
      LOBYTE(v2) = 1;
    if( PowerSettingConfiguration[14] || PowerSettingConfiguration[15] )
    {
      v7 = v41;
      PowerSettingConfiguration[13] |= 1u;
      goto LABEL_6;
    }
    v7 = v41;
  }
  v13 = 0;
LABEL_6:
  KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C23628 + 3000));
  if( BYTE1(Context) )
    PoRegisterPowerSettingCallback(
      0i64,
      v7,
      (INT64)PopTracePowerSettingChange,
      0i64,
      0i64,
      MatchingChangeStamp,
      CheckStamp,
      v36,
      Context,
      v38);
  ExFreePoolWithTag(v9, 0x74655350u);
  if( *(&stru_140C23628 + 228) >= 3u )
  {
    if( BYTE2(Context) )
    {
      LODWORD(CheckStamp) = 0;
      LODWORD(MatchingChangeStamp) = 0;
      ZwUpdateWnfStateData(
        &PopPopPowerSettingSetChangeNotification,
        0i64,
        0i64,
        0i64,
        0i64,
        (UINT64)MatchingChangeStamp,
        CheckStamp);
    }
    if( (_BYTE)v2 )
    {
      PopIncrementPowerSettingPendingUpdates(1u);
      PopSetNotificationWork(0x20ui64);
    }
    if( v13 )
      PopSetNotificationWork(0x80ui64);
  }
  PopDecrementPowerSettingPendingUpdates(0);
  return v12;
}

Referenced by:

PopInitilizeAcDcSettings
PopScanIdleList
PopSetNewPolicyValue
PopSetPowerSettingValueAcDc
PopSetSessionDisplayStatus
PopSetSessionUserStatus