PoThermalCounterSetCallback
INT64 __stdcall PoThermalCounterSetCallback(PCW_CALLBACK_TYPE Type, PCW_CALLBACK_INFORMATION *Info, PVOID Context){
int Counters;
char v6;
struct _PCW_BUFFER *Buffer;
DEVICE_OBJECT *i;
DEVICE_OBJECT *DeviceAttachmentBaseRefWithTag;
DEVICE_OBJECT *v10;
const UNICODE_STRING *v11;
wchar_t *v12;
signed __int64 v13;
int v14;
int v15;
ULONG v16;
struct _PCW_DATA Data;
UINT64 v19[2];
*(_OWORD *)v19 = 0i64;
Counters = 0;
v6 = 0;
PopAcquireRwLockShared((UINT64)&PopPolicyDeviceLock);
if( Type == PcwCallbackEnumerateInstances )
{
Buffer = Info->EnumerateInstances.Buffer;
LABEL_6:
v6 = 1;
goto LABEL_7;
}
if( Type != PcwCallbackCollectData )
goto LABEL_27;
Buffer = Info->EnumerateInstances.Buffer;
if( wcspbrk(Info->AddCounter.InstanceMask->Buffer, (PWCHAR)L"*?", 1u) )
goto LABEL_6;
LABEL_7:
for( i = (DEVICE_OBJECT *)PopThermal; i != (DEVICE_OBJECT *)&PopThermal; i = *(DEVICE_OBJECT **)i )
{
if( (*((_BYTE *)i + 65) & 2) != 0 )
{
DeviceAttachmentBaseRefWithTag = IoGetDeviceAttachmentBaseRefWithTag(*((DEVICE_OBJECT **)i + 6), 0x6D546F50ui64);
v10 = DeviceAttachmentBaseRefWithTag;
if( DeviceAttachmentBaseRefWithTag )
v11 = *(const UNICODE_STRING **)(*((_QWORD *)DeviceAttachmentBaseRefWithTag + 39) + 40i64);
else
v11 = 0i64;
if( v11 )
{
if( v6 )
goto LABEL_19;
v12 = Info->AddCounter.InstanceMask->Buffer;
v13 = (char *)v11[8].Buffer - (char *)v12;
do
{
v14 = *(wchar_t *)((char *)v12 + v13);
v15 = *v12 - v14;
if( v15 )
break;
++v12;
}
while( v14 );
if( !v15 )
{
LABEL_19:
*(_OWORD *)v19 = 0i64;
if( Type == PcwCallbackCollectData )
{
Counters = PopThermalReadCounters((INT64)i, Info->AddCounter.CounterMask, v19);
if( Counters < 0 )
{
ObfDereferenceObjectWithTag(v10, 0x6D546F50ui64);
break;
}
}
v16 = *((_DWORD *)i + 124);
Data.Data = v19;
Data.Size = 16;
Counters = PcwAddInstance(Buffer, v11 + 8, v16, 1u, &Data);
}
ObfDereferenceObjectWithTag(v10, 0x6D546F50ui64);
if( Counters < 0 )
break;
}
else
{
ObfDereferenceObjectWithTag(DeviceAttachmentBaseRefWithTag, 0x6D546F50ui64);
}
}
}
LABEL_27:
PopReleaseRwLock((UINT64)&PopPolicyDeviceLock);
return(unsigned int)Counters;
}Referenced by:
No references.