Normalization__IsNormalized

NTSTATUS __stdcall Normalization__IsNormalized(
        _RTL_NORMALIZATION *pNormalization,
        WCHAR *pszStringIn,
        INT64 cchMaxIn,
        UINT8 *Normalized){
  int v4; 
  WCHAR *v5; 
  _RTL_NORMALIZATION v8; 
  unsigned int v9; 
  __int64 v10; 
  int v11; 
  __int64 v12; 
  int v13; 
  int v14; 
  int v15; 
  int v16; 
  int v17; 
  UINT8 v18; 
  unsigned __int8 v19; 
  unsigned __int8 v20; 
  UINT8 v21; 
  char v22; 
  unsigned __int8 v23; 
  unsigned int v24; 
  NTSTATUS CanCombineWithStartFirstPair; 
  unsigned int v26; 
  NTSTATUS CanCombineWithStartBase; 
  UINT8 *pbLastClass; 
  __int128 v29; 
  _RTL_NORMALIZATION cFirst_4; 
  char pcStartBasePair[12]; 
  UINT8 pbLastFlags; 
  int v33; 
  UINT8 *v34; 

  v34 = Normalized;
  v33 = cchMaxIn;
  v4 = cchMaxIn;
  v5 = pszStringIn;
  if( !pszStringIn )
    return -1073741811;
  *(_QWORD *)((char *)&v29 + 4) = 0i64;
  LOBYTE(v29) = 0;
  *(_DWORD *)pcStartBasePair = 0;
  pbLastFlags = 0;
  *(_QWORD *)&pcStartBasePair[4] = pszStringIn - 1;
  HIDWORD(v29) = 0;
  *(_WORD *)((char *)&v29 + 1) = 0;
  if( (int)cchMaxIn <= 0 )
    goto LABEL_95;
  v8 = pNormalization[7];
  cFirst_4 = v8;
  do
  {
    v9 = *v5;
    if( (int)v9 < v8 )
      goto LABEL_94;
    v10 = *((_QWORD *)pNormalization + 4);
    LOBYTE(v11) = *(_BYTE *)(((unsigned __int64)*v5 >> 7) + v10);
    if( !(_BYTE)v11 || (_BYTE)v11 == 0xFB && *((_BYTE *)pNormalization + 113) )
      goto LABEL_93;
    while( 1 )
    {
      while( 1 )
      {
        while( 1 )
        {
          v12 = (unsigned __int8)v11;
          v11 = (unsigned __int8)v11;
          if( !(_BYTE)v11 )
            goto LABEL_91;
          v13 = v11 - 251;
          if( !v13 )
            goto LABEL_90;
          v14 = v13 - 1;
          if( !v14 )
            return -1073740009;
          v15 = v14 - 1;
          if( !v15 )
            goto LABEL_31;
          v16 = v15 - 1;
          if( v16 )
            break;
          if( v4 <= 1 )
            return -1073740009;
          ++v5;
          v33 = --v4;
          v11 = *v5;
          if( (unsigned __int16)(v11 + 9216) > 0x3FFu )
            return -1073740009;
          v9 = v11 + ((v9 - 55287) << 10);
          LOBYTE(v11) = *(_BYTE *)(((__int64)(int)v9 >> 7) + v10);
        }
        if( v16 != 1 )
        {
          v17 = *(unsigned __int8 *)((v9 & 0x7F) + (v12 << 7) + *((_QWORD *)pNormalization + 5) - 128);
          if( !(_BYTE)v17 )
            goto LABEL_91;
          v18 = v17 & 0xC0;
          v19 = v17 & 0x3F;
          if( (v17 & 0x3F) == 0 || v19 == 63 )
          {
            switch( v17 )
            {
              case 64:
                goto LABEL_89;
              case 127:
LABEL_90:
                if( *((_BYTE *)pNormalization + 113) )
                  goto LABEL_91;
                break;
              case 128:
                goto LABEL_89;
              case 191:
                goto LABEL_31;
              case 192:
                Normalization__GetLastChar(
                  pNormalization,
                  v5,
                  (WCHAR **)&pcStartBasePair[4],
                  (INT64 *)((char *)&v29 + 4),
                  (UINT8 *)&v29,
                  &pbLastFlags,
                  (WCHAR *)v29,
                  *((UINT64 *)&v29 + 1));
                if( ((unsigned __int8)v29 | pbLastFlags) == 0x80
                  && Normalization__CanCombinableCharactersCombine(pNormalization, DWORD1(v29), v9) )
                {
                  goto LABEL_31;
                }
                goto LABEL_89;
              case 255:
                if( !v9 && v4 <= 1 )
                  goto LABEL_95;
                break;
              default:
                goto LABEL_41;
            }
            return -1073740009;
          }
LABEL_41:
          if( (v17 & 0x80) != 0 )
          {
            Normalization__GetLastChar(
              pNormalization,
              v5,
              (WCHAR **)&pcStartBasePair[4],
              (INT64 *)((char *)&v29 + 4),
              (UINT8 *)&v29,
              &pbLastFlags,
              (WCHAR *)v29,
              *((UINT64 *)&v29 + 1));
            v20 = v29;
            if( !(_BYTE)v29 || (_BYTE)v29 == 63 )
            {
              HIDWORD(v29) = DWORD1(v29);
              BYTE2(v29) = v29;
              BYTE1(v29) = pbLastFlags;
              if( ((pbLastFlags - 64) & 0xBF) == 0
                && v18 == 0xC0
                && Normalization__CanCombinableCharactersCombine(pNormalization, DWORD1(v29), v9) )
              {
                goto LABEL_31;
              }
              goto LABEL_64;
            }
            v21 = pbLastFlags;
            if( (pbLastFlags & 0xBF) != 0 )
            {
              if( (unsigned __int8)v29 > v19 )
                goto LABEL_31;
              if( v18 != 0xC0 || (_BYTE)v29 == v19 )
                goto LABEL_63;
              v23 = BYTE2(v29);
              v22 = BYTE1(v29);
              if( (((BYTE2(v29) | BYTE1(v29)) - 64) & 0xBF) != 0
                && (BYTE1(v29) != 64 || BYTE2(v29) && BYTE2(v29) != 63) )
              {
                v24 = HIDWORD(v29);
              }
              else
              {
                v24 = HIDWORD(v29);
                if( Normalization__CanCombinableCharactersCombine(pNormalization, HIDWORD(v29), v9) )
                  goto LABEL_31;
                v22 = BYTE1(v29);
              }
              if( v19 >= v23 || (v22 & 0xBF) != 0 || (unsigned __int8)(v23 - 1) > 0x3Du )
                goto LABEL_63;
              if( v23 == *((_BYTE *)pNormalization + 116) )
              {
                if( v19 >= *((_BYTE *)pNormalization + 114) )
                {
                  if( v19 != *((_BYTE *)pNormalization + 115) )
                  {
LABEL_63:
                    v4 = v33;
LABEL_64:
                    LOBYTE(v29) = v19;
                    pbLastFlags = v18;
                    goto LABEL_92;
                  }
                  goto LABEL_61;
                }
              }
              else if( v23 == *((_BYTE *)pNormalization + 118) && v19 == *((_BYTE *)pNormalization + 117) )
              {
LABEL_61:
                LODWORD(pbLastClass) = v9;
                CanCombineWithStartFirstPair = Normalization__CanCombineWithStartFirstPair(
                                                 pNormalization,
                                                 (INT64 *)pcStartBasePair,
                                                 (INT64 *)&v29 + 1,
                                                 v24,
                                                 (INT64)pbLastClass);
                goto LABEL_62;
              }
              CanCombineWithStartFirstPair = Normalization__CanCombineWithStartBase(
                                               pNormalization,
                                               (INT64 *)&v29 + 1,
                                               v24,
                                               v9);
LABEL_62:
              if( !CanCombineWithStartFirstPair )
                goto LABEL_63;
LABEL_31:
              *v34 = 0;
              return 0;
            }
            DWORD2(v29) = 0;
            *(_DWORD *)pcStartBasePair = 0;
            v26 = DWORD1(v29);
            HIDWORD(v29) = DWORD1(v29);
            if( v18 != 0xC0 )
              goto LABEL_81;
            if( pbLastFlags == 64 )
            {
              if( Normalization__CanCombinableCharactersCombine(pNormalization, DWORD1(v29), v9) )
                goto LABEL_31;
              v26 = HIDWORD(v29);
            }
            if( v20 <= v19 )
            {
LABEL_81:
              BYTE2(v29) = v20;
              BYTE1(v29) = v21;
              goto LABEL_63;
            }
            if( v20 == *((_BYTE *)pNormalization + 116) )
            {
              if( v19 >= *((_BYTE *)pNormalization + 114) )
              {
                if( v19 != *((_BYTE *)pNormalization + 115) )
                  goto LABEL_81;
                goto LABEL_76;
              }
            }
            else if( v20 == *((_BYTE *)pNormalization + 118) && v19 == *((_BYTE *)pNormalization + 117) )
            {
LABEL_76:
              LODWORD(pbLastClass) = v9;
              CanCombineWithStartBase = Normalization__CanCombineWithStartFirstPair(
                                          pNormalization,
                                          (INT64 *)pcStartBasePair,
                                          (INT64 *)&v29 + 1,
                                          v26,
                                          (INT64)pbLastClass);
              goto LABEL_80;
            }
            CanCombineWithStartBase = Normalization__CanCombineWithStartBase(pNormalization, (INT64 *)&v29 + 1, v26, v9);
LABEL_80:
            if( CanCombineWithStartBase )
              goto LABEL_31;
            goto LABEL_81;
          }
          DWORD2(v29) = 0;
LABEL_89:
          HIDWORD(v29) = v9;
          BYTE2(v29) = v19;
          BYTE1(v29) = v18;
          goto LABEL_64;
        }
        if( (int)v9 >= 44032 )
          break;
        if( v4 > 1 && CanComposeHangul(v9, v5[1]) )
          goto LABEL_31;
        if( ((*pNormalization - 13) & 0xFFFFFEFF) != 0 || v9 - 4447 > 1 )
          goto LABEL_24;
LABEL_19:
        LOBYTE(v11) = -5;
      }
      if( (int)v9 < 55204 )
        break;
      if( v9 - 55216 > 0x16 && v9 - 55243 > 0x30 )
        goto LABEL_19;
LABEL_24:
      LOBYTE(v11) = 0;
    }
    if( *((_BYTE *)pNormalization + 112) == 1 || v4 > 1 && CanComposeHangul(v9, v5[1]) )
      goto LABEL_31;
LABEL_91:
    LOBYTE(v29) = 0;
    pbLastFlags = 0;
LABEL_92:
    DWORD1(v29) = v9;
    *(_QWORD *)&pcStartBasePair[4] = v5;
LABEL_93:
    v8 = cFirst_4;
LABEL_94:
    --v4;
    ++v5;
    v33 = v4;
  }
  while( v4 > 0 );
LABEL_95:
  *v34 = 1;
  return 0;
}

Referenced by:

RtlIsNormalizedString