Normalization__Normalize

NTSTATUS __stdcall Normalization__Normalize(
        _RTL_NORMALIZATION *pNormalization,
        WCHAR *pszStringIn,
        UINT64 cchIn,
        WCHAR *pszStringOut,
        UINT64 cchOut,
        INT64 *pcchOut){
  __int64 v7; 
  NTSTATUS v10; 
  _RTL_NORMALIZATION v11; 
  INT64 v12; 
  UINT8 v13; 
  unsigned int v14; 
  __int64 v15; 
  NTSTATUS v16; 
  int v17; 
  int v18; 
  int v19; 
  _RTL_NORM_BUFFER pNormBuffer[32]; 

  v7 = (int)cchIn;
  memset(pNormBuffer, 0i64, 0x78u);
  if( !pszStringIn || !pszStringOut || !pcchOut )
    return -1073741811;
  pNormBuffer[14] = 0;
  LOWORD(pNormBuffer[18]) = 0;
  pNormBuffer[22] = 0;
  LOWORD(pNormBuffer[23]) = 0;
  *(_DWORD *)pcchOut = 0;
  *(_QWORD *)&pNormBuffer[2] = &pszStringIn[v7];
  v10 = 0;
  pNormBuffer[12] = cchOut;
  *(_QWORD *)pNormBuffer = pszStringIn;
  *(_QWORD *)&pNormBuffer[16] = pszStringOut - 1;
  pNormBuffer[13] = v7;
  *(_QWORD *)&pNormBuffer[6] = pszStringOut;
  *(_QWORD *)&pNormBuffer[8] = &pszStringOut[(int)cchOut];
  *(_QWORD *)&pNormBuffer[10] = pszStringOut;
  *(_QWORD *)&pNormBuffer[4] = pszStringIn;
  *(_QWORD *)&pNormBuffer[20] = pszStringOut;
  *(_QWORD *)&pNormBuffer[28] = pNormalization;
  while( pszStringIn != *(WCHAR **)&pNormBuffer[2] )
  {
    if( v10 )
      goto LABEL_17;
    v11 = *pszStringIn;
    v12 = *pszStringIn;
    *(_QWORD *)&pNormBuffer[4] = pszStringIn + 1;
    if( v11 < pNormalization[7]
      || (v13 = *(_BYTE *)(((unsigned __int64)(unsigned int)v11 >> 7) + *((_QWORD *)pNormalization + 4))) == 0
      || v13 == 0xFB && *((_BYTE *)pNormalization + 113) )
    {
      if( !NormBuffer__Append(pNormBuffer, v12) )
      {
        pszStringIn = *(WCHAR **)&pNormBuffer[4];
        v10 = -1073741789;
        break;
      }
    }
    else
    {
      v10 = Normalization__NormalizeCharacter(pNormalization, v12, v13, pNormBuffer);
    }
    pszStringIn = *(WCHAR **)&pNormBuffer[4];
  }
  if( !v10 )
  {
    pszStringIn = (WCHAR *)((__int64)(*(_QWORD *)&pNormBuffer[10] - *(_QWORD *)&pNormBuffer[6]) >> 1);
    goto LABEL_24;
  }
LABEL_17:
  if( v10 == -1073741789 )
  {
    v14 = ((__int64)(*(_QWORD *)&pNormBuffer[2] - (_QWORD)pszStringIn) >> 1) + 1;
    v15 = ((__int64)pszStringIn - *(_QWORD *)pNormBuffer) >> 1;
    if( !(_DWORD)v15 )
      LODWORD(v15) = 1;
    v16 = Normalization__GuessCharCountBySize(pNormalization, v14);
    v19 = v18 * v17 / (int)v15;
    if( v19 <= v16 )
      v19 = v16;
    LODWORD(pszStringIn) = v17 + v19 + (v19 >> 3);
  }
  else
  {
    LODWORD(pszStringIn) = (((__int64)pszStringIn - *(_QWORD *)pNormBuffer) >> 1) - 1;
  }
LABEL_24:
  *(_DWORD *)pcchOut = (_DWORD)pszStringIn;
  return v10;
}

Referenced by:

RtlpNormalizeStringWorker