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