RtlIpv6AddressToStringA
INT8 *__stdcall RtlIpv6AddressToStringA(in6_addr *Addr, INT8 *S){
unsigned int v2;
INT8 *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;
USHORT v24;
int v25;
const char *v26;
int v27;
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] )
{
v27 = sprintf_s(
S,
0x2Eui64,
(INT8 *)"::ffff:0:%u.%u.%u.%u",
Addr->u.Byte[12],
Addr->u.Byte[13],
Addr->u.Byte[14],
Addr->u.Byte[15]);
return &v4[v27];
}
}
else
{
v24 = Addr->u.Word[5];
if( ((v24 + 1) & 0xFFFE) == 0 )
{
v25 = Addr->u.Byte[14];
v26 = &File;
if( v24 )
v26 = "ffff:";
v27 = sprintf_s(
v4,
v3 - v4,
(INT8 *)"::%hs%u.%u.%u.%u",
v26,
Addr->u.Byte[12],
Addr->u.Byte[13],
v25,
Addr->u.Byte[15]);
return &v4[v27];
}
}
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", (unsigned __int16)__ROR2__(Addr->u.Word[v19], 8));
}
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",
Addr->u.Byte[12],
Addr->u.Byte[13],
Addr->u.Byte[14],
Addr->u.Byte[15]);
return v4;
}Referenced by:
RtlIpv6AddressToStringExA