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