RtlIpv6AddressToStringA
PSTR __stdcall RtlIpv6AddressToStringA(in6_addr *Addr, PSTR S){
unsigned int v2;
PSTR v3;
INT8 *v4;
int v6;
int v7;
int v8;
int v9;
__int64 i;
int v11;
int v12;
int v13;
int v14;
int v15;
int v16;
__int64 v17;
int v18;
__int64 v19;
__int64 v20;
int v21;
USHORT v23;
int v24;
v2 = 8;
v3 = S + 46;
v4 = S;
if( *(_DWORD *)Addr->u.Byte || Addr->u.Word[2] || Addr->u.Word[3] || !Addr->u.Word[6] )
goto LABEL_5;
v23 = Addr->u.Word[4];
if( v23 )
{
if( v23 == 0xFFFF && !Addr->u.Word[5] )
{
v24 = sprintf_s(S, 0x2Eui64, (INT8 *)"::ffff:0:%u.%u.%u.%u");
return &v4[v24];
}
}
else if( ((Addr->u.Word[5] + 1) & 0xFFFE) == 0 )
{
v24 = sprintf_s(S, 0x2Eui64, (INT8 *)"::%hs%u.%u.%u.%u");
return &v4[v24];
}
LABEL_5:
v6 = 0;
v7 = 0;
v8 = 0;
if( (Addr->u.Word[4] & 0xFFFD) == 0 && Addr->u.Word[5] == 0xFE5E )
v2 = 6;
v9 = 0;
for( i = 0i64; i < v2; ++i )
{
v11 = v9 + 1;
if( Addr->u.Word[i] )
{
v8 = v9 + 1;
}
else
{
v12 = v6 - v7;
v13 = v9 - v8 + 1;
v14 = v8;
if( v13 <= v6 - v7 )
v14 = v7;
v7 = v14;
v15 = v11;
if( v13 <= v12 )
v15 = v6;
v6 = v15;
}
v9 = v11;
}
v16 = 0;
if( v6 - v7 > 1 )
v16 = v6;
v17 = v16;
v18 = 0;
if( v6 - v7 > 1 )
v18 = v7;
v19 = 0i64;
v20 = v18;
do
{
if( v19 >= v17 || v20 > v19 )
{
if( v19 && v19 != v17 )
v4 += (int)sprintf_s(v4, v3 - v4, (INT8 *)":");
v21 = sprintf_s(v4, v3 - v4, (INT8 *)"%x");
}
else
{
v21 = sprintf_s(v4, v3 - v4, (INT8 *)"::");
v19 = v17 - 1;
}
++v19;
v4 += v21;
}
while( v19 < v2 );
if( v2 < 8 )
v4 += (int)sprintf_s(v4, v3 - v4, (INT8 *)":%u.%u.%u.%u");
return v4;
}Referenced by:
RtlIpv6AddressToStringExA