RtlIpv6AddressToStringW
WCHAR *__stdcall RtlIpv6AddressToStringW(in6_addr *Addr, WCHAR *S, INT64 a3, INT64 a4){
unsigned int v4;
WCHAR *v5;
WCHAR *v6;
int v8;
int v9;
int v10;
int v11;
__int64 i;
__int64 v13;
int v14;
__int64 v15;
int v16;
__int64 v17;
__int64 v18;
int v19;
int v21;
int v22;
int v23;
int v24;
USHORT v25;
USHORT v26;
int v27;
const char *v28;
int v29;
v4 = 8;
v5 = S + 46;
v6 = S;
if( !*(_DWORD *)Addr->u.Byte && !Addr->u.Word[2] && !Addr->u.Word[3] && Addr->u.Word[6] )
{
v25 = Addr->u.Word[4];
if( v25 )
{
if( v25 == 0xFFFF && !Addr->u.Word[5] )
{
v29 = swprintf_s(
S,
0x2Eui64,
(WCHAR *)L"::ffff:0:%u.%u.%u.%u",
Addr->u.Byte[12],
Addr->u.Byte[13],
Addr->u.Byte[14],
Addr->u.Byte[15]);
return &v6[v29];
}
}
else
{
v26 = Addr->u.Word[5];
if( ((v26 + 1) & 0xFFFE) == 0 )
{
v27 = Addr->u.Byte[14];
v28 = &File;
if( v26 )
v28 = "ffff:";
v29 = swprintf_s(
S,
0x2Eui64,
(WCHAR *)L"::%hs%u.%u.%u.%u",
v28,
Addr->u.Byte[12],
Addr->u.Byte[13],
v27,
Addr->u.Byte[15]);
return &v6[v29];
}
}
}
v8 = 0;
v9 = 0;
v10 = 0;
if( (Addr->u.Word[4] & 0xFFFD) == 0 && Addr->u.Word[5] == 0xFE5E )
v4 = 6;
v11 = 0;
for( i = 0i64; i < v4; ++i )
{
v13 = (unsigned int)(v11 + 1);
if( Addr->u.Word[i] )
{
v10 = v11 + 1;
}
else
{
v21 = v8 - v9;
v22 = v11 - v10 + 1;
v23 = v10;
if( v22 <= v8 - v9 )
v23 = v9;
v9 = v23;
v24 = v13;
if( v22 <= v21 )
v24 = v8;
v8 = v24;
}
v11 = v13;
}
v14 = 0;
if( v8 - v9 > 1 )
v14 = v8;
v15 = v14;
v16 = 0;
if( v8 - v9 > 1 )
v16 = v9;
v17 = 0i64;
v18 = v16;
do
{
if( v17 >= v15 || v18 > v17 )
{
if( v17 && v17 != v15 )
v6 += (int)swprintf_s(v6, v5 - v6, (WCHAR *)L":", v13);
v19 = swprintf_s(v6, v5 - v6, (WCHAR *)L"%x", (unsigned __int16)__ROR2__(Addr->u.Word[v17], 8));
}
else
{
v19 = swprintf_s(v6, v5 - v6, (WCHAR *)L"::", v13);
v17 = v15 - 1;
}
++v17;
v6 += v19;
}
while( v17 < v4 );
if( v4 < 8 )
v6 += (int)swprintf_s(
v6,
v5 - v6,
(WCHAR *)L":%u.%u.%u.%u",
Addr->u.Byte[12],
Addr->u.Byte[13],
Addr->u.Byte[14],
Addr->u.Byte[15]);
return v6;
}Referenced by:
AdtpBuildIPv6Strings
RtlIpv6AddressToStringExW