KeWakeWaitChain
VOID __fastcall KeWakeWaitChain(_KWAIT_CHAIN *WaitChain, INT64 BoostIncrement, UINT64 Flags){
_QWORD *Head;
unsigned int v4;
struct _KPRCB *CurrentPrcb;
_QWORD *v6;
_QWORD *v7;
_KWAIT_BLOCK *v8;
_KWAIT_BLOCK *v9;
_LIST_ENTRY *Flink;
_KWAIT_BLOCK *v11;
_LIST_ENTRY *Blink;
unsigned __int8 WaitType;
bool v14;
char v15;
_ADJUST_REASON v16;
_ETHREAD *Thread;
_QWORD *v18;
struct _KPRCB *v19;
_ETHREAD *CurrentThread;
char v21;
int v22;
_KWAIT_BLOCK **QuantumTarget;
_KWAIT_BLOCK *v24;
volatile signed __int32 *v25;
_QWORD *v26;
_QWORD *v27;
UINT8 OldIrql;
char v30;
int v31;
v30 = Flags;
Head = WaitChain->Head;
v31 = 0;
v4 = BoostIncrement;
v27 = WaitChain->Head;
if( WaitChain->Head )
{
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
v6 = Head;
do
{
v7 = v6;
v26 = (_QWORD *)*v6;
v25 = (volatile signed __int32 *)(v6 + 3);
KiAcquireKobjectLockSafe(v6 + 3);
v8 = (_KWAIT_BLOCK *)(v7 + 4);
*((_DWORD *)v7 + 7) = 1;
v9 = (_KWAIT_BLOCK *)v7[4];
while( v9 != v8 )
{
Flink = v9->WaitListEntry.Flink;
v11 = v9;
v9 = (_KWAIT_BLOCK *)Flink;
v24 = (_KWAIT_BLOCK *)Flink;
Blink = v11->WaitListEntry.Blink;
if( (_KWAIT_BLOCK *)Flink->Blink != v11 || (_KWAIT_BLOCK *)Blink->Flink != v11 )
LABEL_6:
__fastfail(3u);
Blink->Flink = Flink;
Flink->Blink = Blink;
WaitType = v11->WaitType;
if( WaitType == 1 )
{
if( KiTryUnwaitThread(CurrentPrcb, v11, v11->WaitKey, 0i64) )
{
v14 = (*((_DWORD *)v7 + 7))-- == 1;
if( v14 )
break;
}
}
else if( WaitType == 2 )
{
v11->BlockState = 5;
Thread = v11->Thread;
v11->WaitListEntry.Flink = 0i64;
v18 = &Thread->Tcb.gap0[8];
KeGetCurrentIrql();
__writecr8(2ui64);
v19 = KeGetCurrentPrcb();
CurrentThread = v19->CurrentThread;
KiAcquireKobjectLockSafe(Thread);
if( (_QWORD *)*v18 == v18
|| LODWORD(Thread->Tcb.InitialStack) >= HIDWORD(Thread->Tcb.InitialStack)
|| (_ETHREAD *)CurrentThread->Tcb.Queue == Thread && CurrentThread->Tcb.WaitReason == 15
|| (KiWakeQueueWaiter(v19, (_KQUEUE *)Thread, (INT64)v11), !v21) )
{
v22 = *(_DWORD *)&Thread->Tcb.gap0[4];
*(_DWORD *)&Thread->Tcb.gap0[4] = v22 + 1;
QuantumTarget = (_KWAIT_BLOCK **)Thread->Tcb.QuantumTarget;
if( *QuantumTarget != (_KWAIT_BLOCK *)&Thread->Tcb.SListFaultAddress )
goto LABEL_6;
v11->WaitListEntry.Flink = (_LIST_ENTRY *)&Thread->Tcb.SListFaultAddress;
v11->WaitListEntry.Blink = (_LIST_ENTRY *)QuantumTarget;
*QuantumTarget = v11;
Thread->Tcb.QuantumTarget = (unsigned __int64)v11;
if( !v22 && (_QWORD *)*v18 != v18 )
KiWakeOtherQueueWaiters(v19, (_KQUEUE *)Thread);
}
_InterlockedAnd((volatile signed __int32 *)Thread, 0xFFFFFF7F);
v14 = (*((_DWORD *)v7 + 7))-- == 1;
if( v14 )
break;
v9 = v24;
}
else
{
KiTryUnwaitThread(CurrentPrcb, v11, 256i64, 0i64);
}
v8 = (_KWAIT_BLOCK *)(v7 + 4);
}
_InterlockedAnd(v25, 0xFFFFFF7F);
v6 = v26;
++v31;
}
while( v26 != v27 );
if( (v30 & 1) != 0 && (KiRemoveBoostThread(CurrentPrcb, CurrentPrcb->CurrentThread), v4) )
{
v16 = AdjustBoost;
if( v15 > (char)v4 )
v4 = v15;
}
else
{
v16 = AdjustUnwait;
}
if( (v30 & 2) != 0 && v16 == AdjustUnwait )
v4 = 1;
KiExitDispatcher(CurrentPrcb, 0i64, v16, v4, OldIrql);
WaitChain->Head = 0i64;
}
}Referenced by:
ExpConvertExclusiveToSharedLite
ExpConvertFastResourceExclusiveToShared
ExpReleaseDisownedFastResourceExclusive
ExpReleaseDisownedFastResourceShared
ExpReleaseFastResourceExclusive
ExpReleaseFastResourceShared
VrpRelinquishDiffHiveEntryTransitionOwner