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