CmpGlobalUnlockKeyForWrite
VOID __fastcall CmpGlobalUnlockKeyForWrite(UINT64 a1, PVOID P){
signed __int64 v4;
signed __int64 i;
signed __int64 v6;
_ETHREAD *CurrentThread;
__int64 v8;
_QWORD *v9;
PVOID *v10;
_m_prefetchw((char *)P + 16);
v4 = *((_QWORD *)P + 2);
for( i = v4 - 1; i > 0; i = v4 - 1 )
{
v6 = v4;
v4 = _InterlockedCompareExchange64((volatile signed __int64 *)P + 2, i, v4);
if( v6 == v4 )
return;
}
if( i )
__fastfail(0xEu);
CmpLockKcbExclusive(a1);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)&CmpKeyLockTracker, 0i64);
v8 = _InterlockedDecrement64((volatile signed __int64 *)P + 2);
if( v8 > 0 )
{
ExReleasePushLockEx((UINT64)&CmpKeyLockTracker, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
CmpUnlockKcb(a1);
}
else
{
if( v8 )
__fastfail(0xEu);
v9 = *(_QWORD **)P;
if( *(PVOID *)(*(_QWORD *)P + 8i64) != P || (v10 = (PVOID *)*((_QWORD *)P + 1), *v10 != P) )
__fastfail(3u);
*v10 = v9;
v9[1] = v10;
ExReleasePushLockEx((UINT64)&CmpKeyLockTracker, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
*(_WORD *)(a1 + 8) &= ~0x80u;
CmpUnlockKcb(a1);
CmpDereferenceKeyControlBlock(*((_QWORD *)P + 3));
CmpFreeTransientPoolWithTag(P, 0x33374D43ui64);
}
}Referenced by:
CmpFreeSiloKeyLockEntry