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