KeSetProcess
NTSTATUS __stdcall KeSetProcess(_EPROCESS *Process){
_KPRCB *CurrentPrcb;
_KWAIT_BLOCK *v3;
_KWAIT_BLOCK *Flink;
_KWAIT_BLOCK *v6;
unsigned __int8 WaitType;
INT64 WaitKey;
_KQUEUE *NotificationQueue;
_LIST_ENTRY *p_WaitListHead;
struct _KPRCB *v11;
__int64 v12;
int SignalState;
_LIST_ENTRY *Blink;
NTSTATUS v15;
_KPRCB *v16;
UINT8 OldIrql;
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
v16 = CurrentPrcb;
KiAcquireKobjectLockSafe(Process);
v3 = (_KWAIT_BLOCK *)((char *)Process + 8);
Flink = (_KWAIT_BLOCK *)*((_QWORD *)Process + 1);
v15 = *((_DWORD *)Process + 1);
*((_DWORD *)Process + 1) = 1;
while( Flink != v3 )
{
v6 = Flink;
Flink = (_KWAIT_BLOCK *)Flink->WaitListEntry.Flink;
WaitType = v6->WaitType;
if( WaitType == 1 )
{
WaitKey = v6->WaitKey;
goto LABEL_6;
}
if( WaitType == 2 )
{
v6->BlockState = 5;
NotificationQueue = v6->NotificationQueue;
v6->WaitListEntry.Flink = 0i64;
p_WaitListHead = &NotificationQueue->Header.WaitListHead;
KeGetCurrentIrql();
__writecr8(2ui64);
v11 = KeGetCurrentPrcb();
v12 = *((_QWORD *)v11 + 1);
KiAcquireKobjectLockSafe(NotificationQueue);
if( p_WaitListHead->Flink == p_WaitListHead
|| NotificationQueue->CurrentCount >= NotificationQueue->MaximumCount
|| *(_KQUEUE **)(v12 + 232) == NotificationQueue && *(_BYTE *)(v12 + 643) == 15
|| !KiWakeQueueWaiter(v11, NotificationQueue, (INT64)v6) )
{
SignalState = NotificationQueue->Header.SignalState;
NotificationQueue->Header.SignalState = SignalState + 1;
Blink = NotificationQueue->EntryListHead.Blink;
if( Blink->Flink != &NotificationQueue->EntryListHead )
__fastfail(3u);
v6->WaitListEntry.Flink = &NotificationQueue->EntryListHead;
v6->WaitListEntry.Blink = Blink;
Blink->Flink = &v6->WaitListEntry;
NotificationQueue->EntryListHead.Blink = &v6->WaitListEntry;
if( !SignalState && p_WaitListHead->Flink != p_WaitListHead )
KiWakeOtherQueueWaiters(v11, NotificationQueue);
}
_InterlockedAnd(&NotificationQueue->Header.Lock, 0xFFFFFF7F);
CurrentPrcb = v16;
}
else
{
WaitKey = 256i64;
LABEL_6:
KiTryUnwaitThread(CurrentPrcb, v6, WaitKey, 0i64);
}
}
*((_QWORD *)Process + 2) = (char *)Process + 8;
v3->WaitListEntry.Flink = &v3->WaitListEntry;
_InterlockedAnd((volatile signed __int32 *)Process, 0xFFFFFF7F);
KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, OldIrql);
return v15;
}Referenced by:
PspRundownSingleProcess