HalpLoadMicrocode
NTSTATUS __stdcall HalpLoadMicrocode(){
INT8 IsMicrosoftCompatibleHvLoaded;
INT64 v1;
INT64 v2;
INT64 v3;
NTSTATUS updated;
CHAR *v5;
unsigned int ActiveProcessorCount;
char v7;
int *v8;
__int64 v9;
unsigned int v10;
INT64 v11;
INT64 v12;
INT64 v13;
UINT64 v15;
_GROUP_AFFINITY Affinity;
_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 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 )
{
if( !*(&CmpDummyThreadEvent + 6881) )
{
updated = PoDisableSleepStates(PoSleepDisableReasonHypervisor, 0xEui64, (VOID **)&v15);
if( updated >= 0 )
*(&CmpDummyThreadEvent + 6881) = 1;
}
}
return updated;
}Referenced by:
No references.