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.