KiCallUserMode

VOID __fastcall KiCallUserMode(VOID **OutputBuffer, UINT64 *OutputLength, VOID *NewInitialStack, VOID *NewStackBase){
  __int64 v4; 
  __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  __int128 v12; 
  __int128 v13; 
  __int128 v14; 
  __int128 v15; 
  __int128 v16; 
  __int128 v17; 
  __int128 v18; 
  __int128 v19; 
  __int128 v20; 
  __int128 v21; 
  _ETHREAD *CurrentThread; 
  _KTRAP_FRAME *TrapFrame; 
  char *v24; 
  _KTRAP_FRAME *v25; 
  void *InstrumentationCallback; 
  unsigned __int8 BpbUserSpecCtrl; 
  unsigned __int8 v28; 
  _KTRAP_FRAME *__shifted(_KTRAP_FRAME,0x80) v31; 
  __int64 v32; 
  __int128 v33; 
  __int128 v34; 
  __int128 v35; 
  __int128 v36; 
  __int128 v37; 
  __int128 v38; 
  __int128 v39; 
  __int128 v40; 
  __int128 v41; 
  __int128 v42; 
  _KTRAP_FRAME *v43; 
  VOID **v44; 
  UINT64 *v45; 
  __int64 v46; 
  __int64 v47; 
  __int64 v48; 
  __int64 v49; 
  __int64 v50; 
  __int64 v51; 
  __int64 v52; 
  __int64 v53; 
  void *retaddr; 

  v33 = v12;
  v34 = v13;
  v35 = v14;
  v36 = v15;
  v37 = v16;
  v38 = v17;
  v39 = v18;
  v40 = v19;
  v41 = v20;
  v42 = v21;
  v46 = v5;
  v47 = v4;
  v48 = v6;
  v49 = v7;
  v50 = v8;
  v51 = v9;
  v52 = v10;
  v53 = v11;
  v44 = OutputBuffer;
  v45 = OutputLength;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  *((_QWORD *)NewInitialStack + 4) = &v32;
  TrapFrame = CurrentThread->Tcb.TrapFrame;
  v43 = TrapFrame;
  _disable();
  CurrentThread->Tcb.InitialStack = NewInitialStack;
  CurrentThread->Tcb.StackBase = NewStackBase;
  if( (KiKvaShadow & 1) != 0 )
    __writegsqword(0x9008u, (unsigned __int64)NewInitialStack);
  else
    *(_QWORD *)((char *)KeGetPcr()->NtTib.StackBase + 4) = NewInitialStack;
  v24 = (char *)NewStackBase - (unsigned int)KeKernelStackSize;
  __writegsqword(0x1A8u, (unsigned __int64)NewInitialStack);
  CurrentThread->Tcb.StackLimit = v24;
  qmemcpy(&retaddr, TrapFrame, 0x190ui64);
  v25 = TrapFrame + 1;
  if( (CurrentThread->Tcb.ApcState.UserApcPendingAll & 3) != 0
    || (*(_DWORD *)CurrentThread->Tcb.gap0 & 0x48010000) != 0
    || (*((_BYTE *)&KeGetPcr()->Prcb.2 + 14) & 2) != 0 )
  {
    v31 = KeGetTrapFrame();
    ADJ(v31)->SegCs = 51;
    ADJ(v31)->_Rip = (unsigned __int64)KeUserCallbackDispatcher;
    JUMPOUT(0x14040D900i64);
  }
  _mm_setcsr(v25[-1]._MxCsr);
  if( (CurrentThread->Tcb.gap0[3] & 3) != 0 )
  {
    KiRestoreDebugRegisterState();
    InstrumentationCallback = CurrentThread->Tcb.ApcState.Process->Pcb.InstrumentationCallback;
    if( !InstrumentationCallback )
      InstrumentationCallback = KeUserCallbackDispatcher;
  }
  else
  {
    InstrumentationCallback = KeUserCallbackDispatcher;
  }
  __writegsbyte(0x853u, 0);
  BpbUserSpecCtrl = KeGetPcr()->Prcb.BpbUserSpecCtrl;
  if( KeGetPcr()->Prcb.BpbCurrentSpecCtrl != BpbUserSpecCtrl )
  {
    __writegsbyte(0x27Au, BpbUserSpecCtrl);
    __writemsr(0x48u, BpbUserSpecCtrl);
  }
  v28 = _bittestandreset16(MK_FP(__GS__, 632i64), 2u);
  if( v28 )
    __writemsr(0x49u, 1ui64);
  v28 = _bittestandreset16(MK_FP(__GS__, 632i64), 5u);
  if( v28 )
    __flush_rsb();
  if( (KiKvaShadow & 1) == 0 )
  {
    __swapgs();
    __sysretq(InstrumentationCallback, *(_QWORD *)&v25[-1].EFlags);
  }
  KiKernelSysretExit(InstrumentationCallback);
}

Referenced by:

KeUserModeCallback