KeSetProcess
VOID __stdcall KeSetProcess(){
_QWORD *v0;
_QWORD *v1;
_KPRCB *CurrentPrcb;
_KWAIT_BLOCK *v3;
_KWAIT_BLOCK *Flink;
_KWAIT_BLOCK *v5;
unsigned __int8 WaitType;
INT64 WaitKey;
_ETHREAD *Thread;
_QWORD *v9;
struct _KPRCB *v10;
_ETHREAD *CurrentThread;
int v12;
_KWAIT_BLOCK **QuantumTarget;
char v14;
_KPRCB *v15;
UINT8 OldIrql;
v1 = v0;
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
v15 = CurrentPrcb;
KiAcquireKobjectLockSafe(v0);
v3 = (_KWAIT_BLOCK *)(v1 + 1);
Flink = (_KWAIT_BLOCK *)v1[1];
*((_DWORD *)v1 + 1) = 1;
while( Flink != v3 )
{
v5 = Flink;
Flink = (_KWAIT_BLOCK *)Flink->WaitListEntry.Flink;
WaitType = v5->WaitType;
if( WaitType == 1 )
{
WaitKey = v5->WaitKey;
goto LABEL_6;
}
if( WaitType == 2 )
{
v5->BlockState = 5;
Thread = v5->Thread;
v5->WaitListEntry.Flink = 0i64;
v9 = &Thread->Tcb.gap0[8];
KeGetCurrentIrql();
__writecr8(2ui64);
v10 = KeGetCurrentPrcb();
CurrentThread = v10->CurrentThread;
KiAcquireKobjectLockSafe(Thread);
if( (_QWORD *)*v9 == v9
|| LODWORD(Thread->Tcb.InitialStack) >= HIDWORD(Thread->Tcb.InitialStack)
|| (_ETHREAD *)CurrentThread->Tcb.Queue == Thread && CurrentThread->Tcb.WaitReason == 15
|| (KiWakeQueueWaiter(v10, (_KQUEUE *)Thread, (INT64)v5), !v14) )
{
v12 = *(_DWORD *)&Thread->Tcb.gap0[4];
*(_DWORD *)&Thread->Tcb.gap0[4] = v12 + 1;
QuantumTarget = (_KWAIT_BLOCK **)Thread->Tcb.QuantumTarget;
if( *QuantumTarget != (_KWAIT_BLOCK *)&Thread->Tcb.SListFaultAddress )
__fastfail(3u);
v5->WaitListEntry.Flink = (_LIST_ENTRY *)&Thread->Tcb.SListFaultAddress;
v5->WaitListEntry.Blink = (_LIST_ENTRY *)QuantumTarget;
*QuantumTarget = v5;
Thread->Tcb.QuantumTarget = (unsigned __int64)v5;
if( !v12 && (_QWORD *)*v9 != v9 )
KiWakeOtherQueueWaiters(v10, (_KQUEUE *)Thread);
}
_InterlockedAnd((volatile signed __int32 *)Thread, 0xFFFFFF7F);
CurrentPrcb = v15;
}
else
{
WaitKey = 256i64;
LABEL_6:
KiTryUnwaitThread(CurrentPrcb, v5, WaitKey, 0i64);
}
}
v1[2] = v1 + 1;
v3->WaitListEntry.Flink = &v3->WaitListEntry;
_InterlockedAnd((volatile signed __int32 *)v1, 0xFFFFFF7F);
KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, OldIrql);
}Referenced by:
PspRundownSingleProcess