CmpGetNameControlBlock
CM_NAME_CONTROL_BLOCK *__fastcall CmpGetNameControlBlock(
UNICODE_STRING *NodeName,
CM_COMPONENT_HASH *ComponentHash,
UINT8 *NameUpCase){
CM_COMPONENT_HASH v4;
unsigned int Length;
char v6;
unsigned __int16 v7;
wchar_t *Buffer;
__int64 v9;
UINT16 v10;
__int64 v11;
__int64 v12;
CM_NAME_CONTROL_BLOCK *v13;
bool v14;
unsigned int NameLength;
int v16;
int v17;
unsigned int v18;
size_t v19;
CM_NAME_CONTROL_BLOCK *TransientPoolWithTag;
int v21;
wchar_t *Name;
__int64 v23;
UINT16 v24;
__int64 v25;
int v26;
wchar_t *v28;
unsigned int v29;
int v30;
signed __int64 v31;
unsigned int v32;
int v33;
unsigned int v34;
__int64 v35;
wchar_t v36;
char v37;
unsigned __int16 v38;
bool v39;
v39 = 0;
if( ComponentHash )
v4.Hash = ComponentHash->Hash;
else
v4.Hash = CmpHashUnicodeComponent(NodeName);
Length = NodeName->Length;
v6 = 1;
v37 = 1;
v7 = (unsigned __int16)Length >> 1;
v38 = (unsigned __int16)Length >> 1;
if( Length >> 1 )
{
Buffer = NodeName->Buffer;
v9 = Length >> 1;
do
{
v10 = *Buffer;
if( *Buffer >= 0x61u )
{
if( v10 > 0x7Au )
v10 = NLS_UPCASE(v10);
else
v10 -= 32;
}
if( v10 > 0xFFu )
{
v7 = Length;
v6 = 0;
}
++Buffer;
--v9;
}
while( v9 );
v38 = v7;
v37 = v6;
}
CmpLockNameHashEntryExclusive(v4);
v11 = 0i64;
v12 = *(_QWORD *)(*(&CmpDummyThreadEvent + 99)
+ 16i64
* (((unsigned __int16)(-30045 * (LOWORD(v4.Hash) ^ (v4.Hash >> 9))) ^ (unsigned __int16)((unsigned __int64)(101027 * (v4.Hash ^ (v4.Hash >> 9))) >> 9)) & 0x7FF)
+ 8);
if( v12 )
{
while( 1 )
{
v13 = (CM_NAME_CONTROL_BLOCK *)(v12 - 8);
if( v4.Hash == *(_DWORD *)v12 && (NameLength = v13->NameHash.NameLength, v7 == (_WORD)NameLength) )
{
v16 = *(_DWORD *)v13;
v14 = 1;
if( (*(_DWORD *)v13 & 1) != 0 )
{
v17 = CmpCompareCompressedName(NodeName, v13->NameHash.Name, v38, 2ui64);
v14 = v17 == 0;
v39 = v17 == 0;
if( !v17 )
goto LABEL_20;
v7 = v38;
}
else
{
v28 = NodeName->Buffer;
v29 = NameLength >> 1;
v30 = 0;
if( !(NameLength >> 1) )
{
LABEL_20:
if( (v16 & 0xFFFFFFFE) == -2 )
v13 = 0i64;
else
*(_DWORD *)v13 = v16 + 2;
LABEL_22:
if( !v14 )
{
v6 = v37;
v7 = v38;
break;
}
LABEL_31:
CmpUnlockNameHashEntry(v4);
return v13;
}
v31 = (char *)v13->Name - (char *)v28;
while( 1 )
{
v32 = *v28;
if( v32 >= 0x61 )
v33 = v32 <= 0x7A ? v32 - 32 : NLS_UPCASE(v32);
else
v33 = *v28;
if( v33 != *(wchar_t *)((char *)v28 + v31) )
break;
++v28;
if( ++v30 >= v29 )
{
v14 = 1;
goto LABEL_20;
}
}
v7 = v38;
v14 = 0;
v39 = 0;
}
}
else
{
v14 = v39;
}
v12 = *(_QWORD *)(v12 + 8);
if( !v12 )
goto LABEL_22;
}
}
v18 = v7;
v19 = v7 + 26;
TransientPoolWithTag = (CM_NAME_CONTROL_BLOCK *)CmpAllocateTransientPoolWithTag(1ui64, v19);
v13 = TransientPoolWithTag;
if( TransientPoolWithTag )
{
memset(TransientPoolWithTag, 0i64, v19);
v21 = *(_DWORD *)v13;
if( v6 )
{
*(_DWORD *)v13 = v21 | 1;
if( v18 )
{
Name = v13->NameHash.Name;
v23 = v18;
do
{
v24 = NodeName->Buffer[v11];
if( v24 >= 0x61u )
{
if( v24 > 0x7Au )
LOBYTE(v24) = NLS_UPCASE(v24);
else
LOBYTE(v24) = v24 - 32;
}
*(_BYTE *)Name = v24;
++v11;
Name = (wchar_t *)((char *)Name + 1);
--v23;
}
while( v23 );
}
}
else
{
v34 = v18 >> 1;
*(_DWORD *)v13 = v21 & 0xFFFFFFFE;
if( v34 )
{
v35 = v34;
do
{
v36 = NodeName->Buffer[v11];
if( v36 >= 0x61u )
{
if( v36 <= 0x7Au )
v36 -= 32;
else
v36 = NLS_UPCASE(v36);
}
v13->NameHash.Name[v11++] = v36;
--v35;
}
while( v35 );
}
}
v25 = *(&CmpDummyThreadEvent + 99);
v26 = *(_DWORD *)v13 & 1 | 2;
v13->NameHash.ConvKey = v4;
*(_DWORD *)v13 = v26;
v13->NameHash.NameLength = v38;
v13->NameHash.NextHash = *(_CM_NAME_HASH **)(v25
+ 16i64
* (((unsigned __int16)(-30045 * (LOWORD(v4.Hash) ^ (v4.Hash >> 9))) ^ (unsigned __int16)((unsigned __int64)(101027 * (v4.Hash ^ (v4.Hash >> 9))) >> 9)) & 0x7FF)
+ 8);
*(_QWORD *)(v25
+ 16i64
* (((unsigned __int16)(-30045 * (LOWORD(v4.Hash) ^ (v4.Hash >> 9))) ^ (unsigned __int16)((unsigned __int64)(101027 * (v4.Hash ^ (v4.Hash >> 9))) >> 9)) & 0x7FF)
+ 8) = &v13->8;
goto LABEL_31;
}
CmpUnlockNameHashEntry(v4);
return 0i64;
}Referenced by:
CmRenameKey
CmpCreateKeyControlBlock