RtlpIdnToUnicodeWorker
INT64 __fastcall RtlpIdnToUnicodeWorker(
INT64 a1,
const WCHAR *a2,
INT64 a3,
INT64 a4,
INT64 *a5,
WCHAR *pOutput,
UINT8 Normalized){
UINT8 *v7;
const WCHAR *v8;
char v9;
INT64 *v10;
WCHAR *v11;
INT64 v12;
WCHAR v13;
INT64 result;
int v15;
int v16;
WCHAR *v17;
__int64 v18;
int v19;
UINT8 *v20;
__int64 i;
WCHAR v22;
__int64 j;
WCHAR *pOutputEmailAt;
size_t pcchLength;
INT64 v26;
v26 = a4;
v7 = (UINT8 *)a4;
pOutputEmailAt = 0i64;
v8 = a2;
Normalized = 0;
v9 = a1;
if( !a2 )
return 3221225485i64;
v10 = a5;
if( !a5 || *(int *)a5 < 0 || (int)a3 < -1 || *(int *)a5 > 0 && !a4 )
return 3221225485i64;
if( (a1 & 0xFFFFFFF0) != 0 )
return 3221225485i64;
if( (_DWORD)a3 == -1 )
{
pcchLength = 0i64;
if( RtlStringCchLengthW(a2, 0x203ui64, &pcchLength) < 0 )
return 3221227286i64;
LODWORD(a3) = pcchLength + 1;
}
v11 = pOutput;
v12 = (unsigned int)(a3 - 1);
LODWORD(pcchLength) = 511;
v13 = v8[(int)a3 - 1];
if( v13 )
v12 = (unsigned int)a3;
result = punycode_decode(
v8,
v12,
pOutput,
(INT64 *)&pcchLength,
(v9 & 4) != 0,
(v9 & 2) != 0,
&Normalized,
(const WCHAR **)&pOutputEmailAt);
if( (int)result < 0 )
return result;
if( !v13 )
{
v15 = pcchLength;
if( (int)pcchLength < 511 )
{
v11[(int)pcchLength] = 0;
v16 = v15 + 1;
goto LABEL_18;
}
return 3221227286i64;
}
v16 = pcchLength;
LABEL_18:
if( (v9 & 8) != 0 || Normalized )
goto LABEL_40;
Normalized = 0;
v17 = pOutputEmailAt;
if( (v9 & 4) != 0 && ((int)RtlIsNormalizedString(1ui64, v11, pOutputEmailAt - v11, &Normalized) < 0 || !Normalized) )
return 3221227286i64;
v18 = v17 - v11;
if( v18 >= v16 - (v13 == 0) )
goto LABEL_40;
v19 = v16 - (2 - (v13 != 0)) - v18;
v20 = IdnaMemAlloc(v19);
if( !v20 )
return 3221225495i64;
if( v19 > 0 )
{
for( i = 0i64; i < v19; ++i )
{
v22 = v17[i + 1];
if( (unsigned __int16)(v22 - 65) <= 0x19u )
{
v17[i + 1] = v22 + 32;
v20[i] = 1;
}
}
}
if( (int)RtlIsNormalizedString(((unsigned __int8)((v9 & 1) == 0) << 8) + 13, v17 + 1, (unsigned int)v19, &Normalized) < 0
|| !Normalized )
{
ExFreePoolWithTag(v20, 0);
return 3221227286i64;
}
if( v19 > 0 )
{
for( j = 0i64; j < v19; ++j )
{
if( v20[j] == 1 )
v17[j + 1] -= 32;
}
}
ExFreePoolWithTag(v20, 0);
v11 = pOutput;
v7 = (UINT8 *)v26;
LABEL_40:
if( v7 && *(_DWORD *)v10 )
{
if( v16 > *(_DWORD *)v10 )
return 3221225507i64;
memmove(v7, (UINT8 *)v11, 2i64 * v16);
}
*(_DWORD *)v10 = v16;
return 0i64;
}Referenced by:
RtlIdnToUnicode