KePrepareToDispatchVirtualProcessor
CHAR __fastcall KePrepareToDispatchVirtualProcessor(CHAR a1, _BYTE *a2, _BYTE *a3, _BYTE *a4, _BYTE *a5, _QWORD *a6){
void **v6;
struct _KPRCB *CurrentPrcb;
int v8;
__int64 v9;
char v10;
char v11;
unsigned __int8 v12;
unsigned __int8 v13;
void *retaddr;
v6 = &retaddr;
CurrentPrcb = KeGetCurrentPrcb();
v8 = KiSpeculationFeatures;
*a2 = 0;
*a3 = 0;
*a4 = 0;
*a5 = 0;
*a6 = 0i64;
_disable();
if( a1 )
{
if( (v8 & 0x100000) == 0 )
{
*a3 = 1;
return(char)v6;
}
v9 = *(_QWORD *)(*(_QWORD *)(*((_QWORD *)CurrentPrcb + 1) + 544i64) + 2528i64);
if( !v9 )
{
*a3 = 1;
LABEL_12:
if( (*((_WORD *)CurrentPrcb + 127) & 2) != 0 )
{
KiUpdateStibpPairing(0i64);
}
else
{
v11 = *((_BYTE *)CurrentPrcb + 248);
if( (v11 & 4) != 0 )
{
__writemsr(0x49u, 1ui64);
*((_BYTE *)CurrentPrcb + 248) &= ~4u;
*a2 = 1;
v11 = *((_BYTE *)CurrentPrcb + 248);
}
if( (v11 & 0x20) != 0 )
{
KiFlushCurrentRsb();
*((_BYTE *)CurrentPrcb + 248) &= ~0x20u;
}
*((_QWORD *)CurrentPrcb + 30) = v9;
}
v12 = *((_BYTE *)CurrentPrcb + 1744);
LOBYTE(v6) = *((_BYTE *)CurrentPrcb + 248);
v13 = *((_BYTE *)CurrentPrcb + 251);
*((_BYTE *)CurrentPrcb + 1745) = v12;
*((_BYTE *)CurrentPrcb + 1746) = (_BYTE)v6;
if( (v8 & 0x2000000) != 0 && (*((_BYTE *)CurrentPrcb + 1747) & 1) != 0 )
v13 = v12;
if( *((_BYTE *)CurrentPrcb + 250) != v13 )
{
LOBYTE(v6) = v13;
*a6 = v13;
*a5 = 1;
*((_BYTE *)CurrentPrcb + 250) = v13;
}
return(char)v6;
}
v10 = *((_BYTE *)CurrentPrcb + 248);
if( (v10 & 8) == 0
&& ((*((_BYTE *)CurrentPrcb + 1747) & 1) == 0 || (v10 & 0x10) == 0)
&& ((v8 & 0x10) == 0 || (v8 & 0x1000) != 0) )
{
*a4 = 1;
goto LABEL_12;
}
}
LOBYTE(v6) = *((_BYTE *)CurrentPrcb + 248);
if( ((unsigned __int8)v6 & 4) != 0 )
{
__writemsr(0x49u, 1ui64);
*((_BYTE *)CurrentPrcb + 248) &= ~4u;
*a2 = 1;
LOBYTE(v6) = *((_BYTE *)CurrentPrcb + 248);
}
if( ((unsigned __int8)v6 & 0x20) != 0 )
{
LOBYTE(v6) = KiFlushCurrentRsb();
*((_BYTE *)CurrentPrcb + 248) &= ~4u;
}
return(char)v6;
}Referenced by:
No references.