KiWaitSatisfyMutant
VOID __stdcall KiWaitSatisfyMutant(_KMUTANT *Mutant, _ETHREAD *Thread, _KPRCB *Prcb){
char v3;
unsigned __int8 MutantFlags;
unsigned __int64 v5;
_LIST_ENTRY *p_MutantListEntry;
_LIST_ENTRY *v7;
_LIST_ENTRY *Blink;
int LockNV;
v3 = 0;
if( Mutant->ApcDisable )
--*((_WORD *)Thread + 242);
if( *((_ETHREAD **)Prcb + 1) == Thread )
v3 = *((_BYTE *)Prcb + 12586);
LockNV = Mutant->Header.LockNV;
BYTE2(LockNV) = v3;
Mutant->Header.LockNV = LockNV;
MutantFlags = Mutant->MutantFlags;
Mutant->OwnerThread = Thread;
if( (MutantFlags & 1) != 0 )
{
Mutant->MutantFlags = MutantFlags & 0xFE;
*((_QWORD *)Thread + 25) |= 0x80ui64;
MutantFlags = Mutant->MutantFlags;
}
v5 = (unsigned __int64)Mutant & -(__int64)((MutantFlags & 2) != 0);
p_MutantListEntry = &Mutant->MutantListEntry;
*((_QWORD *)Thread + 122) = v5;
v7 = (_LIST_ENTRY *)((char *)Thread + 776);
Blink = v7->Blink;
if( Blink->Flink != v7 )
__fastfail(3u);
p_MutantListEntry->Flink = v7;
p_MutantListEntry->Blink = Blink;
Blink->Flink = p_MutantListEntry;
v7->Blink = p_MutantListEntry;
}Referenced by:
KeWaitForMultipleObjects
KiTryUnwaitThread
KiWaitSatisfyAny