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