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