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