RtlIpv6StringToAddressW
NTSTATUS __stdcall RtlIpv6StringToAddressW(WCHAR *S, WCHAR **Terminator, in6_addr *Addr){
wint_t v3;
WCHAR *v4;
int v5;
WCHAR *v7;
int v8;
char v9;
unsigned int v10;
unsigned int v11;
unsigned int v12;
unsigned int v13;
int v15;
__int16 v16;
unsigned int v17;
unsigned int v18;
WCHAR *v19;
char v20;
int v22;
v3 = *S;
v20 = 0;
v4 = 0i64;
v19 = 0i64;
v5 = 0;
v22 = 0;
v7 = S;
v8 = 0;
v9 = 0;
v10 = 0;
v11 = 0;
v12 = 0;
v13 = 0;
while( *v7 )
{
if( v8 && v8 == 1 )
{
if( v3 < 0x80u )
{
if( iswctype(v3, 4u) )
{
++v12;
goto LABEL_54;
}
if( iswctype(v3, 0x80u) )
{
v4 = v19;
++v12;
if( v11 )
break;
v9 = 1;
v20 = 1;
goto LABEL_24;
}
v9 = v20;
}
if( v3 != 58 )
{
if( v3 != 46 || v9 || v11 > 2 )
goto LABEL_8;
v4 = v19;
if( v10 > 6 )
break;
++v11;
v8 = 0;
goto LABEL_42;
}
if( v11 || v10 > 6 )
{
LABEL_8:
v4 = v19;
break;
}
if( v7[1] == 58 )
{
if( v13 )
goto LABEL_8;
v15 = 2;
++v7;
v8 = 2;
v13 = v10 + 1;
}
else
{
v8 = 0;
v15 = 1;
}
v10 += v15;
v4 = v19;
}
else
{
if( v3 == 58 )
{
if( v11 || v10 || v7[1] != 58 )
goto LABEL_8;
v10 = 2;
v13 = 1;
v22 = v5 + 1;
++v7;
v8 = 2;
Addr->u.Word[v5] = 0;
v4 = v19;
goto LABEL_42;
}
if( v10 > 7 || v3 >= 0x80u )
goto LABEL_8;
if( iswctype(v3, 4u) )
{
v4 = v7;
v20 = 0;
v8 = 1;
v19 = v7;
v12 = 1;
v9 = 0;
goto LABEL_24;
}
if( !iswctype(v3, 0x80u) || v11 )
goto LABEL_8;
v9 = 1;
v8 = 1;
v4 = v7;
v20 = 1;
v19 = v7;
v12 = 1;
}
if( v8 == 1 )
goto LABEL_24;
LABEL_42:
if( !v4 )
goto LABEL_24;
if( v11 )
{
if( v12 > 3 )
return -1073741811;
v17 = wcstol(v4, 0i64, 10i64);
if( v17 > 0xFF )
return -1073741811;
Addr->u.Byte[2 * v22 - 1 + v11] = v17;
LABEL_54:
v9 = v20;
v4 = v19;
LABEL_24:
v5 = v22;
goto LABEL_25;
}
if( v12 > 4 )
return -1073741811;
v16 = wcstol(v4, 0i64, 16i64);
v9 = v20;
Addr->u.Word[v22] = __ROR2__(v16, 8);
v5 = v22 + 1;
v4 = v19;
++v22;
LABEL_25:
v3 = *++v7;
}
*Terminator = v7;
if( v11 )
{
if( v11 != 3 )
return -1073741811;
++v10;
}
if( !v13 && v10 != 7 )
return -1073741811;
if( v8 != 1 )
{
if( v8 == 2 )
{
Addr->u.Word[v22] = 0;
goto LABEL_66;
}
return -1073741811;
}
if( v11 )
{
if( v12 <= 3 )
{
v18 = wcstol(v4, 0i64, 10i64);
if( v18 <= 0xFF )
{
Addr->u.Byte[2 * v22 + v11] = v18;
goto LABEL_66;
}
}
return -1073741811;
}
if( v12 > 4 )
return -1073741811;
Addr->u.Word[v22] = __ROR2__(wcstol(v4, 0i64, 16i64), 8);
LABEL_66:
if( v13 )
{
memmove((char *)&Addr[1] + 2 * (v13 - v10), (char *)Addr + 2 * v13, 2 * (v10 - v13));
memset((char *)Addr + 2 * v13, 0i64, 2 * (8 - v10));
}
return 0;
}Referenced by:
RtlIpv6StringToAddressExW