RtlpGetNormalization
NTSTATUS __stdcall RtlpGetNormalization(UINT64 NormForm, VOID **ppNormalization){
_RTL_NORM_FORM v3;
NTSTATUS result;
int v5;
_RTL_NORMALIZATION *v6;
_RTL_NORMALIZATION *v7;
UINT64 v8;
int NlsSectionPtr;
_DWORD *v10;
_DWORD *v11;
NTSTATUS Tables;
INT64 v13;
INT64 v14;
INT64 v15;
UINT64 FileViewSize;
VOID *SectionPointer;
v3 = (int)NormForm;
if( !ppNormalization )
return -1073741584;
NormalizationList__Lock();
v6 = NormalizationList__Lookup(v3);
if( !v6 )
{
SectionPointer = 0i64;
FileViewSize = 0i64;
v7 = NormalizationList__Lookup((_RTL_NORM_FORM)(v5 ^ 0x100));
if( v7 )
{
SectionPointer = (VOID *)*((_QWORD *)v7 + 1);
FileViewSize = *((_QWORD *)v7 + 2);
}
else
{
v8 = (unsigned int)v3;
LODWORD(v8) = v3 & 0xFFFFFEFF;
NlsSectionPtr = ZwGetNlsSectionPtr(0xCui64, v8, 0i64, &SectionPointer, &FileViewSize, v13, v14, v15);
if( NlsSectionPtr < 0 )
goto LABEL_12;
}
v10 = NormalizationListEntry_Alloc();
v11 = v10;
if( !v10 )
{
NlsSectionPtr = -1073741801;
LABEL_12:
NormalizationList__Unlock();
return NlsSectionPtr;
}
v6 = v10 + 6;
Tables = Normalization__LoadTables(v3, SectionPointer, FileViewSize, v10 + 6);
if( Tables < 0 )
{
ExFreePoolWithTag(v11, 0);
NlsSectionPtr = Tables;
goto LABEL_12;
}
v11[4] = v3;
NormalizationList__InsertTail(v11);
}
NormalizationList__Unlock();
result = 0;
*ppNormalization = v6;
return result;
}Referenced by:
RtlIsNormalizedString
RtlNormalizeString