HalpLoadMicrocode
INT64 __stdcall HalpLoadMicrocode(){
bool IsMicrosoftCompatibleHvLoaded;
_QWORD *v1;
INT64 v2;
INT64 v3;
int updated;
CHAR *v5;
unsigned int ActiveProcessorCount;
char v7;
int *v8;
__int64 v9;
unsigned int v10;
INT64 v11;
INT64 v12;
INT64 v13;
UINT64 v15;
struct _GROUP_AFFINITY Affinity;
struct _GROUP_AFFINITY PreviousAffinity;
LODWORD(v15) = 0;
Affinity = 0i64;
PreviousAffinity = 0i64;
IsMicrosoftCompatibleHvLoaded = HalpIsMicrosoftCompatibleHvLoaded();
updated = HalpMcUpdateInitialize(0i64, v1);
if( updated < 0 )
goto LABEL_22;
if( IsMicrosoftCompatibleHvLoaded && qword_140C4A2F8 )
{
v5 = HalpMcExportAllData(&v15, 0i64, NonPagedPoolNx);
if( v5 )
{
updated = qword_140C4A2F8(v5, (unsigned int)v15);
ExFreePoolWithTag(v5, 0x206C6148u);
}
else
{
updated = -1073741801;
}
HalpUnloadMicrocode();
}
else
{
updated = HalpMcUpdateLock(v3, v2);
if( updated < 0 )
{
LABEL_22:
HalpMcUpdateInitialize(0i64, 0i64);
return(unsigned int)updated;
}
ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
v7 = 0;
if( ActiveProcessorCount )
{
v8 = KiProcessorIndexToNumberMappingTable;
v9 = ActiveProcessorCount;
do
{
v10 = *v8;
Affinity.Reserved[1] = 0;
Affinity.Reserved[2] = 0;
*(_DWORD *)&Affinity.Group = (unsigned __int16)(v10 >> 6);
Affinity.Mask = 1i64 << (v10 & 0x3F);
if( v7 )
{
KeSetSystemGroupAffinityThread(&Affinity, 0i64);
}
else
{
KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
v7 = 1;
}
HalpMcUpdateMicrocode(v12, v11, v13);
++v8;
--v9;
}
while( v9 );
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
}
HalpMcUpdateUnlock();
}
if( updated < 0 )
goto LABEL_22;
if( IsMicrosoftCompatibleHvLoaded && !HalMcSleepDisabled )
{
updated = PoDisableSleepStates(1i64, 14i64, (CHAR **)&v15);
if( updated >= 0 )
HalMcSleepDisabled = 1;
}
return(unsigned int)updated;
}Referenced by:
No references.