CmpDereferenceNameControlBlockWithLock

VOID __stdcall CmpDereferenceNameControlBlockWithLock(CM_NAME_CONTROL_BLOCK *Ncb){
  $533BCE97EB349AB3A98C5D3EE0BD182B *v1; 
  unsigned int v3; 
  __int64 v4; 
  unsigned int v5; 
  $533BCE97EB349AB3A98C5D3EE0BD182B **p_NextHash; 
  $533BCE97EB349AB3A98C5D3EE0BD182B *v7; 

  v1 = &Ncb->8;
  v3 = 101027 * (Ncb->NameHash.ConvKey.Hash ^ (Ncb->NameHash.ConvKey.Hash >> 9));
  v4 = 16i64 * (((unsigned __int16)v3 ^ (unsigned __int16)((unsigned __int64)v3 >> 9)) & 0x7FF);
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(v4 + *(&CmpDummyThreadEvent + 99)), 0i64);
  v5 = *(_DWORD *)Ncb & 1 | (2 * (*(_DWORD *)Ncb >> 1) - 2);
  *(_DWORD *)Ncb = v5;
  if( v5 < 2 )
  {
    p_NextHash = ($533BCE97EB349AB3A98C5D3EE0BD182B **)(v4 + *(&CmpDummyThreadEvent + 99) + 8i64);
    if( p_NextHash )
    {
      do
      {
        v7 = *p_NextHash;
        if( !*p_NextHash )
          break;
        if( v7 == v1 )
        {
          *p_NextHash = ($533BCE97EB349AB3A98C5D3EE0BD182B *)v7->NameHash.NextHash;
          break;
        }
        p_NextHash = ($533BCE97EB349AB3A98C5D3EE0BD182B **)&v7->NameHash.NextHash;
      }
      while( v7 != ($533BCE97EB349AB3A98C5D3EE0BD182B *)-8i64 );
    }
    CmpFreeTransientPoolWithTag(Ncb, 0x624E4D43ui64);
  }
  ExReleasePushLockEx(v4 + *(&CmpDummyThreadEvent + 198), 0);
}

Referenced by:

CmRenameKey
CmpCleanUpKcbCacheWithLock
CmpCloneToUnbackedKcb
CmpCreateKeyControlBlock