KiInitializeMutant

VOID __stdcall KiInitializeMutant(_KMUTANT *Mutant, UINT8 InitialOwner, UINT8 DisableCount){
  char v3; 
  char v5; 
  unsigned __int8 v7; 
  _ETHREAD *CurrentThread; 
  unsigned __int8 CurrentIrql; 
  _LIST_ENTRY *v10; 
  _LIST_ENTRY *p_MutantListEntry; 
  __int64 v12; 
  UINT64 SpinCount; 
  UINT8 v14; 
  v14 = DisableCount;
  *(_OWORD *)&Mutant->Header.Lock = 0i64;
  v5 = v3;
  *(_OWORD *)&Mutant->Header.WaitListHead.Blink = 0i64;
  *(_OWORD *)&Mutant->MutantListEntry.Blink = 0i64;
  *(_QWORD *)&Mutant->MutantFlags = 0i64;
  Mutant->Header.Type = 2;
  if( InitialOwner )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    Mutant->OwnerThread = CurrentThread;
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)CurrentThread + 16, 0i64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *((_QWORD *)CurrentThread + 8) );
    }
    v10 = (_LIST_ENTRY *)*((_QWORD *)CurrentThread + 98);
    p_MutantListEntry = &Mutant->MutantListEntry;
    if( v10->Flink != (_LIST_ENTRY *)((char *)CurrentThread + 776) )
      __fastfail(3u);
    p_MutantListEntry->Flink = (_LIST_ENTRY *)((char *)CurrentThread + 776);
    Mutant->MutantListEntry.Blink = v10;
    v10->Flink = p_MutantListEntry;
    *((_QWORD *)CurrentThread + 98) = p_MutantListEntry;
    KiReleaseThreadLockSafe((INT64)CurrentThread);
    __writecr8(CurrentIrql);
  }
  else
  {
    Mutant->Header.SignalState = 1;
  }
  v7 = v14;
  Mutant->Header.WaitListHead.Blink = &Mutant->Header.WaitListHead;
  Mutant->Header.WaitListHead.Flink = &Mutant->Header.WaitListHead;
  Mutant->MutantFlags &= ~1u;
  Mutant->ApcDisable = v7;
  if( (v5 & 1) != 0 )
  {
    Mutant->MutantFlags |= 2u;
    if( InitialOwner )
    {
      LODWORD(v12) = KeAbPreAcquire(Mutant, 0i64, 1ui64);
      if( v12 )
        *(_BYTE *)(v12 + 26) |= 1u;
    }
  }
}

Referenced by:

EtwpInitializeRegistration
ExpProfileInitialization
KeInitializeMutant
KeInitializeMutantEx
KeInitializeMutex
LdrpInitMuiCrits
PnpInitializeDeviceEvents
ViInitSystemPhase0
sub_140A5D438