KxStartUserThread

VOID __stdcall KxStartUserThread(
        INT64 a1,
        INT64 a2,
        INT64 a3,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8,
        INT64 a9){
  __int64 v9; 
  INT64 v10; 
  INT64 v11; 
  INT64 v12; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v14; 
  INT64 v15; 
  INT64 v16; 
  unsigned __int8 BpbUserSpecCtrl; 
  unsigned __int8 v18; 
  __int64 v21; 
  __int64 v22; 
  void(__fastcall *v23)(__int64, __int64, INT64, INT64); 
  CHAR v24; 
  void *retaddr; 
  __int16 v26; 
  int v27; 
  void *v28; 
  __int16 v29; 

  if( (_BYTE)KeSmapEnabled )
    __stac();
  __writecr8(1ui64);
  v23(v22, v21, a3, a4);
  _disable();
  if( (*(_BYTE *)(v9 + 240) & 1) == 0 )
  {
    _mm_setcsr(*(_DWORD *)(v9 - 84));
    __iretq(retaddr, v26, v27, v28, v29);
  }
  if( (_BYTE)KeSmapEnabled )
    __stac();
  while( (KeGetCurrentThread()->ApcState.UserApcPendingAll & 3) != 0 )
  {
    __writecr8(1ui64);
    _enable();
    KiInitiateUserApc((_KTRAP_FRAME *)1);
    _disable();
    __writecr8(0i64);
  }
  if( (*((_BYTE *)&KeGetPcr()->Prcb.2 + 14) & 2) != 0 )
    KiUpdateStibpPairing(0i64);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( (*(_DWORD *)CurrentThread->Tcb.gap0 & 0x8000000) != 0 )
    KiRestoreSetContextState((INT64)CurrentThread, v10, v11, v12, v24);
  v14 = (_ETHREAD *)KeGetCurrentThread();
  if( (*(_DWORD *)v14->Tcb.gap0 & 0x40010000) != 0 )
  {
    if( (v14->Tcb.gap0[2] & 1) != 0 )
    {
      KiCopyCounters(&v14->Tcb);
      v14 = (_ETHREAD *)KeGetCurrentThread();
    }
    if( (v14->Tcb.gap0[3] & 0x40) != 0 )
      KiUmsExit(1);
  }
  _mm_setcsr(*(_DWORD *)(v9 - 84));
  if( *(_WORD *)(v9 + 128) )
    KiRestoreDebugRegisterState();
  v15 = *(_QWORD *)(v9 - 48);
  v16 = *(_QWORD *)(v9 - 56);
  __writegsbyte(0x853u, 0);
  BpbUserSpecCtrl = KeGetPcr()->Prcb.BpbUserSpecCtrl;
  if( KeGetPcr()->Prcb.BpbCurrentSpecCtrl != BpbUserSpecCtrl )
  {
    __writegsbyte(0x27Au, BpbUserSpecCtrl);
    __writemsr(0x48u, BpbUserSpecCtrl);
  }
  v18 = _bittestandreset16(MK_FP(__GS__, 632i64), 2u);
  if( v18 )
    __writemsr(0x49u, 1ui64);
  v18 = _bittestandreset16(MK_FP(__GS__, 632i64), 5u);
  if( v18 )
    __flush_rsb();
  if( (KiKvaShadow & 1) == 0 )
  {
    __swapgs();
    __iretq(retaddr, v26, v27, v28, v29);
  }
  KiKernelExit(*(_QWORD *)(v9 - 72), *(_QWORD *)(v9 - 64), v16, v15, a5);
}

Referenced by:

KyStartUserThread