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