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