KiWaitSatisfyMutant
VOID __stdcall KiWaitSatisfyMutant(_KMUTANT *Mutant, _ETHREAD *Thread, _KPRCB *Prcb){
volatile unsigned __int8 DpcRoutineActive;
unsigned __int8 MutantFlags;
void *v5;
_LIST_ENTRY *p_MutantListEntry;
_LIST_ENTRY *p_MutantListHead;
_LIST_ENTRY *Blink;
int v9;
DpcRoutineActive = 0;
if( Mutant->ApcDisable )
--Thread->Tcb.KernelApcDisable;
if( Prcb->CurrentThread == Thread )
DpcRoutineActive = Prcb->DpcRoutineActive;
v9 = *(_DWORD *)Mutant->gap0;
BYTE2(v9) = DpcRoutineActive;
*(_DWORD *)Mutant->gap0 = v9;
MutantFlags = Mutant->MutantFlags;
Mutant->OwnerThread = Thread;
if( (MutantFlags & 1) != 0 )
{
Mutant->MutantFlags = MutantFlags & 0xFE;
Thread->Tcb.WaitStatus |= 0x80ui64;
MutantFlags = Mutant->MutantFlags;
}
v5 = (void *)((unsigned __int64)Mutant & -(__int64)((MutantFlags & 2) != 0));
p_MutantListEntry = &Mutant->MutantListEntry;
Thread->Tcb.AbWaitObject = v5;
p_MutantListHead = &Thread->Tcb.MutantListHead;
Blink = p_MutantListHead->Blink;
if( Blink->Flink != p_MutantListHead )
__fastfail(3u);
p_MutantListEntry->Flink = p_MutantListHead;
p_MutantListEntry->Blink = Blink;
Blink->Flink = p_MutantListEntry;
p_MutantListHead->Blink = p_MutantListEntry;
}Referenced by:
KeWaitForMultipleObjects
KiTryUnwaitThread
KiWaitSatisfyAny