RtlpHashStringToAtom

NTSTATUS __stdcall RtlpHashStringToAtom(
        _RTL_ATOM_TABLE *p,
        WCHAR *Name,
        UINT8 Lookup,
        _RTL_ATOM_TABLE_ENTRY ***PreviousAtom,
        UINT64 *NameLength,
        _RTL_ATOM_TABLE_REFERENCE **pLowBox,
        _RTL_ATOM_TABLE_ENTRY **pAtomEntry){
  _RTL_ATOM_TABLE_ENTRY **j; 
  UINT16 v12; 
  WCHAR *v13; 
  unsigned int i; 
  int v15; 
  __int64 v16; 
  __int64 v17; 
  _RTL_ATOM_TABLE_ENTRY *v18; 
  _RTL_ATOM_TABLE_REFERENCE *LowBox; 

  j = 0i64;
  if( ((unsigned __int64)Name & 0xFFFFFFFFFFFF0000ui64) != 0 )
  {
    v12 = *Name;
    v13 = Name;
    for( i = 0; *v13; i += v15 )
    {
      ++v13;
      if( v12 >= 0x61u )
      {
        if( v12 > 0x7Au )
          v12 = NLS_UPCASE(v12);
        else
          v12 -= 32;
      }
      v15 = v12 + (v12 >> 1) + 2 * v12;
      v12 = *v13;
    }
    v16 = v13 - Name;
    if( (unsigned int)v16 > 0xFF )
    {
      v18 = 0i64;
    }
    else
    {
      v17 = i % p->NumberOfBuckets;
      v18 = p->Buckets[v17];
      for( j = &p->Buckets[(unsigned int)v17]; v18; v18 = v18->HashLink )
      {
        if( v18->NameLength == (_DWORD)v16 && !wcsicmp(v18->Name, Name) )
          break;
        j = &v18->HashLink;
      }
    }
    if( PreviousAtom )
      *PreviousAtom = j;
    if( !v18 )
    {
      if( NameLength )
        *(_DWORD *)NameLength = 2 * v16;
      goto LABEL_19;
    }
  }
  else
  {
    v18 = 0i64;
    if( (unsigned __int16)Name >= 0xC000u )
      v18 = RtlpAtomMapAtomToHandleEntry(p, (unsigned __int16)Name & 0x3FFF);
    if( PreviousAtom )
      *PreviousAtom = 0i64;
    if( !v18 )
      goto LABEL_19;
  }
  if( !pLowBox )
  {
LABEL_19:
    *pAtomEntry = v18;
    return 0;
  }
  LowBox = RtlpLookupOrCreateLowBox(p, v18, Lookup);
  if( LowBox )
  {
    *pLowBox = LowBox;
    goto LABEL_19;
  }
  return -1073741801;
}

Referenced by:

RtlAddAtomToAtomTableEx
RtlLookupAtomInAtomTable
RtlpFreeAllAtom