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