CmLockKeyForWrite
__int64 __fastcall CmLockKeyForWrite(__int64 a1){
_QWORD *SiloKeyLockEntry;
_EJOB *CurrentSilo;
UINT64 v4;
int v5;
_ETHREAD *CurrentThread;
ULONG_PTR v7;
UINT64 v8;
_QWORD *v9;
_QWORD *i;
_ETHREAD *v11;
UINT64 v12;
_QWORD *v13;
UINT64 j;
ULONG_PTR BugCheckParameter2;
INT64 v17;
SiloKeyLockEntry = 0i64;
v17 = 0i64;
CurrentSilo = PsGetCurrentSilo();
BugCheckParameter2 = 0i64;
PsGetPermanentSiloContext(CurrentSilo, *(unsigned int *)CmpSiloContextSlot, (PVOID *)&BugCheckParameter2);
if( !BugCheckParameter2 )
return(unsigned int)-1073741637;
CmpLockRegistry();
v4 = *(_QWORD *)(a1 + 8);
CmpLockKcbExclusive(v4);
v5 = CmpPerformKeyBodyDeletionCheck(a1, 0i64);
if( v5 < 0 )
goto LABEL_23;
if( *(_QWORD *)(v4 + 32) == CmpMasterHive )
{
v5 = -1073741811;
goto LABEL_23;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v7 = BugCheckParameter2;
ExAcquirePushLockSharedEx(BugCheckParameter2, 0i64);
v5 = CmpPerformSiloKeyLockTrackerEnabledCheck(v7);
if( v5 < 0 )
goto LABEL_22;
v9 = (_QWORD *)(v7 + 16);
for( i = *(_QWORD **)(v7 + 16); i != v9; i = (_QWORD *)*i )
{
if( i[2] == v4 )
{
v5 = 0;
goto LABEL_22;
}
}
ExReleasePushLockEx(v8, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
SiloKeyLockEntry = CmpCreateSiloKeyLockEntry((volatile INT64 *)v4);
if( SiloKeyLockEntry )
{
v5 = CmpGlobalLockKeyForWrite(v4, &v17);
if( v5 < 0 )
goto LABEL_23;
SiloKeyLockEntry[3] = v17;
v11 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v11 + 242);
v7 = BugCheckParameter2;
ExAcquirePushLockExclusiveEx(BugCheckParameter2, 0i64);
v5 = CmpPerformSiloKeyLockTrackerEnabledCheck(v7);
if( v5 >= 0 )
{
v13 = (_QWORD *)v9[1];
if( (_QWORD *)*v13 != v9 )
__fastfail(3u);
*SiloKeyLockEntry = v9;
SiloKeyLockEntry[1] = v13;
*v13 = SiloKeyLockEntry;
v9[1] = SiloKeyLockEntry;
ExReleasePushLockEx(v12, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
CmpUnlockKcb(v4);
for( j = *(_QWORD *)(v4 + 72); *(_QWORD *)(j + 32) != CmpMasterHive; j = *(_QWORD *)(j + 72) )
{
CmpLockKcbExclusive(j);
*(_WORD *)(j + 8) |= 0x100u;
CmpUnlockKcb(j);
}
v5 = 0;
goto LABEL_17;
}
LABEL_22:
ExReleasePushLockEx(v7, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
goto LABEL_23;
}
v5 = -1073741670;
LABEL_23:
CmpUnlockKcb(v4);
if( SiloKeyLockEntry )
CmpFreeSiloKeyLockEntry(SiloKeyLockEntry);
LABEL_17:
CmpUnlockRegistry();
return(unsigned int)v5;
}Referenced by:
NtLockRegistryKey