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