CmpDereferenceNameControlBlockWithLock
void __fastcall CmpDereferenceNameControlBlockWithLock(unsigned int *a1){
unsigned int *v1;
unsigned int v3;
__int64 v4;
unsigned int v5;
__int64 *v6;
__int64 v7;
v1 = a1 + 2;
v3 = 101027 * (a1[2] ^ (a1[2] >> 9));
v4 = 16i64 * (((unsigned __int16)v3 ^ (unsigned __int16)((unsigned __int64)v3 >> 9)) & 0x7FF);
ExAcquirePushLockExclusiveEx((UINT64)CmpNameCacheTable + v4, 0i64);
v5 = *a1 & 1 | (2 * (*a1 >> 1) - 2);
*a1 = v5;
if( v5 < 2 )
{
v6 = (__int64 *)((char *)CmpNameCacheTable + v4 + 8);
if( v6 )
{
do
{
v7 = *v6;
if( !*v6 )
break;
if( (unsigned int *)v7 == v1 )
{
*v6 = *(_QWORD *)(v7 + 8);
break;
}
v6 = (__int64 *)(v7 + 8);
}
while( v7 != -8 );
}
CmpFreeTransientPoolWithTag(a1, 0x624E4D43ui64);
}
ExReleasePushLockEx((UINT64)CmpNameCacheTable + v4, 0i64);
}Referenced by:
CmRenameKey
CmpCleanUpKcbCacheWithLock
CmpCloneToUnbackedKcb
CmpCreateKeyControlBlock