KiInitializeMutant
VOID __stdcall KiInitializeMutant(_KMUTANT *Mutant, UINT8 InitialOwner, UINT8 DisableCount){
char v3;
char v5;
unsigned __int8 v7;
_ETHREAD *CurrentThread;
unsigned __int8 CurrentIrql;
_LIST_ENTRY *Blink;
_LIST_ENTRY *p_MutantListEntry;
_BYTE *v12;
UINT64 SpinCount;
UINT8 v14;
v14 = DisableCount;
*(_OWORD *)Mutant->gap0 = 0i64;
v5 = v3;
*(_OWORD *)&Mutant->gap0[16] = 0i64;
*(_OWORD *)&Mutant->MutantListEntry.Blink = 0i64;
*(_QWORD *)&Mutant->MutantFlags = 0i64;
Mutant->gap0[0] = 2;
if( InitialOwner )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Mutant->OwnerThread = CurrentThread;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentThread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( CurrentThread->Tcb.ThreadLock );
}
Blink = CurrentThread->Tcb.MutantListHead.Blink;
p_MutantListEntry = &Mutant->MutantListEntry;
if( Blink->Flink != &CurrentThread->Tcb.MutantListHead )
__fastfail(3u);
p_MutantListEntry->Flink = &CurrentThread->Tcb.MutantListHead;
Mutant->MutantListEntry.Blink = Blink;
Blink->Flink = p_MutantListEntry;
CurrentThread->Tcb.MutantListHead.Blink = p_MutantListEntry;
KiReleaseThreadLockSafe((INT64)CurrentThread);
__writecr8(CurrentIrql);
}
else
{
*(_DWORD *)&Mutant->gap0[4] = 1;
}
v7 = v14;
*(_QWORD *)&Mutant->gap0[16] = &Mutant->gap0[8];
*(_QWORD *)&Mutant->gap0[8] = &Mutant->gap0[8];
Mutant->MutantFlags &= ~1u;
Mutant->ApcDisable = v7;
if( (v5 & 1) != 0 )
{
Mutant->MutantFlags |= 2u;
if( InitialOwner )
{
v12 = KeAbPreAcquire(Mutant, 0i64, 1ui64);
if( v12 )
v12[26] |= 1u;
}
}
}Referenced by:
EtwpInitializeRegistration
ExpProfileInitialization
KeInitializeMutant
KeInitializeMutantEx
KeInitializeMutex
LdrpInitMuiCrits
PnpInitializeDeviceEvents
ViInitSystemPhase0
sub_140A5D438