RtlpGetNormalization
INT64 __stdcall RtlpGetNormalization(UINT64 NormForm, PVOID *ppNormalization){
unsigned int v3;
INT64 result;
INT64 v5;
VOID **v6;
VOID **v7;
UINT64 v8;
NTSTATUS NlsSectionPtr;
CHAR *v10;
CHAR *v11;
int Tables;
__int128 SectionSize;
v3 = NormForm;
if( !ppNormalization )
return 3221225712i64;
NormalizationList__Lock();
v6 = NormalizationList__Lookup(v3);
if( !v6 )
{
LODWORD(v5) = v5 ^ 0x100;
SectionSize = 0ui64;
v7 = NormalizationList__Lookup(v5);
if( v7 )
{
*((_QWORD *)&SectionSize + 1) = v7[1];
*(_QWORD *)&SectionSize = v7[2];
}
else
{
v8 = v3;
LODWORD(v8) = v3 & 0xFFFFFEFF;
NlsSectionPtr = ZwGetNlsSectionPtr(0xCui64, v8, 0i64, (PVOID *)&SectionSize + 1, (UINT64 *)&SectionSize);
if( NlsSectionPtr < 0 )
goto LABEL_12;
}
v10 = NormalizationListEntry_Alloc();
v11 = v10;
if( !v10 )
{
NlsSectionPtr = -1073741801;
LABEL_12:
NormalizationList__Unlock();
return(unsigned int)NlsSectionPtr;
}
v6 = (VOID **)(v10 + 24);
Tables = Normalization__LoadTables(v3, *((UINT16 **)&SectionSize + 1), SectionSize, (INT64)(v10 + 24));
if( Tables < 0 )
{
ExFreePoolWithTag(v11, 0);
NlsSectionPtr = Tables;
goto LABEL_12;
}
*((_DWORD *)v11 + 4) = v3;
NormalizationList__InsertTail((PVOID **)v11);
}
NormalizationList__Unlock();
result = 0i64;
*ppNormalization = v6;
return result;
}Referenced by:
RtlIsNormalizedString
RtlNormalizeString