punycode_encode
NTSTATUS __stdcall punycode_encode(
WCHAR *pInput,
INT64 inputLength,
WCHAR *pOutput,
INT64 *poutputBufferLength,
UINT8 bAllowEmail,
UINT8 bUseStd3Rules){
WCHAR *v6;
INT64 *v7;
WCHAR *v8;
WCHAR *v9;
WCHAR *v10;
WCHAR *v11;
__int64 v12;
unsigned int v13;
WCHAR *v14;
UINT8 v15;
WCHAR *v16;
WCHAR *LabelEnd;
WCHAR *v18;
WCHAR *v19;
__int16 v20;
WCHAR *v21;
WCHAR *v22;
NTSTATUS v23;
int v24;
WCHAR *i;
WCHAR v26;
__int64 v27;
WCHAR *j;
int v29;
int v30;
int k;
int v32;
wchar_t *v33;
NTSTATUS UTF32;
__int64 v35;
__int64 v36;
wchar_t *v37;
unsigned int m;
NTSTATUS v39;
int v40;
int v41;
int v42;
int n;
int v44;
int v45;
int v46;
__int16 v47;
__int16 v48;
NTSTATUS v49;
__int64 v50;
WCHAR *v51;
NTSTATUS result;
UINT64 dwFlags;
int v54;
WCHAR *v55;
wchar_t *Str2;
NTSTATUS Str2a;
WCHAR *v58;
WCHAR *v59;
WCHAR *v61;
__int64 v62;
int v64;
WCHAR *ppszDestEnd;
INT64 *v66;
v66 = poutputBufferLength;
ppszDestEnd = pOutput;
v6 = pOutput;
v7 = poutputBufferLength;
v61 = pOutput;
v8 = pInput;
v9 = pInput;
v10 = pOutput;
v11 = &pInput[(int)inputLength];
v12 = *(int *)poutputBufferLength;
v13 = 0;
v59 = v11;
v14 = &pOutput[v12];
v55 = v14;
if( (int)inputLength > 0 )
{
v15 = bAllowEmail;
v16 = pOutput;
if( pInput >= v11 )
{
LABEL_82:
v18 = v16;
v51 = v16;
if( v15 )
goto LABEL_93;
}
else
{
v58 = pOutput;
while( 1 )
{
LabelEnd = FindLabelEnd(v9, v11, v15);
v21 = LabelEnd;
if( LabelEnd == v9 )
break;
v13 = 0;
if( !v15 && bUseStd3Rules && (*v9 == v20 || LabelEnd > v8 && *(LabelEnd - 1) == v20) )
goto LABEL_89;
LODWORD(dwFlags) = 0;
v22 = L"xl--";
if( !v15 )
v22 = (WCHAR *)L"xn--";
Str2 = v22;
v23 = RtlStringCchCopyNExW(v6, v14 - v6, v22, 4ui64, &ppszDestEnd, 0i64, dwFlags);
v13 = 0;
if( v23 < 0 )
{
LABEL_85:
result = -1073741789;
goto LABEL_90;
}
v6 = ppszDestEnd;
v24 = 0;
for( i = v9; i < v21; ++i )
{
v26 = *i;
if( *i >= 0x80u )
{
if( (unsigned __int16)(v26 + 10240) <= 0x3FFu )
++i;
}
else
{
if( !v15 && (bUseStd3Rules != (_BYTE)v13 && !ValidateStd3Range(v26) || v26 < 0x20u || v26 == 127) || !v26 )
goto LABEL_89;
if( v6 >= v14 )
goto LABEL_85;
if( !v15 && (unsigned __int16)(v26 - 65) <= 0x19u )
v26 += 32;
*v6++ = v26;
ppszDestEnd = v6;
++v24;
}
}
v27 = v21 - v9;
v62 = v27;
if( v24 == v27 )
{
v6 -= 4;
for( j = v16; j < v6; ++j )
*j = j[4];
ppszDestEnd = v6;
}
else
{
if( (__int64)(((char *)v59 - (char *)v9) & 0xFFFFFFFFFFFFFFFEui64) >= 8 )
{
v29 = wcsnicmp(v9, Str2, 4u);
v13 = 0;
if( !v29 )
goto LABEL_89;
}
v30 = v13;
v64 = v13;
if( v24 > 0 )
{
if( v6 >= v55 )
goto LABEL_85;
*v6++ = 45;
ppszDestEnd = v6;
}
v54 = 72;
for( k = 128; v24 < v27; k = v32 + 1 )
{
v32 = 0x7FFFFFF;
v33 = v9;
if( v9 < v21 )
{
do
{
UTF32 = GetUTF32(v33);
if( UTF32 >= k && UTF32 < v32 )
v32 = UTF32;
v36 = 4i64;
if( UTF32 < 0x10000 )
v36 = 2i64;
v33 = (wchar_t *)(v36 + v35);
}
while( v33 < v21 );
v27 = v62;
v30 = v64;
}
v37 = v9;
for( m = (v32 - k) * (v24 - v30 + 1) + v13; v37 < v21; v37 = (wchar_t *)((char *)v37 + v50) )
{
v39 = GetUTF32(v37);
v41 = v40 + 1;
Str2a = v39;
if( v39 >= v32 )
v41 = v40;
m = v41;
if( v39 == v32 )
{
v42 = v41;
for( n = 36; ; n += 36 )
{
if( n > v54 )
v44 = n < v54 + 26 ? n - v54 : 26;
else
v44 = 1;
if( v42 < v44 )
break;
if( v6 >= v55 )
goto LABEL_84;
v45 = (v42 - v44) % (36 - v44);
v42 = (v42 - v44) / (36 - v44);
v46 = v45 + v44;
v47 = 22;
if( v46 <= 25 )
v47 = 97;
*v6++ = v46 + v47;
}
if( v6 >= v55 )
{
LABEL_84:
v13 = 0;
goto LABEL_85;
}
v48 = 22;
if( v42 <= 25 )
v48 = 97;
*v6++ = v42 + v48;
ppszDestEnd = v6;
v49 = adapt(m, (unsigned int)(v24 - v64 + 1));
v30 = v64;
m = 0;
++v24;
v54 = v49;
v39 = Str2a;
if( v32 >= 0x10000 )
{
++v24;
v30 = ++v64;
}
}
else
{
v30 = v64;
}
v50 = 4i64;
if( v39 < 0x10000 )
v50 = 2i64;
}
v13 = m + 1;
}
v16 = v58;
v13 = 0;
}
if( !v15 && (__int64)(((char *)v6 - (char *)v16) & 0xFFFFFFFFFFFFFFFEui64) > 126 )
goto LABEL_89;
v11 = v59;
v14 = v55;
if( v21 != v59 )
{
if( v6 >= v55 )
goto LABEL_85;
*v6++ = *v21;
ppszDestEnd = v6;
if( v15 )
{
if( *v21 == 64 )
{
v15 = v13;
v61 = v6;
}
}
}
v8 = pInput;
v58 = v6;
v9 = v21 + 1;
v16 = v6;
if( v21 >= v59 )
{
v10 = pOutput;
v7 = v66;
goto LABEL_82;
}
}
if( v15 || LabelEnd != v19 )
goto LABEL_88;
v10 = pOutput;
v7 = v66;
}
v51 = v18;
if( v18 - v61 > 255i64 - (*(v6 - 1) != 46) )
{
LABEL_88:
v13 = 0;
goto LABEL_89;
}
LABEL_93:
if( *(v6 - 1) != 64 )
{
*(_DWORD *)v7 = v51 - v10;
return 0;
}
goto LABEL_88;
}
LABEL_89:
result = -1073740010;
LABEL_90:
*(_DWORD *)v66 = v13;
return result;
}Referenced by:
RtlpNameprepAsciiRealWorker