KiSwapToUmsThreadContinue

VOID __stdcall KiSwapToUmsThreadContinue(){
  _ETHREAD *CurrentThread; 
  void *Object; 
  int v2; 
  _KQUEUE *v3; 
  unsigned __int8 CurrentIrql; 
  _DISPATCHER_HEADER *Queue; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  Object = CurrentThread->Tcb.WaitBlock[3].Object;
  v2 = *((_DWORD *)Object + 20);
  if( (v2 & 2) == 0 )
  {
    *((_DWORD *)Object + 20) = v2 | 2;
    CurrentThread->Tcb._bf_0 = ~(*((_DWORD *)CurrentThread->Tcb.WaitBlock[3].SparePtr + 18) << 16) & 0x10000 | CurrentThread->Tcb._bf_0 & 0xFFFEFFFF;
    v3 = (_KQUEUE *)*((_QWORD *)Object + 4);
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    Queue = CurrentThread->Tcb.Queue;
    if( v3 != (_KQUEUE *)Queue )
      KiSwitchQueue(&CurrentThread->Tcb, v3, Queue);
    KeInsertQueue(v3, *((_LIST_ENTRY **)Object + 5));
    __writecr8(CurrentIrql);
  }
  KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}

Referenced by:

KeSynchronizeUmsThread
KiUmsCallEntryContinue
KiUmsTrapEntryContinue