PoRegisterPowerSettingCallback
NTSTATUS __stdcall PoRegisterPowerSettingCallback(
PDEVICE_OBJECT DeviceObject,
LPCGUID SettingGuid,
PPOWER_SETTING_CALLBACK Callback,
PVOID Context,
PVOID *Handle){
GUID *v7;
bool v8;
INT64 v9;
__int64 v10;
char *PoolWithTag;
char *v12;
PDEVICE_OBJECT v13;
GUID v14;
LIST_ENTRY *PowerSettingConfiguration;
__int64 v16;
__int64 v17;
_LIST_ENTRY *Blink;
NTSTATUS v19;
_QWORD *v21;
int v22;
__int64 *v23;
int v24;
int v25;
__int128 *v26;
__int128 v27;
PDEVICE_OBJECT v28;
__int128 v29;
INT64 result[66];
v24 = 0;
v26 = 0i64;
v28 = DeviceObject;
v7 = (GUID *)SettingGuid;
v25 = dword_140C23D0C;
v29 = 0i64;
v8 = 0;
v27 = 0i64;
if( PopStateIsSessionSpecific((GUID *)SettingGuid) )
return -1073741811;
v9 = 0i64;
if( Callback )
{
v10 = *(_QWORD *)&GUID_CONSOLE_DISPLAY_STATE.Data1 - *(_QWORD *)&v7->Data1;
if( *(_QWORD *)&GUID_CONSOLE_DISPLAY_STATE.Data1 == *(_QWORD *)&v7->Data1 )
v10 = *(_QWORD *)GUID_CONSOLE_DISPLAY_STATE.Data4 - *(_QWORD *)v7->Data4;
if( !v10 )
{
memset((INT64)result, 0i64);
WORD1(v27) = 520;
*((_QWORD *)&v27 + 1) = result;
RtlPcToFileName((_CM_KCB_UOW *)Callback);
if( v22 >= 0 )
{
DWORD2(v29) = 16;
*(_QWORD *)&v29 = &v27;
v26 = &v29;
if( (int)EmClientRuleEvaluate(&GUID_EM_PO_CONSOLE_STATE_CHANGE_REMAP_RULE, (__int64)&v26, 1, &v24) >= 0 )
{
v23 = &PopPrimaryDisplayVisibleStateErratum;
if( v24 != 2 )
v23 = 0i64;
v9 = (INT64)v23;
}
}
}
}
ExAcquireFastMutex(&PopSettingLock);
PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, 0x70ui64, 0x74655350ui64);
v12 = PoolWithTag;
if( PoolWithTag )
{
memset((INT64)PoolWithTag, 0i64);
v13 = v28;
*((_DWORD *)v12 + 4) = 1952797520;
v14 = *v7;
*((_QWORD *)v12 + 10) = Callback;
*((_QWORD *)v12 + 11) = Context;
*((_QWORD *)v12 + 12) = v13;
*(GUID *)(v12 + 52) = v14;
if( v9 )
{
PopEnsureErratumSubscribed(v9);
v7 = (GUID *)(v9 + 16);
}
*(GUID *)(v12 + 36) = *v7;
PowerSettingConfiguration = PopFindPowerSettingConfiguration(v7, 0xFFFFFFFFi64);
if( PowerSettingConfiguration )
{
v16 = *(_QWORD *)&v7->Data1 - *(_QWORD *)&GUID_IDLE_BACKGROUND_TASK.Data1;
if( *(_QWORD *)&v7->Data1 == *(_QWORD *)&GUID_IDLE_BACKGROUND_TASK.Data1 )
v16 = *(_QWORD *)v7->Data4 - *(_QWORD *)GUID_IDLE_BACKGROUND_TASK.Data4;
if( !v16 )
goto LABEL_25;
v17 = *(_QWORD *)&v7->Data1 - *(_QWORD *)&GUID_BACKGROUND_TASK_NOTIFICATION.Data1;
if( *(_QWORD *)&v7->Data1 == *(_QWORD *)&GUID_BACKGROUND_TASK_NOTIFICATION.Data1 )
v17 = *(_QWORD *)v7->Data4 - *(_QWORD *)GUID_BACKGROUND_TASK_NOTIFICATION.Data4;
if( !v17 )
LABEL_25:
*((_QWORD *)v12 + 9) = *((_QWORD *)&PowerSettingConfiguration[4].Flink + v25);
Blink = PowerSettingConfiguration[1].Blink;
if( Blink->Flink == &PowerSettingConfiguration[1] )
{
*(_QWORD *)v12 = PowerSettingConfiguration + 1;
*((_QWORD *)v12 + 1) = Blink;
Blink->Flink = (_LIST_ENTRY *)v12;
PowerSettingConfiguration[1].Blink = (_LIST_ENTRY *)v12;
goto LABEL_18;
}
}
else
{
v21 = (_QWORD *)qword_140C22EF8;
if( *(__int64 **)qword_140C22EF8 == &PopRegisteredPowerSettingCallbacks )
{
*(_QWORD *)v12 = &PopRegisteredPowerSettingCallbacks;
*((_QWORD *)v12 + 1) = v21;
*v21 = v12;
qword_140C22EF8 = (__int64)v12;
LABEL_18:
v19 = 0;
v8 = (unsigned int)PopOsInitPhase >= 3;
if( Handle )
*Handle = v12;
goto LABEL_20;
}
}
__fastfail(3u);
}
v19 = -1073741670;
LABEL_20:
KeReleaseGuardedMutex(&PopSettingLock);
if( v8 )
PopSetNotificationWork(0x20ui64);
return v19;
}Referenced by:
CmpInitializeLazyWriters
HvlpRegisterPowerPolicyCallbacks
IoInitSystemPreDrivers
PopEsInit
PopIdleInitAoAcDozeS4Timer
PopInitializePowerSettingCallbacks
PopSetPowerSettingValue
PpmInfoRegisterCallbacks
SSHSupportRegisterPowerSettingCallback
TtmInitCurrentSession