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